8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LINEBotをみんなで作ろう〜コードを実装編〜【最終日】

Last updated at Posted at 2020-05-08

この記事は下記の #GWアドベントカレンダー の 8日目の記事になります。

1週間でサーバレスLINEBotを生み出す( @inoue2002 ) | GWアドベントカレンダー

はじめに

こちらの内容は超初心者向けです。
公式ドキュメントを読める方はこちらをお読みいただく方が正確です。

昨日の記事をご覧になってない方はぜひ。
こちらの記事はGWアドベントカレンダーを通してLINEBotをサーバレスで作れるようになろう!ということを目標に書いている記事です。

LINEBotは作れるけどAWSでサーバーレスを作ってみたい!方向けの記事です

昨日の記事でほとんどの設定(lambda関数、APIGateway、環境変数等)を終えたので残すはコードを書いて、WEBhookURLを設定するだけとなりました。
ではやっていきましょう!
#コードを作成

##昨日一度もいじらなかったコードエディタのところにを全削除します。
スクリーンショット 2020-05-08 11.23.38.png
##以下をコピーしてそのまま貼り付け

index.js
"use strict";
// モジュール呼び出し
const crypto = require("crypto");
const line = require("@line/bot-sdk");

// インスタンス生成
const client = new line.Client({ channelAccessToken: process.env.ACCESSTOKEN });

exports.handler = (event) => {
  let signature = crypto
    .createHmac("sha256", process.env.CHANNELSECRET)
    .update(event.body)
    .digest("base64");
  let checkHeader = (event.headers || {})["X-Line-Signature"];
  if (!checkHeader) {
    checkHeader = (event.headers || {})["x-line-signature"];
  }

  const body = JSON.parse(event.body);
  const events = body.events;
  console.log(events);

  // 署名検証が成功した場合
  if (signature === checkHeader) {
    events.forEach(async (event) => {
      let message;
      switch (event.type) {
        case "message":
          message = await messageFunc(event);
          break;
        case "postback":
          message = await postbackFunc(event);
          break;
        case "follow":
          message = { type: "text", text: "追加ありがとうございます!" };
          break;
      }
      // メッセージを返信
      if (message != undefined) {
        await sendFunc(body.events[0].replyToken, message);
        // .then(console.log)
        // .catch(console.log);
        return;
      }
    });
  }
  // 署名検証に失敗した場合
  else {
    console.log("署名認証エラー");
  }
};

async function sendFunc(replyToken, mes) {
  const result = new Promise(function (resolve, reject) {
    client.replyMessage(replyToken, mes).then((response) => {
      resolve("送信完了");
    });
  });
  return result;
}

async function messageFunc(event) {
  let message = "";
  message = { type: "text", text: `メッセージイベント` };
  return message;
}
const postbackFunc = async function (event) {
  let message = "";
  message = { type: "text", text: "ポストバックイベント" };
  return message;
};


##確認&保存
###以下のようになったら右上の保存ボタンをおす
スクリーンショット 2020-05-08 11.24.06.png

#WEBhookURLを設定する
スクリーンショット 2020-05-08 11.24.37.png
###APIエンドポイントと書かれたURLを全部コピーする
スクリーンショット 2020-05-08 11.24.51.png
###LINEBotのWebhookURLの欄に貼り付ける(語尾に/webhookとかいらない。そのまま貼り付けるだけ。)
スクリーンショット 2020-05-08 11.25.19.png

※検証ボタンを押すとエラーが出ますが特に気にしなくていい。

#動作確認する

LINEBotに何か喋りかけてみましょう!

##終わりに
GWをかけて一個一個細かく写真をとってLINEBotを作ってみました。
僕も改めて勉強下部分も多く、とても有意義なqiitaを書く時間だったなぁと思っています。
過去作を順番に復習してみなさんでどんどんLINEBotを作っていきましょう!

この1週間の記事は全てこの記事を参考にしています

本記事:LINEBotをみんなで作ろう〜コードを実装編

LINEBotをみんなで作ろう〜環境構築編〜
LINEBotをみんなで作ろう〜LINEBot is 何?編
LINEBotをみんなで作ろう〜おうむ返しbotを作ろう編〜
LINEBotをみんなで作ろう〜色々なメッセージを送ってみよう編
LINEBotをみんなで作ろう〜Messageを分岐させるぞ編
LINEBotをみんなで作ろう〜AWSアカウントを作るぞ編
LINEBotをみんなで作ろう〜レイヤーとAPIgateway設定編

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?