Skip to content

Instantly share code, notes, and snippets.

@anoochit
Created October 27, 2018 06:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anoochit/a065d662b959593a85b9a8c6493e2ad1 to your computer and use it in GitHub Desktop.
Save anoochit/a065d662b959593a85b9a8c6493e2ad1 to your computer and use it in GitHub Desktop.
line beacon chatbot
'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 handleEvent(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 }))
);
};
// callback function to handle a single event
function handleEvent(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':
//var Buffer = require('safe-buffer').Buffer
//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}`);
// request random joke message from icndb
var request = require('request');
request('http://api.icndb.com/jokes/random', function (err, res, body) {
var obj = JSON.parse(body);
var joke=obj.value.joke;
return replyText(event.replyToken, joke);
});
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 = process.env.PORT || config.port;
app.listen(port, () => {
console.log(`listening on ${port}`);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment