今回は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を追加します。

試しに柴田聡子さんのラッキーカラーの歌詞を飛ばしてみました。
ちゃんとおうむ返しをしてくれていますね。