среда, 1 июня 2016 г.

Используем Wit.ai для создания умного Messanger bot


Если вы захотите создать бота для  Messanger, у вас не будет удобных команд и клавиатур как в Телеграм. В таком случае вам прийдеться определять на заранее определенные сообщения созданные вручную ответы или воспользоваться wit.ai для того что бы можно было определять сущность в контексте сообщений и создавать алгоритм разговора.

Wit.ai это открытая и бесплатная платформа которая помогает создавать приложения для распознавания голоса и текста. С помощью этой платформ можно определить контекст или семантику введенного и сказанного предложения. Wit предоставляет API и Панель управления для общей настройки диалогов и сущностей.



После того как вы создадите аккаунт на Wit и новый проект. Вам будет доступна панель с разделом
Inbox - сюда будут приходить запросы от ваших пользователей
Understanding - раздел где определены сущности , а также способ их распознавания и ключевые слова по которым сущности могут определяться. В Wit каждый раз при новом запросе , ваш бот  будет сам себя тренировать и добавлять ключевые слова к ваши сущностным.
Stories - здесь хранятся наши алгоритмы разговоров, последовательность в которой будут вызваться сущности и наши функции. Чем больше stories тем лучше наш бот будет распознавать сущности.


Создав cсущности и stories можно приступать к разработке. В моем примере я буду использовать node.js.

Загрузим нужные нам npm пакеты в package.json и загрузим их с помощью npm install.
{
"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"
}
}
view raw package.json hosted with ❤ by GitHub



Подключим нужные нам пакеты и теперь наш бот сможет отвечать на наши сообщения по заранее определенному алгоритму.
'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');
});
view raw server.js hosted with ❤ by GitHub


Результат после того как я подключил API еще одно сервиса для поиска товаров и создания заказов.


1 комментарий: