ちょっと話題の記事

LambdaではじめてのLINE Botを作る

2018.03.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

最近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でしたが、様々なサービスと連携することで利用の幅が広がりそうです。