Slackボットで状況報告

2018.04.18

秋山優花里殿がSlackでアニメ番組情報やサーバ状況,降雨状況を随時報告してくれます.

noyuno/YukariAkiyamaHubotSlack

Hubot フレームワーク上で実現されたSlackチャットボット. 秋山優花里殿がアニメ番組情報やサーバ状況,降雨状況を随時報告してくれます.

slack

1. コマンド

次のコマンドが使えます.コマンド出力の後の言葉はランダムです.

  • status: 監視しているサービスすべての状況を取得する
  • status all: 監視しているサービスすべての状況を取得して,一覧表示する
  • status SERVICE: SERVICEの状況を取得する(ただし,servicesに限る)
  • 番組表|anime list: アニメ番組の一覧を表示する.
  • 今日の番組|anime today: 今日のアニメ番組表の一覧を表示する
  • 天気|weather|forecast: 現在及び今後の降雨状況を表示する
  • こんにちは|hello|hi: 挨拶をする
  • 更新|upgradable : 更新可能なパッケージを表示する

また,自動的に以下のダイレクトメッセージが届きます

  • アニメ番組が始まる10分前から5分前までに通知
  • 10分ごとにサービス状態を確認して,activeでなければ通知
  • 10分ごとに今後の降雨状況を確認して,変化(雨が降ってきたり,雨が止んだり)があった時に通知

また,起動時に必要に応じて以下の情報を通知します.

  • サービス状態を確認して,activeでなければ通知
  • 更新可能なパッケージがあれば通知
  • 今後の降雨状況を確認して,変化(雨が降ってきたり,雨が止んだり)があった時に通知

これらは後述します.

2. インストール

Raspbian on Raspberry Pi 3でのみ動作確認

$ sudo mkdir -p /var/slack
$ sudo chown user.user $_
$ git clone https://github.com/noyuno/YukariAkiyamaHubotSlack.git $_
$ cd $_
$ bash install.sh systemd
$ bash install.sh status

3. ローカル上で実行

ローカル上で実行するには,次のコマンドを入力します.

$ bin/hubot

起動時の出力がたくさん出ますが,気にせず挨拶をしましょう.

yukari> あ、あの、普通二科、2年3組の秋山優花里といいます。えっと、不束者ですが、よろしくおねがいします!
[Thu Oct 19 2017 19:52:22 GMT+0900 (JST)] WARNING A script has tried registering a HTTP route while the HTTP server is disabled with --disabled-httpd.
[Thu Oct 19 2017 19:52:23 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379
愛知ではもうすぐ雨が降ってきます(0)..
yukari> こんにちは
こんにちは!今日の戦車は「Ⅳ号戦車D型改(F2型仕様)」
yukari> 天気を教えて
yukari> 愛知ではもうすぐ雨が降ってきます(0)..

4. 設定

4.1. サービス化

サービス化をするため,今回はSystemdを使います. slackとして登録します. なお異常終了したときは10秒後に再起動させるようにしています.

$ ./install.sh systemd

4.2. Slack

Slackと連携するには次の変数をsecret/tokenに設定する必要があります.

HUBOT_SLACK_TERM=xxxx
HUBOT_SLACK_BOTNAME=xxxx
HUBOT_SLACK_TOKEN=xoxb-1234....-abcd....

次に,script/env.coffeeUSERhttps://slack.com/api/users.list?token=xxxxに アクセスして取得し,変更します.

4.3. サーバの状況

Systemdサービスが正常に動いているかを確認します. systemctlroot権限が必要なため, 10分ごとにcronrootユーザとしてsystemctlコマンドを実行させています.

次のコマンドでbin/systemd-statusを登録します.

$ ./install.sh cron

bin/systemd-statusの出力先はout/systemd-statusで, Hubotサーバはそのファイルの変更を見て,動いていないサービスがあればチャットで知らせます.

サービスの監視はbin/systemd-statusservicesの中のサービスのみ行います. また,サービスをHubotから制御することはできません. また,サービスの確認には5分間隔で実行しているため,例えばsudo systemctl start slack をしたのに起動直後Slackがinactiveとして通知されます.

4.4. アップグレード通知

一日一回,APTを使ってシステムのパッケージに更新できるものがあるか調べます. 次のコマンドでcronに登録します.

$ ./install.sh cron

更新できるものがあれば「n個のパッケージが更新できます」と通知されます. 「upgradable」または「更新」コマンドで更新可能なパッケージを列挙します.

4.4. アニメ番組表

アニメ番組表を取得するため,しょぼいカレンダーに登録します. JSONファイルのURLsrc

src='http://cal.syoboi.jp/rss2.php?usr='$USER'&filter=0&count=1000&days=14&titlefmt=%24(StTime)%01%24(Mark)%24(MarkW)%01%24(ShortTitle)%01%24(SubTitleB)%01%24(ChName)&alt=json'

ですが,そのままでは大量の見ない番組が含まれています. そのため,自分の場合は,あるキーワードが含まれている番組を抜き出してJSONを作りなおしています.

anime-jsonanime-json-extract のスクリプトとキーワードファイルを使用して,JSONファイルを再作成しました.

最後にJSONファイルの場所を script/env.coffeeANIMEFILEに設定します.

4.5. 降雨状況

降雨状況を問い合わせたり,ある場所の降雨の変化 (もうすぐ雨が降ってきたり,雨が止んだり)があった時に通知することができます.

YOLPを使ってますので,新しいアプリケーションを開発 で「クライアントサイド(Yahoo! ID連携v1)」を選び登録します. 発行されたアプリケーションIDをsecret/tokenYAHOO_APPID=abc..の形式で設定します.

次に,script/env.coffeeCOORDINATESに次の形式で座標を設定します.

@COORDINATES: {\
    "愛知": "137.123456,34.123456"
}

4.6 Shell on Slack

sh COMMAND [ARGS...]でSlackからサーバシェルにコマンドを送信できます. デフォルトで無効なので,有効にするにはscripts/env.coffeeENABLE_SHELLtrueにします. セキュリティに充分注意する必要があります. ENABLE_SHELLfalseでもuptimeコマンドは使えます.