前提・実現したいこと
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で調べても該当するものが見つからず、解決が難しい状況です。
お手数ですが、教えていただけると助かります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/17 14:51 編集
2021/01/17 14:52