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

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

詳細はこちら
LINE Messaging API

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

AWS Lambda

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

1385閲覧

AWSにLINEチャットボットを実装しようとするが、LINEを管理画面で「The webhook returned an HTTP status code other than 200」エラーMSG

Githum

総合スコア18

LINE Messaging API

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

AWS Lambda

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2021/01/17 13:05

前提・実現したいこと

AWSlambda×APIGatewayを使って、Lineのチャットボットを作っています。
言語はjavascript×node.jsを使用しています。

AWSlambdaに関して、トリガー(APIGateway)・レイヤー(node_modules)は設定済み。
ランタイム設定はNode.js 12.xを指定。環境変数もLINEのチャンネルアクセストークンとシークレットトークンを設定済み。
APIGatewayは、Rest APIではなくHTTP APIで設定しており、ルートもPOSTで作成済みです。
node.jsのモジュールに関しては、必要なものをインストールし、Lambdaのレイヤーに格納済みです。

前提として、ラインの応答メッセージに関しては、機能している、LINEの管理画面にて、エラーMSG。
(友だち追加したあと、メッセージ送ると決められた応答メッセージが返ってくる)
恐らくステータスコードに何か問題があるのではないかと思っているのだが、原因を特定できず。

発生している問題・エラーメッセージ

LineDeveloperのWebhook settingsの項目にWebhook URLを設定した後、Verifyボタンを押すと下記エラーMSGが出ます。

Error The webhook returned an HTTP status code other than 200

またAWSのCloudWatchでも下記エラーMSGが表示される。

{ "errorType": "TypeError", "errorMessage": "Cannot read property 'replyToken' of undefined", "stack": [ "TypeError: Cannot read property 'replyToken' of undefined", " at Runtime.exports.handler (/var/task/index.js:38:23)", " at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)" ] }

該当のソースコード

メインのスクリプトは下記通りになっている。

javascript

1"use strict"; 2 3const crypto = require('crypto'); 4const func = require("./func.js"); 5const line = require("@line/bot-sdk"); 6 7const line_config = { 8 channelAccessToken: process.env.LINE_ACCESS_TOKEN, 9 channelSecret: process.env.LINE_CHANNEL_SECRET 10}; 11 12const bot = new line.Client(line_config); 13 14exports.handler = function(event, context,callback){ 15 let signature = crypto.createHmac('sha256', process.env.LINE_CHANNEL_SECRET).update(event.body).digest('base64'); 16 let bod = JSON.parse(event.body); 17 let checkHeader = (event.headers || {})['x-line-signature']; 18 if (signature === checkHeader) { 19 var evt = bod.events[0]; 20 var replytoken= evt.replyToken; 21 22 if (replytoken === '00000000000000000000000000000000') { 23 let lambdaResponse = { 24 statusCode: 200, 25 headers: { "X-Line-Status" : "OK"}, 26 body: '{"result":"connect check"}' 27 }; 28 context.succeed(lambdaResponse); 29 }else{ 30 var userId = evt.source.userId; 31 32 const push_msg = func.base_button('sdsdsds',[func.act_postback("test1","TEST"),func.act_postback("test2","TEST")]); 33 bot.replyMessage(replytoken, push_msg) 34 .then((response) => { 35 let lambdaResponse = { 36 statusCode: 200, 37 headers: { "X-Line-Status" : "OK"}, 38 body: '{"result":"completed"}' 39 }; 40 context.succeed(lambdaResponse); 41 }).catch((err) => console.log(err)); 42 } 43 }else{ 44 console.log('署名認証エラー'); 45 } 46};

上記スクリプトのrequire("./func.js")は、下記スクリプトになります、

javascript

1//func.js 2exports.base_button = function(tex,act,tit){ 3 var ttt = { 4 type: "template", 5 altText: tex, 6 template:{ 7 type: "buttons", 8 actions:act, 9 text: tex, 10 title: tit 11 } 12 }; 13 return ttt; 14} 15exports.act_postback = function(date1,label1,tex){ 16 var ttt = { 17 type: "postback", 18 label: label1, 19 displayText:tex, 20 data: JSON.stringify({action: date1}) 21 }; 22 return ttt; 23} 24

試したこと

replyTokenがundefinedとのことだったので、console.log(replytoken)で、確認してみるも、文字列が格納されているので、違うっぽい。
他に思い当たるものが思いつかず、またGoogleで調べても該当するものが見つからず、解決が難しい状況です。
お手数ですが、教えていただけると助かります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Webhook URLの検証を行ったときにLINEプラットフォームからは、以下の形式のイベントオブジェクトが送信されます。

{ events: [], destination: 'Uxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' }

該当のソースコードはeventsの中身が1件以上存在する前提で書かれており
evtundefinedになっているためエラーが発生し、statusCode: 200が返っておらず検証が成功してないと思われます。

投稿2021/01/17 13:32

編集2021/01/17 13:33
shoya.shiraki

総合スコア430

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

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

Githum

2021/01/17 14:51 編集

実はWEBで質問する事自体が初めてで不安でしたが、的確なアドバイスのおかげで、無事解消しました。 本当に助かりました!!感謝です!ありがとうございます。 回答を参考に下記コード部分を変更し、解消しました。 <before>================================= var evt = bod.events[0]; var replytoken= evt.replyToken; if (replytoken === '00000000000000000000000000000000') {    //コード省略 } ====================================== 上記の該当コードを下記コードに変更 <After>================================= if(bod.events.length >= 1){    var evt = bod.events[0];    var replytoken = evt.replyToken;    if (bod.events[0].replyToken === '00000000000000000000000000000000') {       //コード省略    } } ======================================
shoya.shiraki

2021/01/17 14:52

良かったです! Webhookの検証がエラーになり困っている方は多いので、見かけたらコメントしてあげてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問