【AWS Lambda】オウム返しLINEボットを作るよ
こんにちはAWS SAA-C03落ちた吉田です
LINEボットって作れるとかっこいいですよね
今回はLambdaを使ってオウム返しボットを作ります
いろいろな人がLambda × LINEでボットを作っていますが、意外と複雑ことをやられてたりするので、「オウム返し」に絞った最小構成で作ってます
全体像
全体像はこんな感じになってます
もう少し詳しく書くとこんな感じになってます
①:ユーザがLINEボットにメッセージを送信します
②:LINEボットがメッセージを受信したことをトリガーとして、WebhookイベントをLambdaに送信します
③:Webhookイベントを受け取ったLambdaは、ユーザが送信したメッセージを抽出し、そのメッセージをユーザに送り返すようにLINEボットにリクエストします(これを作る)
④:ユーザがLINEボットに送信したメッセージが、そのまま返ってくる
作っていきましょう
1. LINE Messaging APIのチャンネル作成
公式ドキュメントを参考にオウム返し用のMessageing APIのチャンネルを作成してください
「オウム返しBOT」というチャンネルを作っておきました
「Messaging API設定」タブからQRコードを表示でるので、友だち登録しておきましょう
うっす
「Messaging API設定」タブから下にスクロールすると、チャネルアクセストークンの発行ボタンがあるので、クリックしてトークンを発行します
(トークンはあとで使うので、控えておくかすぐにLINE Developersを開ける状態にしておくと良いです)
2. Lambdaの作成
本題のLambdaの作成していきます
2-1. リソースの作成
今回はPython3.12を使います
LINEボットがメッセージ受信したときにとき、LamadaへリクエストをHTTPで送信するために「関数URL」を有効にします
「認証タイプ」はNONE
を指定します
Lambda関数が作成されました
「関数URL」をクリックすると、デフォルトで作成されているPythonコードが実行されます
2-2. コードのデプロイ
コードエディタに以下のコードを貼り付けてください
貼り付けが完了したら、Ctrl+sで保存→「Deploy」ボタンをクリックしてください
import os
import json
import requests
def lambda_handler(event, context):
CHANNEL_ACCESS_TOKEN = os.environ["CHANNEL_ACCESS_TOKEN"]
print(event)
body = json.loads(event["body"])
replyToken = body["events"][0]["replyToken"]
receivedText = body["events"][0]["message"]["text"]
url = "https://api.line.me/v2/bot/message/reply"
header = {
"Content-Type": "application/json",
"Authorization": f"Bearer {CHANNEL_ACCESS_TOKEN}"
}
body = json.dumps({
"replyToken": replyToken,
"messages": [
{
"type": "text",
"text": receivedText
}
]
})
res = requests.post(url=url, headers=header, data=body)
print(res.text)
return "OK"
2-3. コードの解説
CHANNEL_ACCESS_TOKEN = os.environ["CHANNEL_ACCESS_TOKEN"]
チャネルアクセストークンを環境変数から呼び出て、変数に代入しています
環境変数の設定は後の手順で行います
body = json.loads(event["body"])
replyToken = body["events"][0]["replyToken"]
receivedText = body["events"][0]["message"]["text"]
リクエストボディを扱いやすいように変数に代入しています
-
body
:リクエストボディをJSON形式で格納しています -
replyToken
:メッセージを受信したときに発行されるリプライトークンを格納しています
このリプライトークンを使用することで、受信したメッセージに対して返信するという形でメッセージを送信することができます -
receivedText
:ユーザから送られてきたメッセージを格納します
「こんにちは」というメッセージだった場合、そのまま「こんにちは」という値が入ります
url = "https://api.line.me/v2/bot/message/reply"
header = {
"Content-Type": "application/json",
"Authorization": f"Bearer {CHANNEL_ACCESS_TOKEN}"
}
body = json.dumps({
"replyToken": replyToken,
"messages": [
{
"type": "text",
"text": receivedText
}
]
})
-
url
:メッセージを返信するためのエンドポイントです -
header
:リクエストヘッダーを定義します、Authorization
にチャネルアクセストークンを記述することで、作成した「オウム返しBOT」からメッセージを送信することができます -
body
:リクエストボディを定義します、text
の値としてreceicedText
を指定することで、受け取ったメッセージをそのまま返信します
res = requests.post(url=url, headers=header, data=body)
print(res.text)
requests
モジュールを使用して、https://api.line.me/v2/bot/message/reply
に対してリクエストを送信します
リクエスト結果をres
に格納し、次の行で結果を表示しています
2-4. 環境変数の追加
コードで登場した環境変数CHANNEL_ACCESS_TOKEN
の値を設定しましょう
Lambda関数の画面から「設定」>「環境変数」にアクセスします
今回はチャネルアクセストークンを環境変数に追加します
- キー:
CHANNEL_ACCESS_TOKEN
- 値 :作成したチャネルのアクセストークンを貼り付けてください
Pythonの場合は以下の記述で環境変数を取り出すことができます
region = os.environ['AWS_REGION']
2-5. レイヤーの追加
LambdaのPythonランタイムではrequests
モジュール標準で使用することができないので、Layerを使ってモジュールを追加する必要があります
Layerとは:
追加のコードとコンテンツをレイヤーの形式で使用するように Lambda 関数を設定できます。レイヤーは、ライブラリ、カスタムランタイム、またはその他の依存関係を含む ZIP アーカイブです。レイヤーを使用することで、関数のライブラリを使用することができます。デプロイパッケージに含める必要はありません
なんだか面倒くさそうですが、Pythonでよくつかわれるモジュールは有志の方がLayerとしてパッケージ化してくれています!
今回は、東京リージョンでランタイムはPython3.12なので、以下のARNを使用すればOKです(参照元)
arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-p312-requests:3
「コード」タブの「レイヤー」>「レイヤーの追加」をクリックしてください
「ARNを指定」を有効にし、先ほどのARNを貼り付けて、レイヤーを追加します
3. Webhookの設定
Lamdaの「関数URL」をコピーしてください、このURLをWebhookとして設定します
LINE Developersの画面に戻ってきて「Messaging API設定」タブを開いてください
下にスクロールすると「Webhook設定」があるので「編集」をクリックして、コピーしてきた関数URLを貼り付けます
「検証」ボタンをクリックして成功することが確認できたら「Webhookの利用」を有効にしてください
これでオウム返ししてくるようになりました!が、最後に1つやり残した設定があります
公式LINEアカウントには「応答メッセージ」という設定があり、メッセージを送ると自動で返信してくれる機能があります(↓これ)
今の状態ではオウム返しと、この応答メッセージが返ってきてしまうので、「応答メッセージを」無効にしましょう
「チャネル基本設定」タブからLINE Official Account Managerにアクセスします
左ペインの「応答設定」から「応答メッセージ」を無効にします
4. 動作確認
ちゃんとオウム返ししてきやがりますね
おわり
LINEボットを作ろうと思ったら、オウム返しが基礎になると思ってるので参考になればうれしいです
Discussion