Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8943

【今日から始めるAWS】LambdaでLINEのbotをつくる

$
0
0

はじめに

30代未経験からエンジニア転職をめざすコーディング初学者のYNと申します。お読みいただきありがとうございます。
コーディング初学者にとってのAWS入門といえばLambda!、サーバレスアプリを作ろう!、ということでメッセージをオウム返ししてくるLINEのbotをつくりました。
下記参考記事をそのままコピーした内容になってしまったのですが、学習ログとして投稿させていただきました。

今回やったこと

下記のように、こちらが送ったテキストメッセージをそのまま返答してくれる、オウム返しbotを作ります。
スクリーンショット 2020-08-08 11.16.49.png

下記のサーバレス構造を構築します。(こちらの記事から図を拝借させていただきました。)
スクリーンショット 2020-08-08 11.09.26.png

手順

  • 事前準備
  • Lambdaの設定
  • API-gatewayの設定
  • LINEチャンネルの設定

事前準備

  • LINEデベロッパー登録

Lambdaの設定

  • 1. ローカルPCでlambda関数のフォルダを作成
$ cd ~
$ mkdir line-bot
$ cd line-bot
  • 2. index.jsを作成
$ npm install @line/bot-sdk
line-bot/index.js
"use strict";constline=require("@line/bot-sdk");constclient=newline.Client({channelAccessToken:process.env.ACCESSTOKEN});// ①SDKをインポートconstcrypto=require("crypto");exports.handler=function(event,context){letbody=JSON.parse(event.body);letsignature=crypto.createHmac("sha256",process.env.CHANNELSECRET).update(event.body).digest("base64");letcheckHeader=(event.headers||{})["X-Line-Signature"];if(signature===checkHeader){// ②cryptoを使ってユーザーからのメッセージの署名を検証するif(body.events[0].replyToken==="00000000000000000000000000000000"){letlambdaResponse={statusCode:200,headers:{"X-Line-Status":"OK"},body:'{"result":"connect check"}',};context.succeed(lambdaResponse);// ③接続確認エラーを確認する。}else{lettext=body.events[0].message.text;constmessage={type:"text",text,};client.replyMessage(body.events[0].replyToken,message).then((response)=>{letlambdaResponse={statusCode:200,headers:{"X-Line-Status":"OK"},body:'{"result":"completed"}',};context.succeed(lambdaResponse);}).catch((err)=>console.log(err));// ④リクエストとして受け取ったテキストをそのまま返す}}else{console.log("署名認証エラー");}};

下記、index.jsにおける処理を解説します。

①SDKをインポートする

constline=require("@line/bot-sdk");constclient=newline.Client({channelAccessToken:process.env.ACCESSTOKEN});

githubのexampleでSDKの使い方が参照できます。

②cryptoを使ってユーザーからのメッセージの署名を検証する

constcrypto=require("crypto");exports.handler=function(event,context){letbody=JSON.parse(event.body);letsignature=crypto.createHmac("sha256",process.env.CHANNELSECRET).update(event.body).digest("base64");letcheckHeader=(event.headers||{})["X-Line-Signature"];if(signature===checkHeader){// ここでlambdaの処理を記載}

cryptoはnode.jsに標準で組み込まれている暗号化に関するライブラリで、botにおける実装の詳細についてはLINE公式ドキュメントに書いてあります。
(暗号化についてはこちらの記事が分かりやすかったです)

ここでは、下記2点が一致するかを検証しています。

  • signature: ユーザーから送られてきたリクエスト(event.body)を、秘密鍵(CHANNELSECRET)を使って暗号化したもの

  • event.headers["X-Line-Signature"]:リクエストヘッダーに含まれる署名

③接続確認の場合の処理を実装する

botが接続確認を行う場合、replyToken="000..."のリクエストが来ます。

letbody=JSON.parse(event.body);if(body.events[0].replyToken==="00000000000000000000000000000000"){letlambdaResponse={statusCode:200,headers:{"X-Line-Status":"OK"},body:'{"result":"connect check"}',};context.succeed(lambdaResponse);}

④リクエストとして受け取ったテキストをそのまま返す

ユーザーから送られてきたリクエストの中身(イベントオブジェクト)はLINE公式ドキュメントにまとめられています。
リクエストに含まれるメッセージがテキストの場合、body.events[0].message.textに含まれます。
また、client.replyMessage(replyToken, message)のメソッドを使うことで、ユーザーにメッセージを返信することが出来ます。

lettext=body.events[0].message.text;constmessage={type:"text",text,};client.replyMessage(body.events[0].replyToken,message).then((response)=>{letlambdaResponse={statusCode:200,headers:{"X-Line-Status":"OK"},body:'{"result":"completed"}',};context.succeed(lambdaResponse);})
  • 3. index.jsとnode_modulesを圧縮しLambdaにアップロードする

スクリーンショット 2020-08-08 17.59.05.png

  • 4. アクセストークン(ACCESSTOKEN)とChannelSecret(CHANNELSECRET)を環境変数に登録する

スクリーンショット 2020-08-08 18.04.54.png

API-gatewayの設定

  • 1 POSTメソッドを作成する
    スクリーンショット 2020-08-08 18.13.44.png

  • 2 リクエストヘッダーによる認証を追加する
    スクリーンショット 2020-08-08 18.15.21.png

  • 3 統合リクエストに作成したLambda関数を設定する
    スクリーンショット 2020-08-08 18.18.58.png

  • 4 APIをデプロイ
    スクリーンショット 2020-08-08 19.24.39.png

LINEチャンネルの設定

LINE Official Account Managerからユーザーからのメッセージに対するあいさつや応答の設定をすることができます。
スクリーンショット 2020-08-08 19.29.07.png

最後に

Lambdaを使うことで、簡単にLINEのbotを作ることができます。
初学者でも1時間弱でつくることができました。
機械学習や外部のAPIを組み合わせれば、面白いことができそうです。
ご覧いただきありがとうございました。


Viewing all articles
Browse latest Browse all 8943

Trending Articles