ngrok と Python で 単に webhook を受け取ってみる


tl;dr

  • botの作成などに webhookにより送られてくるtoken が必要な場合がある
  • webhook には外部に公開するサーバーが必要であるが、極力かんたんに webhook を受け取ってみる
  • 単に listen するだけでなく、 200 OK を返すだけのサーバーなどは Python を使えば簡単に作ることができた

題材

  • LINE の Messaging API の Webhook を題材にします。
  • これは、JSON形式のデータが POST で送信されます。
  • 今回は LINE 側へ Webhook が受信できると申告できるよう 200 OK を返します。

流れ

  1. Python で 何を受けても 200 OK を返すようなサーバーを作る
  2. ngrok で 外部からのアクセスを受け取れる環境を作る
  3. ngrok に付属している Inspectツールで 受け取った Webhookの中身を見てみる

Python で 何を受けても 200 OK を返すようなサーバーを作る

  • GETやPOSTに応じて振る舞いを変更したいので、 http.server の BaseHTTPRequestHandler を使います。

  • 今回は 80 port で listen し, POST を受け取ったら とりあえず 200 OK だけを返すようにします。


import http.server
import socketserver
import json

class MyHandler(http.server.BaseHTTPRequestHandler):
    def do_POST(self):
        self.send_response(200)
        self.end_headers()

with socketserver.TCPServer(("", 80), MyHandler) as httpd:
    httpd.serve_forever()
  • 作成したら実行しておいてください。 serving at port 80 と表示されていればOKです。

ngrok で 外部からのアクセスを受け取れる環境を作る

Guide
  • コマンドプロンプトで authtoken の登録や http tunnel の起動をしても良いですが、batファイルを使っても便利です。
    • ダウンロードした zip を展開すると ngrok.exe があります。
    • 同じ場所に 以下のような内容の ファイルを作成します。
auth.bat
ngrok authtoken 1UFVG5sdtzGXXXXXXXXX
80listen.bat
ngrok http 80
  • それぞれ ダブルクリックで実行してください。
    • auth.bat は一瞬で閉じます。
    • 80listen.bat は 以下のようになるはずです。
ngrok
  • このウインドウで表示されている Forwarding 欄の ngrok.io で終わるアドレスが、あなたのアドレスです。

ngrok に付属している Inspectツールで 受け取った Webhookの中身を見てみる

  • 試しに 外部からこの ngrok.io のアドレスへ POSTすると
  • ngrok の画面 では / へ POST が来たことが表示され
ngrok
inspect画面例