Created
October 27, 2018 06:33
-
-
Save anoochit/a065d662b959593a85b9a8c6493e2ad1 to your computer and use it in GitHub Desktop.
line beacon chatbot
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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