"use strict"; const line = require("@line/bot-sdk"); const express = require("express"); const config = require("./config.json"); // create LINE SDK client const client = new line.Client(config); const app = express(); // webhook callback app.post("/webhook", line.middleware(config), (req, res) => { // req.body.events should be an array of events if (!Array.isArray(req.body.events)) { return res.status(500).end(); } // handle events separately Promise.all( req.body.events.map((event) => { console.log("event", event); // check verify webhook event if ( event.replyToken === "00000000000000000000000000000000" || event.replyToken === "ffffffffffffffffffffffffffffffff" ) { return; } return handleEvent2(event); }) ) .then(() => res.end()) .catch((err) => { console.error(err); res.status(500).end(); }); }); // simple reply function const replyText = (token, texts) => { texts = Array.isArray(texts) ? texts : [texts]; return client.replyMessage( token, texts.map((text) => ({ type: "text", text })) ); }; const handleEvent = (event) => { // const payload = { // type: "text", // text: "Hello From PUI", // }; const payload = { "type": "text", // ① "text": "Select your favorite food category or send me your location!", "quickReply": { // ② "items": [ { "type": "action", // ③ "imageUrl": "https://example.com/sushi.png", "action": { "type": "message", "label": "Sushi", "text": "Sushi" } }, { "type": "action", "imageUrl": "https://example.com/tempura.png", "action": { "type": "message", "label": "Tempura", "text": "Tempura" } }, { "type": "action", // ④ "action": { "type": "location", "label": "Send location" } } ] } } return client.replyMessage(event.replyToken, payload); }; // callback function to handle a single event function handleEvent2(event) { switch (event.type) { case 'message': const message = event.message; switch (message.type) { case 'text': return handleText(message, event.replyToken); case 'image': return handleImage(message, event.replyToken); case 'video': return handleVideo(message, event.replyToken); case 'audio': return handleAudio(message, event.replyToken); case 'location': return handleLocation(message, event.replyToken); case 'sticker': return handleSticker(message, event.replyToken); default: throw new Error(`Unknown message: ${JSON.stringify(message)}`); } case 'follow': return replyText(event.replyToken, 'Got followed event'); case 'unfollow': return console.log(`Unfollowed this bot: ${JSON.stringify(event)}`); case 'join': return replyText(event.replyToken, `Joined ${event.source.type}`); case 'leave': return console.log(`Left: ${JSON.stringify(event)}`); case 'postback': let data = event.postback.data; return replyText(event.replyToken, `Got postback: ${data}`); case 'beacon': const dm = `${Buffer.from(event.beacon.dm || '', 'hex').toString('utf8')}`; return replyText(event.replyToken, `${event.beacon.type} beacon hwid : ${event.beacon.hwid} with device message = ${dm}`); default: throw new Error(`Unknown event: ${JSON.stringify(event)}`); } } function handleText(message, replyToken) { return replyText(replyToken, message.text); } function handleImage(message, replyToken) { return replyText(replyToken, "Got Image"); } function handleVideo(message, replyToken) { return replyText(replyToken, "Got Video"); } function handleAudio(message, replyToken) { return replyText(replyToken, "Got Audio"); } function handleLocation(message, replyToken) { return replyText(replyToken, "Got Location"); } function handleSticker(message, replyToken) { return replyText(replyToken, "Got Sticker"); } const port = config.port; app.listen(port, () => { console.log(`listening on ${port}`); });