-
Notifications
You must be signed in to change notification settings - Fork 21
/
index.mjs
72 lines (59 loc) · 2.29 KB
/
index.mjs
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Webサーバのライブラリ: Express
import express from 'express';
import crypto from 'crypto';
// 環境変数の定義を.envファイルから読み込む(開発用途用)
import dotenv from 'dotenv';
import { LineApi } from './line-api.mjs';
// .envファイル空環境変数を読み込み
dotenv.config();
// LINEのチャネルシークレットをCHANNEL_SECRET環境変数から読み込み
const CHANNEL_SECRET = process.env.CHANNEL_SECRET;
const CHANNEL_ACCESS_TOKEN = process.env.CHANNEL_ACCESS_TOKEN;
// expressの初期化
const app = express();
app.use(express.json({
verify: (req, _res, buf) => {
req.rawBody = buf
}
}));
// TCP/8080ポートでサーバを起動
app.listen(8080);
const lineApi = new LineApi(CHANNEL_ACCESS_TOKEN);
// ルートのエンドポイント定義
// レスポンスがきちんと返せているかの確認用
app.get('/', (request, response) => {
response.status(200).send('Hello');
});
// webhookを受け取るエンドポイントを定義
// POST /webhook
app.post('/webhook', (request, response, buf) => {
// https://developers.line.biz/ja/docs/messaging-api/receiving-messages/
// 受け取ったwebhookのイベント
const body = request.body;
// デバッグ用として出力
console.log(body);
// 署名検証(全くの第三者がリクエストを送ってきたときの対策=なくても動くが本番環境では大事)
if (!verifySignature(request.rawBody, request.headers['x-line-signature'], CHANNEL_SECRET)) {
response.status(401).send({});
return;
}
// 到着したイベントのevents配列から取りだし
body.events.forEach(async (event) => {
switch (event.type) {
case 'message': // event.typeがmessageのとき応答
// 頭に 返信: をつけて、そのまま元のメッセージを返す実装
await lineApi.replyMessage(event.replyToken, `返信: ${event.message.text}`);
break;
}
});
response.status(200).send({});
});
// webhookの署名検証
// https://developers.line.biz/ja/reference/messaging-api/#signature-validation
function verifySignature(body, receivedSignature, channelSecret) {
const signature = crypto
.createHmac("SHA256", channelSecret)
.update(body)
.digest("base64");
return signature === receivedSignature;
}