Web API
普通のWebと同じ仕組みの通信で、処理を呼び出す仕組み。通信する内容はHTMLではなくJSONという形式のテキストで書かれている。下記のフォルダをダウンロードして解凍、その後エディタに表示させます。
LINE developpersのチャネルのMessaging API設定でチャネルアクセストークンを発行しておく。
sam build -t template.json sam build --use-container -t template.json 最初のコマンドでエラーが出る場合は、Dockerをインストールした後にこちらのコマンドを入力する ただし、Dockerのインストールが必要なので要注意 https://www.docker.com/ sam deploy --guided stack nameはなんでも良いが唯一無二のタイトルをつける。 linebot-app-0908 AWS Region ap-northeast-1->東京を意味する Parameter Line ChannelAccessToken チャネルアクセストークンのコピペ Line ChannelSecret シークレットパスワードをコピペする Confirm changes before deploy そのままEnter Allow SAM CLI IAM role creation そのままEnter Authorrization defined, is this ok? Yで回答 その後、3つは全て空白のままEnterでOK
出力されたURLをLINE developpersのwebhookに入力するしてwebhookは有効にする。
あいさつメッセージはオフ、応答メッセージもオフ、Webhookはオンに設定する。
これでオウム返しbotは完成です。
コード詳細解説
template.jsonはaws lambda / API Gatewayをデプロイさせるためのsam-cliの設定ファイル { "AWSTemplateFormatVersion": "2010-09-09", "Transform": "AWS::Serverless-2016-10-31", "Parameters": { "LineChannelAccessToken": {"Type": "String", "Description": "LINE のアクセストークン"}, "LineChannelSecret": {"Type": "String", "Description": "LINE のチャンネルシークレット"} }, "Resources": { "EndPointFunction": { "Type": "AWS::Serverless::Function", "Properties": { "Runtime": "python3.8", "CodeUri": "src", "Handler": "mylinebot.lambda_handler", "Environment": {"Variables": { "LINE_CHANNEL_ACCESS_TOKEN": {"Ref": "LineChannelAccessToken"}, "LINE_CHANNEL_SECRET": {"Ref": "LineChannelSecret"} }}, "Policies": [{"RekognitionDetectOnlyPolicy":{}}], "Events": { "API": { "Type": "Api", "Properties": {"Path": "/api_endpoint", "Method": "post"} } } } } }, "Outputs": { "ApiEndpointURL": { "Description": "API Endpoint URL", "Value": {"Fn::Sub": "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/${ServerlessRestApi.Stage}/api_endpoint"} } } }
src/mylinebot.pyはaws Lambdaで実行されるコードでAPI Gatewayが呼ばれるたびに実行される """ オウム返し Line Bot """ import os from linebot import ( LineBotApi, WebhookHandler ) from linebot.models import ( MessageEvent, TextMessage, TextSendMessage, ) handler = WebhookHandler(os.getenv('LINE_CHANNEL_SECRET')) line_bot_api = LineBotApi(os.getenv('LINE_CHANNEL_ACCESS_TOKEN')) def lambda_handler(event, context): headers = event["headers"] body = event["body"] # get X-Line-Signature header value signature = headers['x-line-signature'] # handle webhook body handler.handle(body, signature) return {"statusCode": 200, "body": "OK"} @handler.add(MessageEvent, message=TextMessage) def handle_text_message(event): """ TextMessage handler """ input_text = event.message.text line_bot_api.reply_message( event.reply_token, TextSendMessage(text=input_text))
src/requirement.txtは利用するライブラリを書くファイルでここに書いたライブラリが使える line-bot-sdk
環境変数を使用してPublicに自身のキーを公開しないようにする
コメント