電車の遅延状況を報告してくれるSlack Botを作った

こんにちは、おてらです。

ヒマだったのでBot作りました。

スポンサーリンク

事の発端

僕はいつもオレンジ色、もしくは黄色の電車を利用しているんですが、やはりこの路線は朝の通勤ラッシュの時間帯は遅延が多い。

普通に出ても駅に着くと案の定遅延していて遅刻遅刻ー!というシーンがよくあります。

なので朝起きたとき、家を出るちょっと前、会社を出る前の3回のタイミングでSlackにその時点での遅延状況を報告してくれるBotを作りました。

構成

いつもの通り、AWS Lambda と AWS CloudWatch と Slack の Incoming Webhooks を利用したサーバレス構成です。

毎度毎度同じ構成で進歩がない。

できたもの

GitHubに置きました。

コード単体では当然動かないので AWS と Slack の連携についてまとめていきます。

Slackの準備

Slack のカスタムインテグレーションから Incoming Webhooks を追加します。

https://{your-team-name}.slack.com/apps/manage/custom-integrations

設定はこれだけです。

AWS の準備

Lambda 関数を作る

Python3.6 で Lambda 関数を作ります。

今回作ったソースでは requests ライブラリを利用しているので本体のコードとまとめて Zip 化してアップロードする必要があります。

Python の virtualenv を利用して仮想環境を作った場合、「venv_name\Lib\site-packages」内のファイル群と本体のコードをまとめます。

私の場合、以下のように site-package 内に本体のコード(lambda_function.py)を配置し、Ctrl + A で全選択して圧縮ソフトに突っ込んでZip化しました。

Lambda 全体の設定はこんな感じ。

LINES でカンマ区切りで路線を複数指定しています。

ここに指定する路線名は遅延情報を提供してくれている以下のサイトの表記に準じています。

これはリスト形式で取得されることを期待したのですが、

LINES = os.environ['LINES']

とすると、

'中央・総武各駅停車,中央線快速電車,大江戸線,京王線,西武新宿線'

という文字列で取得されてしまうので、split()を使ってリスト化しています。

LINES = os.environ['LINES'].split(',')

WEBHOOK_URL は先ほど Slack で Incoming Webhooks を作ったときに生成されたものを登録します。URLは再生成可能です。

ちなみに私はこのURLを間違って GitHub にコミットしてしまったので再生成しました…w(コミットログを見ればURL丸見えですがもう使えないURLです。)

この状態で Lambda のテストケースを作成し、そのままテストを実行すると(Lambda に引き渡すデータは必要ないのでテストケースの中身はデフォルトのままでいい)Slack に結果が投稿されます。

問題なく動作が確認できれば Lambda の準備はOKです。

CloudWatch の設定

最後に定期的に実行させるために CloudWatch のイベント機能を使います。いわゆる cron です。

イベントソースに Cron 式を選択し、実行させたい時間と曜日を設定します。

平日の7:00、8:00、18:00にそれぞれ実行させたいので以下のように設定しています。
注意事項としては CloudWatch の実行タイミングは UTC なので JST で実行させるために日本時間から -9時間した時刻を設定しています。
よって、日本時間の7:00と8:00に実行させるにはUTCで前の曜日の22:00と23:00になるため、曜日の扱いにも注意が必要です。

ターゲットには作成した Lambda 関数を選択します。

あとはイベントに名前をつけ、説明を書いて完了です。

 

実行結果

試験的にお昼の12:00に投稿されるように設定したら上手く動きました。

このタイミングでは中央線、総武線、大江戸線、京王線、西武新宿線に遅延はなかったようですね。

では実際に遅延があった路線を環境変数の LINES に加えて実行してみるとどうでしょうか。

JR西日本の呉線は平成30年7月豪雨の影響で現在も一部区間で運休(2018年12月15日に全線運転再開予定)しているため、常時遅延という結果が返ってきているようなのでこれを使ってみます。

ちゃんと遅延している路線の情報として投稿してくれました。秒までの表記はいらないかな、と思った。

 

という訳で定期的に路線の遅延情報を Slack に通知してくれる Bot の製作記録でした。

Slack の Bot 作りは簡単だし Python が書ければ Lambda ですぐ実行・連携できるので Python や Lambda の練習にはもってこいだと思います。

ではー。

フォローする

スポンサーリンク