使用 Node 建立 Line Bot 聊天機器人

建立專案

建立專案。

1
2
mkdir line-bot-node
cd line-bot-node

初始化專案。

1
npm init -y

安裝依賴套件。

1
npm install express axios dotenv

新增 .env 檔。

1
LINE_CHANNEL_ACCESS_TOKEN=

新增 .gitignore 檔。

1
2
/node_modules
.env

建立頻道

登入 LINE Developers 頁面,選擇 Messaging API 產品,建立一個 Channel。

實作

新增 services/line.js 檔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import dotenv from 'dotenv';
import axios from 'axios';

dotenv.config();

const instance = axios.create({
baseURL: 'https://api.line.me',
timeout: 9000,
headers: {
Authorization: `Bearer ${process.env.LINE_CHANNEL_ACCESS_TOKEN}`,
},
});

/**
* @param {string} replyToken
* @param {Array<Object>} messages
* @param {string} messages[].type
* @param {string} messages[].text
*/
const reply = ({
replyToken,
messages,
}) => instance.post('/v2/bot/message/reply', {
replyToken,
messages,
});

export {
reply,
};

export default null;

新增 api/index.js 檔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import express from 'express';
import { reply } from '../services/line.js';

const app = express();

app.use(express.json());

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

app.post('/webhook', async (req, res) => {
const events = req.body.events || [];
const replies = events
.filter(({ type }) => type === 'message')
.map(({ replyToken, message }) => reply({
replyToken,
messages: [
{
type: 'text',
text: message.text,
},
],
}));
await Promise.all(replies);
res.sendStatus(200);
});

export default app;

在專案根目錄新增 vercel.json 檔。

1
2
3
{
"rewrites": [{ "source": "/(.*)", "destination": "/api" }]
}

推送程式碼到儲存庫。

部署

Vercel 平台註冊帳號,並且連結儲存庫。

然後在設定頁面,新增相關環境變數。

將 Function 區域改為東京或新加坡。

設定

  1. 進到「Messaging API」頁面,設置應用程式的「Webhook URL」。
1
https://line-bot-node.vercel.app/webhook
  1. 點選「Verify」按鈕。

  2. 將「Use webhook」功能開啟。

  3. 將「Auto-reply messages」和「Greeting messages」功能關閉。

程式碼

參考資料