LambdaではじめてのLINE Botを作る
最近AppleWatchを買いました。早く札幌の外を走りたい!と思っている中村です。
今日はAmazon API Gateway(以下 API Gateway)とLambda、LINEのMessaging APIでLINEBotを作ります。 これは言ったことを言い返してくれるBotです。
お品書き
- LINEデベロッパー登録して、APIキーを取得する
- API Gateway & Lambdaを設定する
- 実際に投稿する
LINEデベロッパー登録
1.Messaging APIを利用するにはを参考に、LINEアカウントでログインし開発者登録する。 ・Messaging APIは、サービスとLINEユーザーの双方向コミュニケーションを可能にする機能。
2.続いて"プロバイダー"と"チャネル"を作成する。今回はどちらも"やまびこくん"とする。(詳細は画像を参照) ・プロバイダーは、アプリを提供する組織。 ・チャネルは、ユーザーに表示する名前、説明文、およびアイコン画像を登録する。
3.作成されたBotのChannel設定を開く。
4.基本設定は下記を設定する。
- アクセストークン(ロングターム)の再発行
- Webhook送信 = 利用する
- 自動応答メッセージ = 利用しない(利用するの場合ユーザー投稿時、個別返信できない旨が送信される)
- 友達追加時あいさつ = 利用しない
5.ChannelSecretとアクセストークン(ロングターム)をメモする
API Gateway & Lambdaを設定する
1.Lambdaでnode.jsの関数を作成する。
2.@line/bot-sdkをローカルでモジュールをインストールする。
$ npm install @line/bot-sdk
3.index.jsを作成し、署名チェックとユーザー返信のコードを書く。
'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) { let signature = crypto.createHmac('sha256', process.env.CHANNELSECRET).update(event.body).digest('base64'); let checkHeader = (event.headers || {})['X-Line-Signature']; let body = JSON.parse(event.body); if (signature === checkHeader) { if (body.events[0].replyToken === '00000000000000000000000000000000') { //接続確認エラー回避 let lambdaResponse = { statusCode: 200, headers: { "X-Line-Status" : "OK"}, body: '{"result":"connect check"}' }; context.succeed(lambdaResponse); } else { let text = body.events[0].message.text; const message = { 'type': 'text', 'text': text }; client.replyMessage(body.events[0].replyToken, message) .then((response) => { let lambdaResponse = { statusCode: 200, headers: { "X-Line-Status" : "OK"}, body: '{"result":"completed"}' }; context.succeed(lambdaResponse); }).catch((err) => console.log(err)); } }else{ console.log('署名認証エラー'); } };
4.index.jsとnode_modulesを圧縮しLambdaにアップロードする。
5.メモしたアクセストークン(ACCESSTOKEN)とChannelSecret(CHANNELSECRET)を環境変数に登録する。
6.API Gatewayを作成する。
7."/"リソースにPOSTメソッドを作成する。
- 統合タイプ = Lambda
- Lambda プロキシ統合の使用 = チェック
- Lambda リージョン = 先ほど作ったLambdaのリージョン
- Lambda 関数
を設定し保存。
8.メソッドリクエスト、HTTPリクエストヘッダーを設定する。
- リクエストの検証 = なし
- HTTP リクエストヘッダー = "X-Line-Signature"
を追加し必須にチェックする。
9.APIをデプロイする。
10.APIの"ダッシュボード"に表示されるURLをLINEデベロッパーコンソールのWebhook URLに登録する。 登録後に接続確認チェックを行い、成功するか確認する。
実際に投稿する
1.LINEデベロッパーコンソールで"やまびこくん"を開く。 Channel基本設定の"LINEアプリヘのQRコード"を読み取り追加する。
2.LINEの公式アカウントに"やまびこくん"が表示されるので、タップしてトークを開く。 好きな言葉を入力すると"やまびこくん"が返答する。
まとめ
いかがでしたでしょうか。 今回は、言ったことを言い返してくれるBotでしたが、様々なサービスと連携することで利用の幅が広がりそうです。