LineBot開発

友人のベンチャーの手伝いで、LINEのBot開発をやってみたので、その議事録として投稿します。

自分で記事を書くというより、2019/09/23現在は、このフローで開発できたよ！っていう、まとめブログ的な立ち位置で書きますね！

今回はこの記事を参考に実装していきますね！
https://qiita.com/nkjm/items/38808bbc97d6927837cd

Line Bot 開発をする方は一緒にこのサイト参考にしてみてください！

#LINEのBot開発・超入門（前編）

>npm initコマンドでpackage.jsonファイルを作成します。

```
$ npm init --yes
```
package.jsonファイルを作成しようとした結果、下記のエラーが出ました。

```
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.58.dylib
```
開発環境によって違うと思いますが、同じエラーが出た方はデバックしましょう。

#デバック（その１）

npmをアップグレードしてみた！

```
$ brew upgrade npm
```

からの

```
$ npm init --yes
```

```
{
  "name": "{Your-app-name}",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

デバック出来ました:thumbsup:

参考：https://github.com/facebook/react-native/issues/18760


#LINEのBot開発・超入門（前編）の続き

```
$ heroku login
```

Heroku CLI を使ってログインしようとすると

```
-bash: heroku: command not found
```

Herokuをインストールしましょ！（笑）

#デバック（その２）

Heroku のインストールしましょ！

```
brew tap heroku/brew && brew install heroku
```

これでオッケーかと！

<img width="300" alt="スクリーンショット 2019-09-23 18.45.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/bed9a4b0-ed36-e47e-ff4f-20d1fd3d1c98.png">


無事ログイン出来ました！

参考：https://devcenter.heroku.com/articles/heroku-cli#download-and-install

#LINEのBot開発・超入門（前編）の続き



```
Webhookが無効なHTTPステータスコードを返しました（期待されるステータスコードは200です）
```

ん？アクセスできない・・・？

#デバック（その3）

ここからは、可能性を書いておきます！

1. 環境変数の記入ミス
2. URLにはしっかりあなたのアプリ名を記載

コンソールで

```
$ heroku logs
```

とやって、Linebotからの通信が来てるか確認すると
<img width="781" alt="スクリーンショット 2019-09-23 20.56.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/1b114c46-fb02-560f-3100-b85602ae488d.png">

上記のようにエラーは出てますがPOSTが確認できたら、コードの中身が間違えている可能性があります！

しっかり、参考のサイトと見比べてみてください！

#完成したら、めっちゃ楽しい！

``` index.js

// -----------------------------------------------------------------------------
// モジュールのインポート
const server = require("express")();
const line = require("@line/bot-sdk"); // Messaging APIのSDKをインポート

// -----------------------------------------------------------------------------
// パラメータ設定
const line_config = {
    channelAccessToken: process.env.LINE_ACCESS_TOKEN, // 環境変数からアクセストークンをセットしています
    channelSecret: process.env.LINE_CHANNEL_SECRET // 環境変数からChannel Secretをセットしています
};

// -----------------------------------------------------------------------------
// Webサーバー設定
server.listen(process.env.PORT || 3000);

// APIコールのためのクライアントインスタンスを作成
const bot = new line.Client(line_config);

// -----------------------------------------------------------------------------
// ルーター設定
server.post('/bot/webhook', line.middleware(line_config), (req, res, next) => {
    // 先行してLINE側にステータスコード200でレスポンスする。
    res.sendStatus(200);

    // すべてのイベント処理のプロミスを格納する配列。
    let events_processed = [];

    // イベントオブジェクトを順次処理。
    req.body.events.forEach((event) => {
        // この処理の対象をイベントタイプがメッセージで、かつ、テキストタイプだった場合に限定。
        if (event.type == "message" && event.message.type == "text"){
            // ユーザーからのテキストメッセージが「こんにちは」だった場合のみ反応。
            if (event.message.text == "もう9月も終わりだね・・・"){
                // replyMessage()で返信し、そのプロミスをevents_processedに追加。
                events_processed.push(bot.replyMessage(event.replyToken, {
                    type: "text",
                    text: "でも給料日だったりするんでしょ！"
                }));
            }
            if (event.message.text == "ゴーファー君！"){
                // replyMessage()で返信し、そのプロミスをevents_processedに追加。
                events_processed.push(bot.replyMessage(event.replyToken, {
                    type: "text",
                    text: "僕ってかわいいでしょ！！"
                }));
            }
            if (event.message.text == "トビタテ！"){
                // replyMessage()で返信し、そのプロミスをevents_processedに追加。
                events_processed.push(bot.replyMessage(event.replyToken, {
                    type: "text",
                    text: "留学ジャパン！！！"
                }));
            }
        }
    });

    // すべてのイベント処理が終了したら何個のイベントが処理されたか出力。
    Promise.all(events_processed).then(
        (response) => {
            console.log(`${response.length} event(s) processed.`);
        }
    );
});

```

実際のbotで試した際の結果

<img width="300" alt="70601660_2415877818628464_8686956734985535488_n.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/0eece810-2321-2d96-6333-2ba1b4881b8e.jpeg">


#感想
LINEのBotってこんなに簡単に作れるんやな！と感動しました！！
LINEBOTの世界に足を突っ込んだので、こっからサービス用に改良していきます〜。
リリースしたら報告しますね☆彡

参考になった方も、ならなかった方も、ぜひ良いね！
お願いします！ではでは！！！