🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

3401閲覧

LINE Messaging APIをローカル環境でテストしたい

Arata0608

総合スコア7

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/02/12 04:14

前提

LINE Messaging APIを用いて、チャットボット開発をしています。開発手法としてはSAMを用いて、バックエンド(具体的にはチャットボットとして応答する部分)をlambdaに書いています。このコードを実際にチャットボットとして動かすには、lambdaをローカル、もしくは本番サーバーに上げ、URLをWebhookURLとして登録してあげる必要があります。詳しくはLINE Messaging APIの公式ドキュメントを見て下さい。(https://developers.line.biz/ja/docs/messaging-api/overview/)

実現したいこと

ローカルホストURL(http://localhost:3000等)でチャットボットの挙動をテストしたい。

*ngrokを用いてローカルホストのURLをHTTPS通信のURLに変換しているので、WebhookURLを誤ってHTTP通信のURLを登録したという原因ではありません。

発生している問題

sam deployを用いて本番サーバーに書いたコードを上げた場合はWebhookでの通信が成功し、チャットボットとして問題なく動くのですが、ローカルでテストしたい場合、つまりsam local start-apiを用いてローカルホストのURLをWebhook用のURLとして登録しても、チャットボットとして上手く動きません。

ソースコード

基本的にはsam initでのテンプレートの一つであるHello World Functionに付け足して書いたものですので、template.ymlはほとんど触っていません。

lambdaにあたるapp.pyのコード

python

1import os 2import json 3from linebot import (LineBotApi, WebhookHandler) 4from linebot.models import (MessageEvent, TextMessage, TextSendMessage) 5from linebot.exceptions import (LineBotApiError, InvalidSignatureError) 6 7handler = WebhookHandler(os.environ.get('CHANNEL_SECRET')) 8line_bot_api = LineBotApi(os.environ.get('ACCESS_TOKEN')) 9 10# Lambda Response 11ok_response = { 12 "isBase64Encoded": False, 13 "statusCode": 200, 14 "headers": { 15 "X-Line-Status" : "OK", 16 "Content-Type": "application/json" 17 }, 18 "body": "{}" 19} 20error_response = { 21 "isBase64Encoded": False, 22 "statusCode": 401, 23 "headers": { 24 "Content-Type": "application/json" 25 }, 26 "body": "{}" 27} 28 29 30def lambda_handler(event, context): 31 signature = event["headers"]["x-line-signature"] 32 body = event["body"] 33 print(body) 34 35 if json.loads(body)["events"]: 36 37 # When TEXT message were sent by someone 38 @handler.add(MessageEvent, message=TextMessage) 39 def message(line_event): 40 text = line_event.message.text 41 line_bot_api.reply_message(line_event.reply_token, TextSendMessage(text=text)) 42 43 else: 44 return json.dump(ok_response) 45 46 # confirms that the requests were sent from LINE platform 47 try: 48 handler.handle(body, signature) 49 50 raise Exception("Unexpected Error has occured") 51 52 except Exception as e: 53 print(e) 54 55 # When LINE Messaging API responsed error 56 except LineBotApiError as e: 57 print(e) 58 return error_response 59 60 # When Webhook signature does NOT match 61 except InvalidSignatureError as e: 62 print(e) 63 return error_response 64 65 return json.dump(ok_response)

リソース等の設定を行うtemplate.ymlファイル

YML

1AWSTemplateFormatVersion: "2010-09-09" 2Transform: AWS::Serverless-2016-10-31 3Description: > 4 python-demo 5 6 Sample SAM Template for python-demo 7 8# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst 9Globals: 10 Function: 11 Timeout: 3 12 Environment: 13 Variables: 14 CHANNEL_SECRET: "*******************" 15 ACCESS_TOKEN: "*******************" 16 17Resources: 18 HelloWorldFunction: 19 Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction 20 Properties: 21 CodeUri: hello_world/ 22 Handler: app.lambda_handler 23 Runtime: python3.8 24 Events: 25 HelloWorld: 26 Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api 27 Properties: 28 Path: /hello 29 Method: post 30 31Outputs: 32 # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function 33 # Find out more about other implicit resources you can reference within SAM 34 # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api 35 HelloWorldApi: 36 Description: "API Gateway endpoint URL for Prod stage for Hello World function" 37 Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/" 38 HelloWorldFunction: 39 Description: "Hello World Lambda Function ARN" 40 Value: !GetAtt HelloWorldFunction.Arn 41 HelloWorldFunctionIamRole: 42 Description: "Implicit IAM Role created for Hello World function" 43 Value: !GetAtt HelloWorldFunctionRole.Arn

バージョン情報

line-bot-sdk==1.17.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ローカルホストのURLをWebhook用のURLとして登録しても、チャットボットとして上手く動きません。

具体的にどの部分で問題が起きているか切り分けが必要そうです。
ngrok経由でローカルで検証した場合はLINEプラットフォームからからのリクエストは到達しているのでしょうか?

到達していれば、差分はAPI Gatewayでマッピングされている部分の可能性が高いので、"リクエストのヘッダーフィールド名"の処理が正しいか確認してください。

到達していなければ、Webhook URL検証が成功していることを確認してください。

他にも最近のアップデートで変更があった箇所がローカル環境で満たされているか、一通り確認してみることをおすすめします。

https://developers.line.biz/ja/news/2021/01/28/reminder-update-webhook-client-and-root-certificate/

投稿2021/02/13 02:55

shoya.shiraki

総合スコア430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問