はじめに
こんにちは!アベンドカレンダー13日目担当です。
趣味でLINEチャットbotを開発していましたが、一番難しかったのがコードを変更せず、本番用botとテスト用bot両方を使える環境を構築することでした。手探りに時間はかかりましたが、構築自体はすごく簡単なものだったのでこの記事で共有します。
手順
- ngrokインストール
- LINEデベロッパーコンソールで本番用、テスト用bot作成, トークン発行
- herokuなどのデプロイプラットフォームで 環境変数登録
- コード修正
- 実行
1. ngrokインストール
2. LINEデベロッパーコンソールで本番用、テスト用bot作成
こんな感じで二つ作ります。チャンネル作成方法と各プラットフォームデプロイ方法は割愛させていただきます。
各チャンネルの詳細から以下の情報をメモします。
- アクセストークン
- チャンネルシークレットキー
3. herokuなどのデプロイプラットフォームの用意
本番用のトークンはプラットフォームの方に登録します。
herokuの場合、アプリの設定から楽に登録ができます。
4. コード修正
.envファイルを新しく作成し、gitignoreに追加します。
コード例
// .env
# LINE ACCOUNT INFO
LINE_CHANNEL_ACCESS_TOKEN = YOUR_CHANNEL_ACCESS_TOKEN
LINE_CHANNEL_SECRET = YOUR_CHANNEL_SECRET
# ngrok用PORT番号指定
PORT=9000
https://github.com/line/line-bot-sdk-python
# app.py
import os # ここを追加
from dotenv import load_dotenv # ここを追加
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
# .envから読み込み
# herokuでは自動でherokuに登録されている環境変数を読み込み
load_dotenv()
channel_access_token = os.getenv("LINE_CHANNEL_ACCESS_TOKEN")
channel_secret = os.getenv("LINE_CHANNEL_SECRET")
app = Flask(__name__)
line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(channel_secret)
@app.route("/callback", methods=['POST'])
def callback():
# get X-Line-Signature header value
signature = request.headers['X-Line-Signature']
# get request body as text
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
print("Invalid signature. Please check your channel access token/channel secret.")
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text))
## ここを変更
if __name__ == "__main__":
port = int(os.getenv("PORT"))
app.run(host="0.0.0.0", port=port)
5. 実行
app.pyを実行後、ngrokを実行します。
$ ngrok http 9000
ngrokを実行すると、ローカルのアドレスが表示されます。
Forwardingと書いているURLをコピーし、LINEデベロッパーコンソールを開きます。
テスト用BotメニューにあるMessaging API からWebhook URLをコピーしたURLを貼ります。
Webhook URLなのでコピーしたURLの後ろに/callbackを付けます。
https://nagaiURL.ngrok.io/callback
注意点
herokuはherokuの環境変数で動作するし、テストするbotはngrokを実行すれば動作します。
ただ、ngrokの無料版は以下のデメリットがあります。
- 時間制限(2時間/ログインすると制限なし)
- ngrokを実行するたびにURLも変わるので毎回テスト用BotのCallbackURLを変更する必要がある