毎週金曜の朝、関東のホットなイベントを通知してくれるLINE Bot 「ムハモール」作ってみた
友達登録は上のQRコードから!
作ってみた、とは言ったものの、大部分は↓の記事の流用です。
「関東で開催されている何か催し物を定期的に通知してくれるやーつ欲しい...」と思ってググったところ、良い感じの催し物をまとめてるサイトはウォーカープラスが良い感じ
だけんども、RSSは無い0(:3 )~ =͟͟͞͞('、3)_ヽ)_
ならば、スクレイピング...!
誰かやってる人いるだろう、と思ってQiitaを探ったところ↑の記事にたどり着きました。
しかし、
この記事のBotだと自分が能動的にテキストを送らねばならず、
「勝手に通知が来て欲しい...!」という気持ちが解消されない...
ということで「ムハモール」が誕生しました。
やっていることはHerokuのSchedulerからウォーカープラスの関東のイベント一覧をスクレイピングして、良い感じにLINEに通知する、のみです。
この投稿ではムハモールが生まれるまでの過程をまとめようと思います。
LINE DeveloperでBot作成とHerokuで新規アプリ作成
これは説明してくれてる記事がたくさんあるので、それ通りにやって問題なく完了。
linebot_libなるものを利用する
冒頭で紹介した記事にあるこのリポジトリ、よく見たらvendorフォルダがpushされています(ノ゚ρ゚)ノ
このリポジトリを紹介しているQiitaにも、
こちらのライブラリは公式sdkに色々追加したものを使っているのでlineのsdkでは動作しません
Flexまわりなど特にsdkにオリジナルで追加したので公式の最新では動きません
とあり、そういう系かーと萎えたのですが、すぐ動かしたかったので目を瞑り利用。
アクセスキーとチャンネルシークレットについて、記事にはありませんでしたが、Herokuのconfig vars使ってphpから呼ぶときはgetenv()で呼ぶように修正。
LINE Developer側の設定
Webhook送信を利用。Webhook URLを設定。自動応答メッセージ利用しない。友だち追加時あいさつ変更等粛々と。
ここまでで、実際にムハモールで動作確認ができるようになりちょっとテンションが上がります。
本題の自動通知設定
この記事のおかげでmessaging-apiのブロードキャストメッセージを送る(友達登録者全員にメッセージ送信)、というのが自分のやりたいことだというのが分かった+動作確認も出来たのですが、linebot_libではブロードキャスト用のメソッドがないことが判明。
こうなったらしょうがないということで、linebot.phpに新しくメソッドを生やし、vendor/linecorp/line-bot-sdk/src/LINEBot.phpにもブロードキャストメッセージを送るapiを叩くメソッドを生やしました。(↓のapi仕様見つつ
冒頭記事内にあるウォーカープラスをスクレイピングするコードのプッシュメッセージへの流用は特にハマることなく完了。
HerokuのAdd onのスケジューラを追加して、プッシュメッセージを送ってみる
毎週、という設定が無いので↓の記事を参考にスケジューラと実行したいコマンドを設定
設定したやつ。要考慮UTC
if [ "$(date +%u)" = 4 ]; then php broadcast.php; fi
Undefined index: HTTP_X_LINE_SIGNATUREにハマる
あんれーと調べるうちに、応答形式の場合と違ってプッシュメッセージの場合はLINEのwebhook経由ではないので、HTTPHeader::LINE_SIGNATUREは取得出来ないということが判明。linebot_libが親切にもコンストラクタの引数によって該当箇所を通すかどうかが決まる仕様だったので、プッシュメッセージの場合にnewする時の引数を修正して解決。
これで無事に求めていたムハモールが誕生しました。
今回のコードは↓のリポジトリにあります。
ムハモールがやれること
- 毎週金曜の朝のイベント通知
- 任意の文字をムハモールに送信するとエリア選択を迫られる。選択するとそのエリアのイベントを送信してくれる。(元記事の機能はそのまま残ってる形)
まとめ
初めてLINE Bot触ってみましたが、他にも面白いこと色々できそうだな~というワクワク感がありました。
今回のムハモールに関しては、ウォーカープラスのサイトレイアウト変わったら死ぬ、LINEのmessaging-apiの仕様が変わったら死ぬ、という儚い存在ですが、出来る限りメンテナンスして人生を共にしていこうと思います。
おまけ: ムハモールの名前の由来
ムハモールはМухоморというロシア語で、日本語だとテングタケ。
ロシア留学中によく使ってたコップがたまたまムハモールで、たまたま最近写真が発掘されたのでなんとなくBotの名前にしました。
良い笑顔。