2019-05-17

Amazon Chime に電車の運行情報を自動送信する方法

PythonのライブラリとAmazon chimeに備え付けのWebhooks等を使って電車の運行情報を定期的に自動送信するコードや設定を施していきます。




処理の概要



 使用するライブラリはrequest, beautifulsoup4(bs4), json, datetimeの4種類です。requestでWebとの通信をし、bs4とjsonでデータの整形をしてChimeで設定したWebhookに情報を投げ込みWeb上にある運行情報をまとめて見られるようにします。datetimeは、chimeで日時の確認をしにくいのでメッセージ上に処理した日時を表示させるために使います。  その他、Windows上でpythonを自動で実行させるためにタスクスケジューラを使用します。タスクスケジューラで上のコードを自動で実行することで、実行時点の運行情報をChimeで閲覧することができます。

Amazon Chime 上での手順




https://funasaki.hatenablog.com/entry/2018/12/06/205557


手順は大まかにfunasaki氏が記載した手順のとおりです。重複する内容であるため手早く箇条書きにします。
- Chimeアプリ上で「File」→「New Chat Room」を選択する
- Nameを記入してCreateをクリック(例:Get Traffic)
- Chime Room右上にある設定ボタンから「Manage Webhook」を選択
- 「New」を選択してwebhook名を記入してcreateを選択(例:Get Traffic)
- Copy Webhook URLを選択してURLを記録する

コードの書き換え



 書き換え箇所は2つあります。①上の手順で記録したURLの登録と、②路線の登録の2つです。   まず1つめに、関数postChime(JSON)のbaseURLとtokenを上の手順で記録したURLに置き換えてください。長く鳴りすぎているので分割していますが、見づらいと感じるようでしたら1行書きにしても全く問題はありません。  2つめに路線の登録をします。情報の引用元としてヤフー路線情報を使用します。ヤフー路線情報から各路線の個別ページにアクセスしてURLをコピーしてください。コピーした後に、60行目の路線登録の箇所にある辞書trainの中に”路線名”: “URL”の形式で入力してください。URLにはコピーしたURLを貼り付けます。複数の路線がある場合にはURLの後にカンマを入れて区切ります。路線名は自身でわかれば日本語でも問題ありません。修正後、プログラムを走らせてChimeで路線情報を受信できたらOKです。

タスクスケジューラーの設定



 コードを書き換えて路線情報がChimeに送信することができたら、送信の自動化をします。Windowsの場合にはタスクスケジューラを使うと時間ベースのトリガーを簡単に設定できます。  まず、Winキーを押してタスクスケジューラと入力してアプリを呼び出します。開いたウィンドウの左側にあるタスクスケジューラライブラリ上で右クリックして新しいフォルダーを選びます。自身でわかる名前を入力してOKをしたらタスクスケジューラライブラリをダブルクリックして、作成したフォルダーをクリックします。  画面中央の白い枠の中で右クリックして、新しいタスクの作成を選びます。タスクの名前はgetTrafficなどわかる名前にして、説明にはChimeに交通情報を送るなど適当に書きます。  トリガータブをクリックして新規のトリガーを作成します。トリガーを作ることで特定の条件により自動でアプリを起動させるなどの処理ができます。設定でトリガーの発生頻度を選びます。平日に使うことを想定して毎週を選び、平日の曜日にチェックを入れます。開始には適当に使いはじめる日付を入力して、起動させたい時間を入力します。詳細設定は有効以外はチェックを外しておきます。必要があれば繰り返しなど使っても良いと思います。完了したらOKを押します。

 次に起動させるファイルの設定です。操作タブを選び、新規ボタンをクリックします。参照をクリックしてpython.exeを選びます。引数の追加には上記コードのファイル名(xxx.py)を入力して、開始にはxxx.pyがあるディレクトリのパスを入力します。ディレクトリのパスの末尾には(¥)を入力しておいてください。入力が完了したらOKを押して、タスクの作成ウィンドウのOKボタンも押したら定期実行の準備が終わります。上手く動作しない場合には、全般・条件・設定タブの設定を確認してください。

コードの解説など



 Pythonの基礎レベルができれば特に難しいコードでもなく初心者向けであると思います。スクレイピングやHTTP POSTなど使っていますが使ったことがない方は入門にちょうど良いかもしれません。関数postChimeとともに、関数createJsonのsendJsonの部分を書き換えれば例えばLineやSlackに自動送信させることもできるかと思います。  Amazon chimeはContentでメッセージを送るのが主な用途で、現時点ではファイルの添付に対応していないようです。クラウドドライブと連携すればURLでファイルを送ることもできますが、GoogleAppScriptと比べてしまうと不便に感じる面も多い気がします。  スクレイピングについてはseleniumだけでURLからHTMLを取得してデータを入手することもできますが、requests + bs4だとコードがスッキリまとまり早く情報取得できるので今回はrequests + bs4を使っています。HTTP POSTの処理にrequestsを使うのが都合が良いのも理由の1つです。  seleniumはブラウザに合わせてDriverを用意する必要があり、動作する状態になってもページの読み込みに時間がかかったり、コードが横長に鳴りやすかったりなど手軽に使いにくい面もあります。Javascriptで動くページやAlertの処理などrequestsでは厳しい操作もできるのでそれぞれ一長一短だと思いますが手軽に早く動かす分にはreqests + bs4が良いような気がします。  その他、postChimeの返り値にレスポンスを設定してあります。仕様変更等で自動送信が上手く行かなくなった場合には、7行目のAMAZON CHIME DOCの右にあるURLのWebhook エラーを参照しつつ、返り値をPrintして動作確認するとエラーの原因が特定しやすいのではないかと思われます。