Если вы захотите создать бота для Messanger, у вас не будет удобных команд и клавиатур как в Телеграм. В таком случае вам прийдеться определять на заранее определенные сообщения созданные вручную ответы или воспользоваться wit.ai для того что бы можно было определять сущность в контексте сообщений и создавать алгоритм разговора.
Wit.ai это открытая и бесплатная платформа которая помогает создавать приложения для распознавания голоса и текста. С помощью этой платформ можно определить контекст или семантику введенного и сказанного предложения. Wit предоставляет API и Панель управления для общей настройки диалогов и сущностей.
После того как вы создадите аккаунт на Wit и новый проект. Вам будет доступна панель с разделом
Inbox - сюда будут приходить запросы от ваших пользователей
Understanding - раздел где определены сущности , а также способ их распознавания и ключевые слова по которым сущности могут определяться. В Wit каждый раз при новом запросе , ваш бот будет сам себя тренировать и добавлять ключевые слова к ваши сущностным.
Stories - здесь хранятся наши алгоритмы разговоров, последовательность в которой будут вызваться сущности и наши функции. Чем больше stories тем лучше наш бот будет распознавать сущности.
Создав cсущности и stories можно приступать к разработке. В моем примере я буду использовать node.js.
Загрузим нужные нам npm пакеты в package.json и загрузим их с помощью npm install.
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
{ | |
"name": "mbot", | |
"version": "0.0.1", | |
"description": "A chat bot.", | |
"main": "server.js", | |
"repository": "", | |
"author": "Goryach Eduard", | |
"scripts": { | |
"start": "node server.js" | |
}, | |
"dependencies": { | |
"express": "~3.2.4", | |
"node-wit" : "latest", | |
"messenger-bot" : "latest" | |
} | |
} |
Подключим нужные нам пакеты и теперь наш бот сможет отвечать на наши сообщения по заранее определенному алгоритму.
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' | |
var express = require('express'), | |
http = require('http'), | |
Bot = require('messenger-bot'); | |
const Wit = require('node-wit').Wit; | |
let bot = new Bot({ | |
token: '', | |
verify: '', | |
page_id: '' | |
}) | |
// нужно для Wit | |
const firstEntityValue = (entities, entity) => { | |
const val = entities && entities[entity] && | |
Array.isArray(entities[entity]) && | |
entities[entity].length > 0 && | |
entities[entity][0].value; | |
if (!val) { | |
return null; | |
} | |
return typeof val === 'object' ? val.value : val; | |
}; | |
const sessions = {}; | |
const findOrCreateSession = (fbid) => { | |
let sessionId; | |
Object.keys(sessions).forEach(k => { | |
if (sessions[k].fbid === fbid) { | |
sessionId = k; | |
} | |
}); | |
if (!sessionId) { | |
sessionId = new Date().toISOString(); | |
sessions[sessionId] = {fbid: fbid, context: {}}; | |
} | |
return sessionId; | |
}; | |
bot.on('error', (err) => { | |
console.log(err.message) | |
}) | |
//buttons posback | |
// обработчик на новые сообщения | |
bot.on('message', (payload, reply) => { | |
let text = payload.message.text | |
var sessionId = findOrCreateSession(payload.sender.id); | |
const actions = { | |
say(sessionId, context, message, cb) { | |
const recipientId = sessions[sessionId].fbid; | |
if (recipientId) { | |
reply ({ text: message}); | |
} else { | |
console.log('Oops! Couldn\'t find user for session:', sessionId); | |
cb(); | |
} | |
}, | |
merge(sessionId, context, entities, message, cb) { | |
const tovar = firstEntityValue(entities, 'tovar'); | |
if(context.adress) { | |
delete context.adress; | |
} | |
if(context.operator) { | |
delete context.operator; | |
} | |
if (tovar) { | |
context.tovar = tovar; | |
} | |
const adress = firstEntityValue(entities, 'adress'); | |
if (adress) { | |
if(context.tovar) { | |
delete context.tovar; | |
} | |
if(context.operator) { | |
delete context.operator; | |
} | |
context.adress = adress; | |
} | |
const operator = firstEntityValue(entities, 'operator'); | |
if (operator) { | |
if(context.tovar) { | |
delete context.tovar; | |
} | |
if(context.adress) { | |
delete context.adress; | |
} | |
context.operator = operator; | |
} | |
cb(context); | |
}, | |
error(sessionId, context, error) { | |
console.log(error.message); | |
}, //Приветсвие | |
['auth'](sessionId, context, cb) { | |
reply({ text: 'Привет я Твой Bot.' }) | |
cb(context); | |
}, | |
['search'](sessionId, context, cb) { | |
reply({ text: 'Поиск.' }) | |
}); | |
cb(context); | |
}, | |
['setAdress'](sessionId, context, cb) { | |
//установка адреса | |
context.adress; | |
cb(context); | |
}, | |
['orders'](sessionId, context, cb) { | |
//Корзина | |
cb(context); | |
}, | |
['oformit'](sessionId, context, cb) { | |
//Прием заказов | |
cb(context); | |
}, | |
['sendtochat'](sessionId, context, cb) { | |
//Отправка в чат | |
cb(context); | |
},['gethelp'](sessionId, context, cb) { | |
cb(context); | |
}, | |
}; | |
//Wit Server Access Token | |
witToken = ''; | |
const wit = new Wit(, actions); | |
wit.runActions( | |
sessionId, // the user's current session | |
text, // the user's message | |
sessions[sessionId].context, // the user's current session state | |
(error, context) => { | |
if (error) { | |
console.log('Oops! Got an error from Wit:', error); | |
} else { | |
// Our bot did everything it has to do. | |
// Now it's waiting for further messages to proceed. | |
console.log(context); | |
// Based on the session state, you might want to reset the session. | |
// This depends heavily on the business logic of your bot. | |
// Example: | |
if (context['done']) { | |
delete sessions[sessionId]; | |
} | |
// Updating the user's current session state | |
sessions[sessionId].context = context; | |
} | |
} | |
); | |
}); | |
//Для Webhook | |
var app = express(); | |
http.createServer(bot.middleware()).listen(process.env.PORT); | |
app.get('/', function (req, res) { | |
res.send('Bot working'); | |
}); |
Результат после того как я подключил API еще одно сервиса для поиска товаров и создания заказов.
Chatfuel пробовали пользоваться?
ОтветитьУдалить