散々こすられてるネタではありますが、ネット上の古い情報に惑わされてオウム返しbotで半日つぶれたので、恨み 反省を込めてメモしておきます。
環境
- Mac OS Catalina 10.15.5
- Python 3.7.7
- Heroku
アカウント作成〜Herokuへデプロイ
まず、以下の工程を行いました。
- LINE Developersアカウントの作成
- botアプリの実装(Python)
- Herokuのセットアップ、デプロイ
具体的な手順やコード等に関しては、「LINE bot Python」などで検索すると出てくるqiitaの記事やブログ記事などを参考にしました。
参考にした中では以下のブログ記事がわかりやすくまとまっていましたので、ここでは詳しい手順の紹介は割愛します。
LINE Messaging API + Python + Heroku でLINE Botを作る
が、後述するとおり、最新の仕様では「Fixie」の設定が不要ですので、注意してください。
(このブログ記事に限らず、検索で上位に来る記事では未だにFixieの設定が必須のように書いているものが散見される印象です。。。)
……さて、このとおり実装してbotに話しかけてみたものの、オウム返ししてくれません。
チェックポイント1:WebhookのVerifyボタンで出る500エラー対策
LINE Developers管理画面でWebhookURLのVerifyボタンを押して確認したところ、"The webhook returned an HTTP status code other than 200" というエラー表示が出てきました。
`heroku logs -t`でログを確認。main.py(botアプリ)は動いており、500エラーが返ってきているようでした。これはVerifyボタンで送られるreplyTokenを有効なreplyTokenではないと判断しているようです。参考記事は以下。LINE DevelopersのWebhook URLの接続確認でエラーが出る件について
この記事を参考にコードを追記したところ、Verifyボタンからのリクエストは通るようになりました。
チェックポイント2:Use Webhookをオンにしよう
しかし、スマホで「あ」とか「テスト」とか送っても一向にログが動きません。
……いや凡ミスすぎない?という感じなんですが、Use Webhookがオフになっていました。
オンにしたところ、リクエストは送られるようになりました。
チェックポイント3:最新の仕様ではIPアドレスの指定は不要
しかし、このIPアドレスでは接続できないよ!というエラーが出てしまいます。詳しくは後述の「補足」で書きますが、Fixieの設定に失敗していたため、エラーが起きていました。
HerokuでLINEbotを作るときには何はともあれFixieを設定!と書いてある記事が山のように出てきますが、以下の公式FAQにもあるように、最新の仕様ではIPアドレスの指定は不要です。なので、そもそもFixieを使う必要はありません。
LINE BOT & Beacon 開発者向けFAQ(随時更新)
Server IP Whitelist は登録しないといけないの?
登録する必要はありません。
制限をかけたい場合は、登録すれば良いです。
逆に指定するとそのIPだけしかアクセスできなくなりますので、エラーが出ている場合には、間違ったIPアドレスがこのリストに入っていないか確認しましょう。
チェックポイント3について補足
FixieのアウトバウンドIPをリストに入れていても、そこから正しく接続できていれば当然問題ないです。
私の場合、Fixieの設定をしたにも関わらず、固定IPからリクエストを送信できておらず、エラーログを見ると
"message": "Access to this API denied due to the following reason: Your ip address [*.**.***.***] is not allowed to access this API. Please add your IP to the IP whitelist in the developer center."
のエラーが出ていました([...***]部分はアプリを再起動するたびに変わってしまう)。
おそらく、botのアプリ本体のコードにプロキシを使うための記述を入れていなかったためかと思います。
以下、PHPの場合ですが参考記事です。Pythonでも恐らくこれに相当する記述の仕方があるのだと思いますが、今回は深入りしません。。。
【50:LINE BOT API】PHP+HerokuでオウムBOT
PHP側でproxyを経由するという記述が抜けていました。
Fixieで作られたproxyのURLをcurl_setoptで設定したら正常に動作しました。
余談
デフォルトで出てくる「メッセージありがとうございます!申し訳ありませんが、このアカウントでは個別のお問い合わせを受け付けておりません。次の配信までお待ちください」メッセージは、LINE Official Account Manager の応答設定>詳細設定>応答メッセージ で適宜オフにするなりしておく必要がある(最初エラーのせいで出てきてるのかと思ってた。。。)。