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

この記事は下記の [#GWアドベントカレンダー](https://gw-advent.9wick.com/calendars/2020/72) の 8日目の記事になります。

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

# はじめに
こちらの内容は超初心者向けです。
[公式ドキュメント](https://developers.line.biz/ja/docs/messaging-api/overview/#messaging-api%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF)を読める方はこちらをお読みいただく方が正確です。

[昨日の記事](https://qiita.com/inoue2002/items/ab226d9836a891b01bc9)をご覧になってない方はぜひ。
こちらの記事はGWアドベントカレンダーを通してLINEBotをサーバレスで作れるようになろう！ということを目標に書いている記事です。

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

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

##昨日一度もいじらなかったコードエディタのところにを全削除します。
<img width="1353" alt="スクリーンショット 2020-05-08 11.23.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/520bc177-3297-5756-8195-09b0ff6e00b9.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;
};


```
##確認&保存
###以下のようになったら右上の保存ボタンをおす
<img width="1346" alt="スクリーンショット 2020-05-08 11.24.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/bcd4e165-aee1-c148-e3f3-dfe073241dde.png">


#WEBhookURLを設定する
<img width="1354" alt="スクリーンショット 2020-05-08 11.24.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/07bd1ffb-e4bb-26b0-bd3d-86ab196cdadc.png">
###APIエンドポイントと書かれたURLを全部コピーする
<img width="1328" alt="スクリーンショット 2020-05-08 11.24.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/08152dba-0cc5-600a-054e-3b376bed0746.png">
###LINEBotのWebhookURLの欄に貼り付ける（語尾に/webhookとかいらない。そのまま貼り付けるだけ。）
<img width="1041" alt="スクリーンショット 2020-05-08 11.25.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/88fdde1c-4995-4821-24f2-a8aec980dd9b.png">

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

#動作確認する
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">サボってたサーバーレスLINEbotが完成した！ <a href="https://t.co/FMn7CFYlfp">pic.twitter.com/FMn7CFYlfp</a></p>&mdash; ようかん (Yosuke Inoue) (@inoue2002) <a href="https://twitter.com/inoue2002/status/1258588018690031616?ref_src=twsrc%5Etfw">May 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

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

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

この1週間の記事は全て[この記事](https://qiita.com/shinbunbun_/items/ae09364504002d0c25f1)を参考にしています

本記事：[LINEBotをみんなで作ろう〜コードを実装編](https://qiita.com/inoue2002/items/dbbd862d6149c83f6513)


[LINEBotをみんなで作ろう〜環境構築編〜](https://qiita.com/inoue2002/items/a87df2b520f8b6e37f42)
[LINEBotをみんなで作ろう〜LINEBot is 何？編](https://qiita.com/inoue2002/items/3a5019c07801bcf5ff75)
[LINEBotをみんなで作ろう〜おうむ返しbotを作ろう編〜](https://qiita.com/inoue2002/items/dcf40d5ebfe2454796fa)
[LINEBotをみんなで作ろう〜色々なメッセージを送ってみよう編](https://qiita.com/inoue2002/items/35fab5b7901aa94fafd2)
[LINEBotをみんなで作ろう〜Messageを分岐させるぞ編](https://qiita.com/inoue2002/items/650eca3f7dd6a5fccb63)
[LINEBotをみんなで作ろう〜AWSアカウントを作るぞ編](https://qiita.com/inoue2002/items/ad945981150c859911fc)
[LINEBotをみんなで作ろう〜レイヤーとAPIgateway設定編](https://qiita.com/inoue2002/items/ab226d9836a891b01bc9)