#何をやったか
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先として使用
#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
#動作中の画面
最後でヘソを曲げてますが答えてくれてます。
平常運転なせいでいまひとつ返しが物足りないですよね。
#今後の展望
スクレイピングでデータを取ってこれることはできたので
今度は対応路線を増やしたいところ。
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