🦜

【AWS Lambda】オウム返しLINEボットを作るよ

2024/04/29に公開

こんにちは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