python+Dialogflowで東京メトロの運行情報を返すLINE botを作る。

#何をやったか
python+Webスクレイピング＋Dialogflowの勉強かねて
yahoo運行状況からスクレイピングして東京メトロの運行状況を返すLINE botを作ってみたよ
路線をEntity登録したので一応conversation系のフレームワーク使ったってことで（適当)

#botの構成
全体図はこんな感じ
heroku上にpython+Flaskでスクレイピングした情報をJSONで返すAPIを構築
DialogflowでLINEからの質問を分類しつつWebhookでAPIを叩いて返す仕組み
BeautifulSoupでYahoo運行情報からスクレイピング
全くまとまってないので箇条書きにする

- LINE：ユーザーへのテキストの表示と質問の受付
- DialogFlow：質問の分類（とは言っても今回はあんまり使ってない）
- python
    - BeautifulSoup：Yahoo運行情報からスクレイピング
    - Flask：API要員、Dialogflowからのリクエストを受けてJSONを返す
- heroku：APIの展開先、Dialogflowのwebhook先として使用

![スクリーンショット 2018-02-18 4.53.28.png](https://qiita-image-store.s3.amazonaws.com/0/28630/0a761282-7d59-034b-4033-c9e5cdab4659.png)

#Dialogflowについて
IBMのWatson Conversationライクなフレームワーク（だったはず）
いろんなアプリと簡単に連携できるので便利

今回はIntentとEntityの作りとして以下のように作ってみた。
ここら辺は作り次第で精度がだいぶ変わりそうな印象。
あとIntentに登録する質問データ作成がクッソめんどくさい

- Intent：ユーザーからの質問「〇〇線の状況は？」
- Entity：各路線の同義語リストとして活用、今回は路線名をsynonymとしてEntityに全部突っ込む
    - 例）JR東日本（総武線、山手線）、東京メトロ（新宿線、日比谷線）

実装その他諸々は以下の記事を参考にさせてもらいました。
全体が網羅されてるので非常に分かりやすかったです。ありがとうございました。
Dialogflow入門 @kenz_firespeed
https://qiita.com/kenz_firespeed/items/0979ceb05e4e3299f313



ハマりポイントとしては

- dialogflowに返すJSONは必ず"speech"と"displayText"の2つのキーに値をセットする。
    - これのせいで1時間くらい詰まった。。。
- 連携に必要なパラメータはしっかり確認する。
- webhookはPOSTでリクエストを送るので受け側のAPIもメソッドを合わせる、
    - お気楽にcurlでGETするためにGETで受ける仕組みのままherokuに展開するミス。。。

あたりかなぁと

#Flaskについて
python用のWebアプリケーションフレームワークだよ。
jsonifyを使ってレスポンスのJSONを自動生成する仕組みを使ってAPIを構築したよ

#BeautifulSoupについて
XML解析ライブラリだったっけ？
今回はYahoo運行情報から情報を抜いてくるだけに使ってる。
urllibでurlopenしたものをreadしてBeautifulSoupにかけて
find_all、findでタグを指定して引っ張るだけ
python3なら特に日本語を考慮しなくていいので便利

こちらの方の投稿が非常に参考になりました。感謝
PythonとBeautiful Soupでスクレイピング @itkr 
https://qiita.com/itkr/items/513318a9b5b92bd56185

#動作中の画面
最後でヘソを曲げてますが答えてくれてます。
平常運転なせいでいまひとつ返しが物足りないですよね。
<img width="320" alt="S__13688882.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/28630/0383cf1d-e289-a19e-7e81-6c074c6b89ce.jpeg">

#今後の展望
スクレイピングでデータを取ってこれることはできたので
今度は対応路線を増やしたいところ。
python側でJSONを受け取れてない問題があるのでそれを解決してからかなぁ

#参考
##python+Flaskの環境構築周り
Flaskの簡単な使い方 @zaburo 
https://qiita.com/zaburo/items/5091041a5afb2a7dffc8
ウェブアプリケーションフレームワーク Flask を使ってみる @ynakayama 
https://qiita.com/ynakayama/items/2cc0b1d3cf1a2da612e4
Flask + Hamlish で Hello World @elm200 
https://qiita.com/elm200/items/2d0fd1f734dd439b56f8
Jinja2の使い方がわかるとFlaskを用いた開発がよりスマートになる @ryo2851 
https://qiita.com/ryo2851/items/7ae5de21307d101b4759

## python+FlaskでAPI開発にあたっての参考
CUBE SUGAR STORAGE「Python の Flask で REST API を作ってみる」
http://momijiame.tumblr.com/post/39378516046/python-%E3%81%AE-flask-%E3%81%A7-rest-api-%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B
datalove’s diary「FlaskでRestful APIを作る-jsonifyで日本語が文字化けする時の解決方法」
http://datalove.hatenadiary.jp/entry/flask-jsonify-how-to-encode-japanese

##Beautiful soup周り（すごく助かった）
PythonとBeautiful Soupでスクレイピング @itkr 
https://qiita.com/itkr/items/513318a9b5b92bd56185

##Dialogflow周り
Dialogflow入門 @kenz_firespeed 
https://qiita.com/kenz_firespeed/items/0979ceb05e4e3299f313

##herokuへのデプロイ
heroku で python 動かすチュートリアルをやったメモ @cfiken 
https://qiita.com/cfiken/items/0715bb945389bc9ca682
暗号通貨.py「初心者がHerokuでハマったポイント」
http://kasoutuuka.org/heroku-hello

##pythonのその他諸々
pythonの正規表現をエミュレートしてくれる。超便利
https://regex101.com/
UXMILK「Pythonの正規表現の基本的な使い方」
http://uxmilk.jp/41416
LIFE WITH PYTHON「Python Tips：リストから重複した要素を削除したい」
https://www.lifewithpython.com/2013/11/python-remove-duplicates-from-lists.html

##botとの連携
dorapon2000’s diary「Microsoft Bot Frameworkを使ってSkypeボットを作る」
http://dorapon2000.hatenablog.com/entry/2016/09/04/031821