著者:結城 洋志
つぶやき投稿サイト「Twitter」に自動でつぶやくBot「Twitter bot」を、Bash
のシェルスクリプトで作ってみましょう。このTwitter botは、日経Linuxで好評
連載中の人気まんが「シス管系女子」の著者である私自身が作成し、シス管系女子宣伝用アカウントでも利用しています。
シェルスクリプトマガジン Vol.56は以下のリンク先でご購入できます。
1 2 3 4 5 6 |
MY_SCREEN_NAME=投稿に使うアカウントのスクリーンネーム MY_LANGUAGE=投稿に使うアカウントの言語 CONSUMER_KEY=カスタマキー CONSUMER_SECRET=カスタマシークレット ACCESS_TOKEN=アクセストークン ACCESS_TOKEN_SECRET=アクセストークンシークレット |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# 管理者として扱うユーザー # これらのユーザーからのDMはコマンドとして受け付ける ADMINISTRATORS="piro_or, sysadgirl_mint" # 反応キーワード # これらのキーワードへの言及を検出したら反応する WATCH_KEYWORDS='sysadgirl, system-admin-girl, シス管系女子, #シス管系女子' # 言及への応答のキューを処理する間隔 PROCESS_QUEUE_INTERVALL_MINUTES=20 # 言及への応答のキューを処理する時間帯 ACTIVE_TIME_RANGE="11:40-15:00,17:00-24:00" # 独り言をする時間帯 MONOLOGUE_ACTIVE_TIME_RANGE="00:00-00:30,06:00-24:00" # 独り言の自動投稿の間隔 MONOLOGUE_INTERVAL_MINUTES=90 # メンションに連続して返事をする最大の回数 # 延々と同じ返事ばかりを返さないようにする安全装置。 MAX_MENTIONS_IN_PERIOD=10 # 連続して返事をする最大の回数の制限を反映する時間。 # この指定の場合、120分の間に最大で10回までしか返事をしない。 MENTION_LIMIT_PERIOD_MIN=120 # いいねする基準:言及されたらいいねする FAVORITE_MENTIONS=true FAVORITE_SEARCH_RESULTS=true # RT基準:メンション以外はRTする RETWEET_MENTIONS=false RETWEET_SEARCH_RESULTS=true # 言及への言及:リプライかメンションには応答、それ以外は言及しない RESPOND_TO_MENTIONS=true RESPOND_TO_SEARCH_RESULTS=false |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/usr/bin/env bash periodical_search() { # 検索APIのポーリング用の処理 } periodical_search & periodical_fetch_direct_messages() { # DMのAPIのポーリング用の処理 } periodical_fetch_direct_messages & periodical_monologue() { # 定期的な自動発言用の処理 } periodical_monologue & (略) wait |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
(略) kill_descendants() { local target_pid=$1 local children=$(ps --no-heading --ppid $target_pid -o pid) for child in $children do kill_descendants $child done if [ $target_pid != $$ ] then kill $target_pid 2>&1 > /dev/null fi } self_pid=$$ trap 'kill_descendants $self_pid; clear_all_lock; exit 0' HUP INT QUIT KILL TERM (略) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
periodical_search() { (略) local last_id_file="$status_dir/last_search_result" local last_id='' [ -f "$last_id_file" ] && last_id="$(cat "$last_id_file")" (略) while true do debug "Processing results of REST search API (newer than $last_id)..." while read -r tweet do [ "$tweet" = '' ] && continue id="$(echo "$tweet" | jq -r .id_str)" (略) if [ $id -gt $last_id ] then last_id="$id" echo "$last_id" > "$last_id_file" fi (略) # 検索結果として得たツイートをここで処理する (略) done < <("$tools_dir/tweet.sh/tweet.sh" search \ -q "$query" \ -c "$count" \ -s "$last_id" | jq -c '.statuses[]' | tac) if [ "$last_id" != '' ] then # increment "since id" to bypass cached search results last_id="$(($last_id + 1))" echo "$last_id" > "$last_id_file" fi sleep 3m done } (略) if [ "$query" != '' ] then log "Tracking search results with the query \"$query\"..." periodical_search & periodical_process_queue & else log "No search queriy." fi |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
(略) if echo "$input" | egrep -i "good morning|おはよう|お早う|ぐっど? *もーにん|グッド? *モーニン" > /dev/null then [ "$DEBUG" != '' ] && echo "Matched to \"good morning|おはよう|お早う|ぐっど? *もーにん|グッド? *モーニン\", from \"$base_dir/./responses/おはよう.txt\"" 1>&2 extract_response "$base_dir/./responses/おはよう.txt" exit $? fi if echo "$input" | egrep -i "^(hello|hey|yo|hi)[ \.,!]|good afternoon|こんに?ちは|ハロー|はろー|ヘイ|やあ|よ[うお]" > /dev/null then [ "$DEBUG" != '' ] && echo "Matched to \"^(hello|hey|yo|hi)[ \.,!]|good afternoon|こんに?ちは|ハロー|はろー|ヘイ|やあ|よ[うお]\", from \"$base_dir/./responses/こんにちは.txt\"" 1>&2 extract_response "$base_dir/./responses/こんにちは.txt" exit $? fi (略) |