開発の経緯
以前から挑戦しようと思っていたのですが、公式のドキュメンテーションが初学者である自分にとってすこし理解しづらく、なかなかやる気になれませんでした。しかしちょっとしたインターンの課題で簡単なLINE Botを作ったのをきっかけにやる気が再燃し、前にDiscordのHack Week向けに作ったBotをLINEでも作ることにしました。
環境
- Python 3.7.4
- Flask 1.1.1
- line-bot-sdk-python 1.14.0
- requests 2.22.0
- 最終的に外部でホストできるようにHeroku
- ローカルでBotのテストができるようにngrok
その他必要なもの
- ローカルでBotのテストができるようにngrok
- LINE Developers Consoleで取得できる個別のトークンとシークレットコード。
- NewsAPIを使用しているため、NewsAPIのAPIキー
- OpenWeatherMapのAPIキー
構造
-
main.py
:入力内容に反応し、メッセージを返信する。 -
newsFetcher.py
:NewsAPIからヘッドラインのJSONを取得し、LINEのカルーセルに表示できるようヘッドラインの個数を10個までに減らす。 -
weatherFetcher.py
:OpenWeatherMapから3時間ごとの天気をJSONで取得し、LINEのカルーセルに表示できるよう天気情報を10個に絞る。
コード
GitHubに載せてあるのでご自由にどうぞ。(ほとんど英語表記になっています、ご了承ください)
引っかかった点など
- カルーセルの個数・文字数制限:LINEのカルーセルはボックスを最大で10個までしか表示することができません。その上、各ボックスに含まれるタイトルや説明欄の文字数が今回の記載予定の内容にとっては厳しく、表示させる内容をどうするかかなり悩みました。
-
replyToken
が発行されるタイミング:Invalid reply token
のエラーに何度出くわしたことか。ドキュメンテーションをしっかりと読むべし。 -
newsFetcher.py
とweatherFetcher.py
で取得するJSONのトリミング:上記で説明したカルーセルの制限に対応すべく、あらかじめJSONデータの要素を減らす必要がありました。これは最早ループがちゃんと使えるかの問題だったのですが、条件などを正しく設定するのにかなり時間を費やしました。
リザルト
"Informant"と入力し送信すると、Bot側から「ニュース」か「天気」の選択肢がQuickMenu形式で与えられます。ニュースを選ぶと日本の主なヘッドラインを10個、天気を選ぶと位置情報を送るよう促され3時間毎の天気を10個表示してくれます。(2枚目のサムネイルが表示されていませんが、ちゃんとお天気のアイコンが表示されます。)
改善したい点
はっきり言ってたくさんありますが主にこれらを優先したいです(笑)。
- ニュースのバリエーションを増やしたい:NewsAPIは単にヘッドラインをJSONで返してくれるだけでなく、ソース別やトピック別などにニュース情報を提供してくれる本来はなかなか情報豊富なAPIです。今回は表示の簡素化を優先し、日本の主要トピックに限定しましたが、今後はさらにQuickMenuなどを活用してニュースの対象地域やトピックを選択してニュースを表示させることができるようにしたいと思います。(JSON取得は難しくないがカルーセル以外の表示方法でないとエラーに対処できない)
- 天気情報の時間が世界標準時になっている:文字通りです。理想は位置情報などから時間帯を判別し、それを天気に表示させたいと思います。
- 時間を指定してニュースや天気情報をプッシュ送信できるようにしたい:これは自分にとってハードルが一気に高くなりますが、できるようになれば利用価値がかなり上がるんじゃないかと思っています。
## テストしたい方
よろしければ以下のQRコードから友達登録して使ってみてください(英語表記です、ご了承ください)。Herokuの無料Tierでホスティングしているためスリープ状態になっている場合があります。その場合は応答に少し時間がかかるのでお待ちください。