LoginSignup
16
4

More than 1 year has passed since last update.

ロリポップ!に置いたPythonのCGIでLINE Messaging APIのWebhookを受ける

Last updated at Posted at 2022-06-13

何故こんなことをしたのか?

個人的な諸事情で素早くデモンストレーション用のLINE Botを作りたかったのですが、Lineのメッセージデータを送るWebhookを手軽に設置したかったので、Pythonが動くというロリポップ!を試験的に使ってみました。

LINE公式のPython用サンプルがFlaskを使うものだったのですが、それよりももっと手軽にやりたかったので古のCGIでやっています。時間に余裕があったり、ちゃんとやりたい方はぜひ公式のサンプルを参考にしてください。
https://github.com/line/line-bot-sdk-python

手順

前準備

アカウント開設系のお話なのですでに準備できている方は飛ばしてしまって大丈夫です🙆🏻‍♂️

  1. Line Developersのアカウントを開設
  2. Line Developers内でプロバイダーを作成→チャンネルを作成
    • チャンネルはMessaging APIを選択して作成
  3. ロリポップ!でアカウント開設
    • おそらくプランはどれでも大丈夫なはずですが、僕はハイスピードプランです。

コード

最初に実際にロリポップ!で動くコードから。
(テキストエディタetc.で下記のコードをコピーしline_webhook.pyという名前で保存してください。)

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を設定してください。
スクリーンショット 2022-06-13 17.01.40.png
↑のような画面になると思いますので「検証」ボタンを押していただければ、Webhookを叩いている処理になります。
↓こんな画面が表示されれば成功です。🙌🏻
スクリーンショット 2022-06-13 17.02.54.png

受け取ったデータ

検証ボタンを押した際line_webhook.pyjson_dataは、こんなデータを受け取っています。

{"destination":"xxxxxxxxxx","events":[]}

このdestinationeventsについては↓の公式を参照してください。
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で受けるところは下記を参考にさせていただきました。 🙇🏻‍♂️

16
4
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
16
4