LoginSignup
5
1

More than 1 year has passed since last update.

ngrokのURLが変わったときに自動的にLINEのwebhookを更新する

Last updated at Posted at 2023-03-06

概要

再起動のたびに変わる ngrok の URL を、自動的に LINE Developers の Webhook に登録する方法です

ngrokの弱点

ラズパイでLINE BOTを作るときに、
ラズパイ上のサービスを公開するのに非常に便利なサービスが ngrok です
無料で利用できますし、アカウント登録をすると時間制限もなくなります

こんな便利な ngrok ですが、ひとつ弱点がありまして、
再起動のたびに公開URLのアドレスが変わってしまうのです
image.png
bd2b-133-106-36-148 の部分が毎回変わります
これを毎回 LINE Developers の Webhook に設定するのですが、面倒ですよね...
image.png
これを自動化します

自動化の方法

目次

  1. LINE の Messaging API を利用してWebhook URLを登録する
  2. 起動中の ngrok のURLを取得する
  3. スクリプトで自動化する

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

やってみます
image.png
返事が {} だけ。シンプル...
LINE Developersでwebhookが設定されていることを確認します。
うまくいっていますね
image.png

2. 起動中の ngrok のURLを取得する

ngrokを起動するとWeb Interface http://127.0.0.1:4040と表示されます
これが、実行中の ngrok のステータスを確認できるインターフェースになります
image.png
URLを知るには http://127.0.0.1:4040/api/tunnels にアクセスします
以下のような json が返ってきます
image.png
(ngrokを再起動したので先ほどとURLと変わっていることがわかると思います)

jqを使って必要な情報を取り出します
image.png
https://ac69-133-106-36-148.ngrok.ioが無事取り出せました

しかし、ここで一つ罠が
ngrokのURLはhttphttpsがあるのですが、
jsonでの出現順番が不定なので、.tunnels[0].public_url だと http が取れてきてしまうことがあるのです

ここは単純に http:https: に置換することにします
image.png
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

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1