LINE Bot を Replit でEverything It's you してみた！

Replit がとても便利そうだったので試してみたくなり、ちょうどアドベントカレンダーの5日目が埋まっていなかったので試してみました。
ということで以下のアドベントカレンダー5日目の記事でもあります。

https://qiita.com/advent-calendar/2022/linedc

# Replitって？

- オンライン統合開発環境
    - 開発環境を構築しなくともブラウザでプログラミングを行うことが可能 
- 50以上の言語に対応
- サーバー起動可能

ということで、 LINE Bot のバックエンドを Replit を使って実装・デプロイしてみました。

# Developers Console

LINE Bot (Messaging API) の準備は以下をご覧ください。

https://qiita.com/h2m_kinoko/items/d55623425415ed2b7f9c

# Replitの準備

https://replit.com/ よりアカウントを作成しログイン

##### Create押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/b10dd682-91e8-d3c8-c85c-2e8c811ccb39.png)

##### 今回は Node.js を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/f0f39e4e-a708-03d9-ac42-ebbb1191e2b2.png)

##### Title を入力し、 Create Repl 押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/8988e582-136e-0965-3b81-3169a514ba33.png)

以下のような画面が開きます。
デフォルトで index.js, package.json, package-lock.json の3つのファイルが出来上がってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/8a717fa9-46f1-811b-d170-dccb8f297fd4.png)



```index.js
空っぽ
```

```package.json
{
  "name": "nodejs",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@types/node": "^18.0.6",
    "node-fetch": "^3.2.6"
  }
}
```

```package-lock.json
（略）
```

# チュートリアルをベースにBotを実装

https://developers.line.biz/ja/docs/messaging-api/nodejs-sample/

今回、 Replit でサーバーを起動するのでHeroku や Git は特に使いません。
チュートリアルをもとにやることはやることは2つだけです。

###### js の実装

```index.js
const https = require("https");
const express = require("express");
const app = express();
const PORT = process.env.PORT || 3000;
const TOKEN = process.env.LINE_ACCESS_TOKEN;

app.use(express.json());
app.use(
  express.urlencoded({
    extended: true,
  })
);

app.get("/", (req, res) => {
  res.sendStatus(200);
});

app.post("/webhook", function (req, res) {
  res.send("HTTP POST request sent to the webhook URL!");

  if (req.body && req.body.events[0].type === "message") {
    const dataString = JSON.stringify({
      replyToken: req.body.events[0].replyToken,
      messages: [
        {
          type: "text",
          // おうむ返し
          text: req.body.events[0].message.text,
        },
      ],
    });

    const headers = {
      "Content-Type": "application/json",
      Authorization: "Bearer " + TOKEN,
    };

    const webhookOptions = {
      hostname: "api.line.me",
      path: "/v2/bot/message/reply",
      method: "POST",
      headers: headers,
    };

    const request = https.request(webhookOptions);

    request.on("error", (err) => {
      console.error(err);
    });

    request.write(dataString);
    request.end();
  }
});

app.listen(PORT, () => {
  console.log(`Example app listening at http://localhost:${PORT}`);
});
```

###### package.json に "start": "node index.js" を追加

```package.json
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node index.js"
  },
```

# Replit にて実行！

Replit にある Shell にて `express` をインストールします。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/6e404306-222a-d134-2d53-1f671cfa55d0.png)

package.json に express が追加されます。

```package.json
  "dependencies": {
    "@types/node": "^18.0.6",
    "express": "^4.18.2",
    "node-fetch": "^3.2.6"
  }
```


環境変数は以下の `Secrets` にて設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/859000d6-2e66-26d1-1b99-16da33da2ef2.png)

LINE_ACCESS_TOKEN を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/31170103-c6f0-b68a-5e76-8867a6824fe0.png)


上部の Run ボタンを押すと ホストされた URL が生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/e9cfa2f2-04f9-5f17-7f31-f109925e8c42.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/3ecda518-5121-9c8a-cb86-989146ecc9a3.png)

発行されたURLを Developers Console の Webhook に設定すれば完了！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/f893c01f-2bc0-4f1d-f85d-76a7d5b327be.png)

ボットをお友達登録して、メッセージ送信！無事に応答メッセージが返ってきました。

![IMG_9216.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/0401899b-d5fd-5460-c1b4-4e221876e182.png)

# ということで

とても簡単に実装・デプロイできてしまいました。ちょっと試す分には十分ではないでしょうか！