2
Help us understand the problem. What are the problem?

posted at

LINE + AWS Lambda + API Gateway でおうむ返しBotを作る

野望

・インターフェース:LINE公式アカウント
・処理:AWS Lambda(+API Gateway)
・DB:Notion
として簡単なツールを作ろうとしています。

イメージはこんな感じ。

image.png

今回やったこと

まずはLINE公式アカウントに対する投稿の取得とLambdaでのLINE Messaging API動作検証のため、投稿した内容をそっくりそのまま返すおうむ返しBot的なものを作りました。

image.png

前提

・LINE Developersでユーザ登録を実施し、公式アカウントを作成している。
・作成したアカウントを、お手元のLINEアプリで友達追加している。
・AWSのコンソールが使用可能である。
・Node.js 14.x

手順

①API Gateway + Lambdaを設定して、ブラウザから関数を呼び出せるようにする。
②LINEからAPI Gatewayを呼び出せるようにする。
③LambdaでLINE投稿ができるように設定する

①API Gateway + Lambdaを設定して、ブラウザから関数を呼び出せるようにする。

https://qiita.com/DJROU/items/8b04f1fc2ce1a1dc5954
に別だししました。
「適当」な部分は適当なままでOKです。

②LINEからAPI Gatewayを呼び出せるようにする。

ここではLINEのWebhookURL欄を利用して、先ほどまでブラウザで呼び出していたLambdaをLINEの投稿によって呼び出しできるようにします。

LINE Developerのコンソール画面より
トップ > (作成した公式アカウント) > Messaging API設定 > Webhook設定欄を見ます。
ここで①のAPI Gatewayにて作成したURLを貼り付けます。

image.png

保存後、「検証」を押下して「成功」が表示されればOKです。
Lambdaが本当に呼び出されたのかも見てみましょう。

Lambdaにて関数の編集画面を開き、タブ「モニタリング」から「CloudWatchのログを表示」を押下します。
CloudWatchの画面に遷移するので、最新の実行が「検証」ボタンを押した時間であることを確認できればLINEからのLambda呼び出しは成功です。

image.png

image.png

③LambdaでLINE投稿ができるように設定する

先ほど作ったLambdaの中身を味付けします。
LINEに投稿されたテキストを取得、そのまま返せるようにします。

testfunc.js
'use strict';
const line = require('@line/bot-sdk');

exports.handler = (event, context, callback) => {
  console.log("event.body:", event.body);
  const client = new line.Client({
    channelAccessToken: 'LINE公式アカウントのチャネルアクセストークン'
  });

  const message = {
    type: 'text',
    text: JSON.parse(event.body).events[0].message.text
  };
  const replyToken =JSON.parse(event.body).events[0].replyToken;

  client.replyMessage(replyToken, message).then((data) => {
    console.log(data);
    callback(null, event);
  }).catch((err) => {
    console.log("だめでし");
    callback(err, "NG");
  });

};

以下、プチ補足です。

モジュールのインポート

testfunc.js
const line = require('@line/bot-sdk');

node.jsのモジュールはLambda Layersを使用しています。
https://qiita.com/DJROU/items/bcdc2902757e606e9226

チャネルアクセストークン

testfunc.js
  const client = new line.Client({
    channelAccessToken: 'LINE公式アカウントのチャネルアクセストークン'
  });

LINE Developerのコンソール画面より
トップ > (作成した公式アカウント) > Messaging API設定 の一番下にある、チャネルアクセストークンを発行して貼り付けます。

受信テキストの取得と送信フォーマット

testfunc.js
  const message = {
    type: 'text',
    text: JSON.parse(event.body).events[0].message.text
  };
  const replyToken =JSON.parse(event.body).events[0].replyToken;

  client.replyMessage(replyToken, message).then((data) => {
    console.log(data);
    callback(null, event);
  }).catch((err) => {
    console.log("だめでし");
    callback(err, "NG");
  });

JSON.parse(event.body).events[0].message.text でLINEから送られてきたテキストをゲットできました。
LINEから送られてくるデータの形式を見るにはevent.bodyを出力してみるとよいです。

また、replyMessageについて公式ドキュメントを見ると、送信パラメータが上記のmessageの形式で指定されています。

replyTokenはreplyMessageの第一引数ですが、受信したデータの中に仕込まれています。
同じくevent.bodyで確認しましょう。
どのメッセージに対する応答かってことですよね、きっと。(適当)

以上でLINEから適当なメッセージを送るとそっくりそのまま返してくれる、かわいいおうむさんができるはずです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
2
Help us understand the problem. What are the problem?