概要
再起動のたびに変わる ngrok の URL を、自動的に LINE Developers の Webhook に登録する方法です
ngrokの弱点
ラズパイでLINE BOTを作るときに、
ラズパイ上のサービスを公開するのに非常に便利なサービスが ngrok です
無料で利用できますし、アカウント登録をすると時間制限もなくなります
こんな便利な ngrok ですが、ひとつ弱点がありまして、
再起動のたびに公開URLのアドレスが変わってしまうのです
bd2b-133-106-36-148
の部分が毎回変わります
これを毎回 LINE Developers の Webhook に設定するのですが、面倒ですよね...
これを自動化します
自動化の方法
目次
- LINE の Messaging API を利用してWebhook URLを登録する
- 起動中の ngrok のURLを取得する
- スクリプトで自動化する
1. LINE の Messaging API を利用してWebhook URLを登録する
LINE Developersの公式ドキュメントです
https://developers.line.biz/ja/reference/messaging-api/#set-webhook-endpoint-url
curl
を使って以下のようすればwebhookを設定できます
CHANNEL_ACCESS_TOKEN
はLINE BOTを作るときに発行するものと同じものです
curl -X PUT \
-H 'Authorization: Bearer {CHANNEL_ACCESS_TOKEN}' \
-H 'Content-Type:application/json' \
-d '{"endpoint":"https://example.com/hoge"}' \
https://api.line.me/v2/bot/channel/webhook/endpoint
やってみます
返事が {}
だけ。シンプル...
LINE Developersでwebhookが設定されていることを確認します。
うまくいっていますね
2. 起動中の ngrok のURLを取得する
ngrokを起動するとWeb Interface http://127.0.0.1:4040
と表示されます
これが、実行中の ngrok のステータスを確認できるインターフェースになります
URLを知るには http://127.0.0.1:4040/api/tunnels
にアクセスします
以下のような json が返ってきます
(ngrokを再起動したので先ほどとURLと変わっていることがわかると思います)
jq
を使って必要な情報を取り出します
https://ac69-133-106-36-148.ngrok.io
が無事取り出せました
しかし、ここで一つ罠が
ngrokのURLはhttp
とhttps
があるのですが、
jsonでの出現順番が不定なので、.tunnels[0].public_url
だと http
が取れてきてしまうことがあるのです
ここは単純に http:
を https:
に置換することにします
Webhook設定に利用したいので、変数として保持しておきます
pi@raspberrypi:~/sidecar/mylinebot $ URL=`curl -s localhost:4040/api/tunnels | jq -r ".tunnels[0].public_url" | sed -e s/http:/https:/`
pi@raspberrypi:~/sidecar/mylinebot $ echo $URL
https://ac69-133-106-36-148.ngrok.io
3. スクリプトで自動化する
1と2を組み合わせたスクリプトをつくリます
start_ngrok.sh
という名前で保存しておくと便利です
#!/bin/sh
# configration
TOKEN={LINE の CHANNEL ACCESS TOKEN}
PORT=3000
# ngrok
nohup ./node_modules/ngrok/bin/ngrok http $PORT &
sleep 5
# ngrok URL
URL=`curl -s localhost:4040/api/tunnels | jq -r ".tunnels[0].public_url" | sed -e s/http:/https:/`
# LINE Webhook
curl -X PUT -H "Authorization: Bearer ${TOKEN}" -H 'Content-Type:application/json' -d '{"endpoint":"'"${URL}"'"}' https://api.line.me/v2/bot/channel/webhook/endpoint
echo $URL
ちなみに nohup
で起動した ngrok の止め方は以下です
$ ps aux | grep ngrok | grep -v grep | awk `{ print "kill -9", $2 }' | sh
以上です
ご参考になれば!
参考になる記事
LINE BOTを作りたい、ngrokって何?という方にはこちらの記事が参考になると思います
自分もこの記事を見ながらBOTを作りました
■ Qiita
1時間でLINE BOTを作るハンズオン
https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d
■ Qiita
LINEでラズパイさんから家の温度を教えてもらう
https://qiita.com/kohbis/items/feeb91727e1bcbd4f092
EOF