妻に日頃の感謝や日々なかなか言いづらい言葉を伝えるため秘密裏に作ったLINE Botです。 ランダムにあらかじめ決められた言葉を返すという機能のみ持っています。誕生日にお披露目して「おもしろいね」と言ってもらえました。やったー。
(ただ、数回で飽きられました)
LambdaではじめてのLINE Botを作るを参考に作成しました。クラスメソッドさんの記事にはいつもお世話になっています。
ただし、動かない点があります。
LINE Developer CommunityのMessaging APIとAPIGatewayとLambdaで実現したいにある通り、index.js
のcheckHeader
変数に値を入れる箇所で「X-Line-Signature」を「x-line-signature」のように小文字にする必要がありました。
LambdaではじめてのLINE Botを作るのソースコードを少し改変し、おうむがえしではなく、ランダムな言葉を返すように変更したりしました。
'use strict';
const line = require('@line/bot-sdk');
const crypto = require('crypto');
const client = new line.Client({ channelAccessToken: process.env.ACCESSTOKEN });
exports.handler = function (event, context) {
const signature = crypto.createHmac('sha256', process.env.CHANNELSECRET).update(event.body).digest('base64');
const checkHeader = (event.headers || {})['x-line-signature'];
const body = JSON.parse(event.body);
const messages = [
"I love you, Hisa-Chan.",
"大好きだよ〜",
"ひさちゃん最高",
"素敵",
"さっすがー!",
"ひさちゃん100点満点",
"最高すぎる",
"素晴らしいね!",
"素晴らしいよ!!",
"好きです",
"最高の妻",
"Happyです",
"感謝してます",
"いつもありがとう",
"楽しもうね〜",
"お誕生日おめでとう!",
"大好き",
"幸せをありがとう",
"さっすが〜"
]
const messageNo = Math.floor(Math.random() * messages.length);
const responseBodyObj = {"type": "text","text": messages[messageNo]}
const text = messages[messageNo]
if (signature !== checkHeader) {
console.log('署名認証エラー');
return;
}
let lambdaResponse = null;
if (body.events[0].replyToken === '00000000000000000000000000000000') { //接続確認エラー回避
lambdaResponse = {
statusCode: 200,
headers: { "X-Line-Status": "OK" },
body: '{"result":"connect check"}'
};
context.succeed(lambdaResponse);
} else {
const message = {
'type': 'text',
'text': text
};
client.replyMessage(body.events[0].replyToken, message)
.then((response) => {
lambdaResponse = {
statusCode: 200,
headers: { "X-Line-Status": "OK" },
body: '{"result":"completed"}'
};
context.succeed(lambdaResponse);
}).catch((err) => console.log(err));
}
};
皆様もぜひ一瞬の微笑みのために作ってみてはいかがでしょうか! 次は何をしてみようかな〜