今回は開発時におけるお役立ち情報について紹介していこうと思います。特にローカルでの開発についてです。
Render のスリープ対策
Render の無料枠は15分間アクセスがないと自動でスリープしてしまい、スリープ中のアクセス時の再立ち上げにはかなり時間がかかる仕様です。再立ち上げの際に送ったメッセージはおそらく処理されずに、返信なしになってしまうでしょう。これに関しての対策は他の記事でもたくさん解説されているので詳細には書きませんが、私は UptimeRobot を使用しています。
これは定期的に HEADリクエスト(GETリクエスト同様だが、コンテンツまでは取得しない)を送って、サーバーがダウンしていないかをモニターするサービスです。このように、ダウンしている期間は赤で表示されます。
これを使い、5~10分ごとにリクエストを送ることでスリープを回避できます。前回までのコードで起動確認用のウェブサイト(Hello Worldが表示されるだけ)も作ってありましたから、Render で発行される https://xxxxxx.onrender.com
というURLをそのまま監視対象にしてしまえば良いです。
ローカル環境でのテスト準備
実際のボット開発においてはエラーとデバッグの繰り返しになりますから、コードを少し修正するたびに git push
してデプロイして...などはやっていると非常に面倒です。まずは自分のローカルPC上でテストをし、問題なければプッシュ&デプロイする方が圧倒的に楽です。
ローカル環境でのテストのために準備するものが以下の2つです。
- テスト用の LINE Developers チャネル
- ngrok
LINE Developers チャネルはいくつも作れます。私もテスト用チャネルは色々なボットで使い回ししています。
チャンネルトークンとシークレットトークンを発行したら、test.env
というファイルを作成し、.env
ファイル同様に書き込んで保存しておきます。
CHANNEL_ACCESS_TOKEN=aw...
CHANNEL_SECRET=b6...
ngrok は、ローカルの Webサーバーを外部に公開する、トンネリングツールと言われるものです。LINE Messaging API の Webhook送信先をこの ngrok で発行されたURLに設定することで、自動的にローカルPCの方に送られてくるということですね。
ngrok の登録方法、設定方法などは他記事を参考にして下さい。
設定が終わってから、ターミナルで $ ngrok http 8000
と実行してみると、このような感じで立ち上がります。一旦 Ctrl + C
で終了します。
ローカル環境での立ち上げ
では実際にローカル環境でサーバーを立ち上げ、そこでボットのテストをします。順序としては
-
app.py
内で、読み込む環境変数ファイルを切り替え - 仮想環境内でサーバー立ち上げ
- ngrok 立ち上げ
- LINE Developers のテスト用チャネルの Webhook URL の変更
となります。
1. 環境変数ファイルの切り替え
app.py
内で環境変数を読み込む際に、load_dotenv()
という関数を使いましたが、これはファイルパスを指定できます(デフォルトだと .env
)。なので、これを先ほど作成した test.env
に替えて、テスト用ボットのトークンを読み込むようにします。
from dotenv import load_dotenv
load_dotenv('test.env', override=True)
コード内にテスト用のトークンを直接書き込んで変数を上書きするという方法もありますが(というか、私も最初はそうやってました)、それだと間違って消し忘れたまま GitHub にアップして公開してしまう可能性があったりします。別ファイルにした上で .gitignore
での管理をしっかりしておけば、間違ってトークンを公開してしまう可能性はありませんし、一々コピペする手間も省けます。ただ、本番環境でload_dotenv('test.env')
の部分を消し忘れると起動しなくなりますが。
2. 仮想環境内でサーバー立ち上げ
Render での起動コマンド同様に、仮想環境内で $ gunicorn app:app
で立ち上げられますが、ここでは Flask 自体を使って
(venv) linebot $ python app.py
としましょう。app.py
の最後に app.run(host="0.0.0.0", port=8000, debug=True)
としてあれば、gunicorn
同様に8000番ポートで立ち上がり、さらにファイルを上書き保存すればその度に自動でリスタートする(デバッグモード)ので、コードの修正が非常にやりやすくなります。
3. ngrok 立ち上げ
上述のように、ローカルの8000番ポートでサーバーを立ち上げた状態で
$ ngrok http 8000
を実行すると、ngrok が立ち上がります。
この Forwarding
の https://...app
の部分が、トンネル用のURLになります。試しにこれをコピーしてブラウザのURLバーに貼り付けると、このような確認画面が出ます。
ここで Visit Site をクリックすると、起動確認用の Hello World! ページに飛べるはずです。
(2)(3) 共に、終了時はターミナルで Ctrl + C
です。
4. LINE Developers のテスト用チャネルの Webhook URL の変更
最後に、テスト用チャネルの設定画面にいき、Messaging API の項目から Webhook URL を ngrok のものにします。
ngrok は毎回URLが変わるので、立ち上げ直す度にこの部分も変更する必要があります。検証ボタンを押して「成功」と出たら、あとはテスト用のボットを使って機能チェックをします。もしエラーが生じた場合は、そのままターミナルにエラーメッセージが出力されるのでデバッグも楽です。
.gitignore
の設定
GitHub にアップする上で無視するファイルを記載しておく .gitignore
ですが、私は以下のようにしています
**.DS_Store
**__pycache__
*.env
*.ipynb
venv
.DS_Store
というのは、MacOS 専用の隠しファイルです。Finder でのファイル管理のためのものらしいです。git commit
するとこれが勝手に付いてきてしまうので、無視します。**
というワイルドカードを入れることで、サブディレクトリ以下の全てのファイルも同様に無視できます。
__pycache__
は python を実行した時にもれなく付いてくるキャッシュファイルです。jupyter notebook の場合、.ipynb_checkpoints
も生成されたりします。これらもデプロイには不要なので、無視してしまいましょう。
*.env
は必須です。本番環境用の .env
ファイルと、テスト用の test.env
の2つを作ったため、そのどちらもアップロードしないようにしています。
notebook を使って関数などの動作テストを行うこともよくあると思います。その場合に、その notebook ファイルを無視するのが *.ipynb
です。test
というディレクトリを作り、その中に notebook を作った上で、そのディレクトリ全体を無視するという方式も良いと思います。
venv
は仮想環境です。これは当然アップロード不要です。
API に直接リクエスト - Postman
Webhook の処理をコーディングする以外に、送られてくるメッセージがどのようになるのかチェックしたいことがしばしばあります。前回のクイックリプライに加え、今後使うテンプレートメッセージや Flex メッセージなどではなおさらです。また、リッチメニューの細かい設定をする時などは、わざわざ Python の SDK を使う必要性はそこまでありません。そこで役に立つのが Postman というツールです。
これは API に送るJSONリクエストを保存しておき、ボタン一つで実行できる優れものです。↓に載っている例のように、いちいちターミナルで $ curl -v -X POST ...
などと打ち込む必要はありません。
細かい使い方はこちらなどを参照して下さい。
linebot.v3.messaging
の中にある様々なクラスは .to_json()
というメソッドを完備しており、JSON出力できるようになっています。それを "messages" プロパティにそのまま貼り付けて送信する、という方法をよく使います。後の回でも紹介しますが、以下は Flex Message をプッシュ送信(任意のタイミングでメッセージ送信)するときの例です。
- 上部のAPIエンドポイントは
https://api.line.me/v2/bot/message/push
-
Auth
の項目はBearer Token
タイプを選び、チャンネルアクセストークンを入れる -
Headers
は Key をContent-Type
、Value をapplication/json
-
Body
は{"to": "<自分のUSERID>", "messages": [メッセージオブジェクトから .to_json() で出力したJSON] }
とすれば送信可能です。
ということで tips 編は終了です。次回からは、機能をさらに追加していくと共に、複雑になったコードをモジュール化して整理していきます。
目次 : [無料][2024年版] LINE Messaging API v3 + Python(Flask) でボットを作る
GitHub レポジトリ
older_version
内に、各回時点での app.py
と requirements.txt
があります。