何故こんなことをしたのか?
個人的な諸事情で素早くデモンストレーション用のLINE Botを作りたかったのですが、Lineのメッセージデータを送るWebhookを手軽に設置したかったので、Pythonが動くというロリポップ!を試験的に使ってみました。
LINE公式のPython用サンプルがFlaskを使うものだったのですが、それよりももっと手軽にやりたかったので古のCGIでやっています。時間に余裕があったり、ちゃんとやりたい方はぜひ公式のサンプルを参考にしてください。
https://github.com/line/line-bot-sdk-python
手順
前準備
アカウント開設系のお話なのですでに準備できている方は飛ばしてしまって大丈夫です🙆🏻♂️
- Line Developersのアカウントを開設
- Lineのアカウントを持っていれば、すぐに開設できます。
- Line Developers内でプロバイダーを作成→チャンネルを作成
- チャンネルはMessaging APIを選択して作成
- ロリポップ!でアカウント開設
- おそらくプランはどれでも大丈夫なはずですが、僕はハイスピードプランです。
コード
最初に実際にロリポップ!で動くコードから。
(テキストエディタetc.で下記のコードをコピーしline_webhook.py
という名前で保存してください。)
#!/usr/local/bin/python3.7
import json, os, sys, cgi
if os.environ['REQUEST_METHOD'] == 'POST':
length, _ = cgi.parse_header(os.environ['CONTENT_LENGTH'])
data = sys.stdin.buffer.read(int(length))
json_str = data.decode("utf-8")
json_data = json.loads(json_str)
print ("Content-type: application/json\n")
print ("{}")
以下コードの補足
最初にロリポップ!のパスを、そのまま設定しています。
https://lolipop.jp/manual/hp/cgi/
#!/usr/local/bin/python3.7
下記では受け取ったデータをJSON形式にしています。
(json_data
がJSON形式になったもの。)
json_str = data.decode("utf-8")
json_data = json.loads(json_str)
こちらは正常に処理できたということで空のオブジェクトをWebhook側に返しています。
print ("Content-type: application/json\n")
print ("{}")
サーバー(ロリポップ!)でやること
レンタルサーバーの領域に入り、先ほどのline_webhook.py
を置き、属性(パーミッション)を755にしてください。
(ロリポップ!FTPとかで入ってline_webhook.py
を適当なところにアップロードするだけで構いません。)
LINE Developersの設定
作ったチャンネルを開き、「Messaging API設定」のタブの中の「Webhook設定」→「Webhook URL」に先ほどのline_webhook.py
を置いたURLを設定してください。
↑のような画面になると思いますので「検証」ボタンを押していただければ、Webhookを叩いている処理になります。
↓こんな画面が表示されれば成功です。🙌🏻
受け取ったデータ
検証ボタンを押した際line_webhook.py
のjson_data
は、こんなデータを受け取っています。
{"destination":"xxxxxxxxxx","events":[]}
このdestination
とevents
については↓の公式を参照してください。
https://developers.line.biz/ja/reference/messaging-api/#request-body
また、この時点で通常のメッセージetc.も受け取れる状態になっています。LINE Developersのチャンネル内の「Webhook設定」の上の方にあるボット情報のQRコードをLINEアプリで読み取って、友だち追加し、LINEからメッセージを送ると、その内容のJSONがline_webhook.py
が受け取りjson_data
から取り出せます。
ちなみに、このjson_data
を受け取り、内容に応じてMessaging APIからメッセージを送ってあげればLINEのボットになります。
参考
WebhookをPythonのCGIで受けるところは下記を参考にさせていただきました。 🙇🏻♂️