今回はPythonを使ってLINE Botを作る方法についての記事です。
とりあえず受け取ったメッセージを返すだけのBOTを作成しました。
AWS Lambda上でLineからメッセージを受け取り、処理を返すようなイメージです。
chalice
を使うとAWS上の環境を自動で構築してくれるので便利でした。
まずはLINE Bot APIを作成していきます。
Line Developersにログインしましょう。
コンソール
をクリックして進んで行きます。
プロダクト
→Mesaging API
と進んで行きます。
今すぐはじめようをクリックします。
BOTの詳細を入力する画面に遷移します。
適当に入力していきましょう。
チャネル名はテストチャネル
としました。
入力が終わったら、下にある作成
ボタンをクリックします。
これでLINE Botができました。
次にチャネルシークレットとアクセストークンをメモしておきましょう。
チャネルシークレットはチャネル基本設定タブにあります。
アクセストークンはMessaging API設定タブの下の方にいきますと…
このようになっていますので、発行をしてメモしておきます。
次に標準応答をオフにしておきましょう。
オンになっているとBotにメッセージを飛ばした際に「メッセージありがとうございます!…」というようなメッセージが毎回入ってくるので、少し鬱陶しいです。
Messaging APIタブで応答メッセージ、編集と進みます。
詳細設定の応答メッセージをオフにします。
これで取り急ぎのBOT側の設定は終わりです。
次にPythonコードを記述していきます。
適当なディレクトリにbotディレクトリを作り仮想環境をアクティベートします。
mkdir bot
cd bot
python -m venv myvenv
myvenv\scripts\activate
次に必要なライブラリをpip installします。
pip install chalice line-bot-sdk python-dotenv
以下のコマンドでchaliceプロジェクトを開始します。
chalice new-project line_bot
すると自動でファイルが作成されます。
まずrequirements.txt
を編集していきましょう。
ここに依存ライブラリを書いておくことで、AWS Lambdaにデプロイ時に必要ライブラリを集めてくれます。
python-dotenv~=0.19.2
line-bot-sdk~=2.1.0
次に.envファイルを作成し、中身を以下のようにします。
LINE_CHANNEL_SECRET=メモしたチャネルシークレット
LINE_CHANNEL_ACCESS_TOKEN=メモしたチャネルアクセストークン
先ほどメモしたチャネルシークレットとアクセストークンを貼り付けます。
今回はgitにはpushしないですが、.gitignore
にも.envファイルを忘れずに追記しておきましょう。
.chalice/deployments/
.chalice/venv/
.env
次にapp.pyを編集していきます。
ここでLINE APIからメッセージを受け取ってメッセージを返す処理を記述します。
import os
import logging
from chalice import Chalice
from chalice import BadRequestError
from linebot import LineBotApi, WebhookHandler
from linebot.models import MessageEvent, TextMessage, TextSendMessage
from dotenv import load_dotenv
load_dotenv()
logger = logging.getLogger()
app = Chalice(app_name='line_bot')
handler = WebhookHandler(os.environ.get('LINE_CHANNEL_SECRET'))
line_bot_api = LineBotApi(os.environ.get('LINE_CHANNEL_ACCESS_TOKEN'))
@app.route('/callback', methods=['POST'])
def callback():
try:
request = app.current_request
# get X-Line-Signature header value
signature = request.headers['x-Line-Signature']
# get request body as text
body = request.raw_body.decode('utf8')
# handle webhook body
handler.handle(body, signature)
except Exception as err:
logger.exception(err)
raise BadRequestError('Invalid signature. Please check your channel access token/channel secret.')
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
"""おうむ返しする処理"""
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text))
次に.chaliceディレクトリのconfig.json
を以下のようにします。
{
"version": "2.0",
"app_name": "line_bot",
"stages": {
"dev": {
"api_gateway_stage": "api",
"environment_variables": {
"LINE_CHANNEL_SECRET": "メモしたシークレット",
"LINE_CHANNEL_ACCESS_TOKEN": "メモしたアクセストークン"
}
}
}
}
これで準備は完了しました。
あとはAWS Lambdaにchalice deploy
コマンドでデプロイするだけです。
作成したline_bot
ディレクトリに移動するようにします。
移動しないでコマンドを叩くとエラーになります。
chalice deploy
>>>
FileNotFoundError: [Errno 2] No such file or directory: 'C:...\\bot\\.chalice\\config.json'
移動してからコマンドを叩きましょう。
単純なことですが、ここで結構時間を消費してしまいました。
cd line_bot
chalice deploy
すると、以下のようにメッセージが返ります。
Creating deployment package.
Reusing existing deployment package.
Creating IAM role: line_bot-dev
Creating lambda function: line_bot-dev
Creating Rest API
Resources deployed:
- Lambda ARN: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxx:function:line_bot-dev
- Rest API URL: https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/
ちなみにこのURLにアクセスすると
{"message":"Missing Authentication Token"}
と表示されますが、特にエラーは起きていません。
認証情報ファイルがない場合はデプロイ時に以下のようなエラーでます。
botocore.exceptions.NoCredentialsError: Unable to locate credentials
公式のこの辺りの記事を参考にして、IAMユーザーを作って認証情報ファイルを作成すればうまくいくと思います。
私はAWSに慣れていないのでここでも時間を浪費しました。
次にWebhookをLINE API上に設定しましょう。
Messaging APIタブにWebhookの設定があるので編集を押します。
ここに先ほどデプロイした際に発行されたURLにcallbackを足して入力します。
https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/callback
検証
を押して成功が返ってくれば動いています。
次にスマホからbotを動かしてみましょう。
Lineアプリの友達を追加より、Messaging APIタブのQRコードを読み取って作成したbotを追加します。
試しに柴田聡子さんのラッキーカラーの歌詞を飛ばしてみました。
ちゃんとおうむ返しをしてくれていますね。