Если вы еще не знакомы с Airtable, я вам очень рекомендую посмотреть на этот сервис. Airtable — это не просто альтернатива таблицам Google, а полноценная база данных, которая очень легко интегрируется с любым сервисом, включая Dialogflow.
С помощью Airtable можно реализовать систему сбора данных любой сложности (прием заказов, учет клиентов и т.д.). Кроме того, Airtable заменит вам CRM и систему управления контентом. Вместо того, чтобы плодить сотни интентов в своем чат-боте, вы можете весь контент разместить в удобном табличном виде в Airtable, а чат-бот будет читать информацию из базы и формировать «на лету» ответ для вывода пользователям.
Как ни странно, но Airtable проще “подружить” с Dialogflow, чем Google Таблицы. Также просто, как Firebase, о коротом я писал немного ранее.
Для начала, создадим простую базу данных для теста. Бесплатный тариф Airtable позволяет нам создавать неограниченное количество баз данных, но не более 1200 записей в каждой. Не знаю, какие у вас задачи, но мне хватало бесплатного тарифа.
Итак, для примера я создал базу из одной таблицы (Table1) следующей структуры:
- Name
- Message
- Location
А чат-бот будет принимать контактные данные от пользователя и заносить напрямую в базу данных.
Возвращаемся к Dialogflow и создадим тестовый интент, в котором запросим от пользователя необходимые данные.
Я сделаю пока три параметра.
Не забываем активировать параметр «Enable webhook call for this intent», чтобы передать обработку интента в серверную функцию.
Ответ (Response) оставляем пустым, потому как его мы будем генерировать также в серверной функции.
Инициализация
Ну и, собственно, программный код в разделе Fulfillment. Подключаем пакет «airtable», инициализируем базу данных:
var Airtable = require('airtable');
var base = new Airtable({apiKey: 'API_KEY'}).base('API_BASE_NAME');
где API_KEY — это ваш персональный ключ, который лежит здесь https://airtable.com/account
API_BASE_NAME — это идентификатор базы данных, который лежит здесь https://airtable.com/api
Надеюсь, с этим понятно.
Следующая задача — получить значения параметров из Dialogflow и передать их в Airtable. Все основные функции по работе с Airtable и готовые примеры на JavaScript можно взять по ссылке: https://airtable.com/api
Не разбираетесь в JavaScript? Скопируйте и вставьте примеры кода, которые дает Airtable, они полностью рабочие. Там и выборка данных и создание и обновление записей и удаление. Всё есть.
Создание записи
Возвращаемся к нашему примеру. Для добавления новой записи, нас интересует раздел «Create records». Смотрим правила обращения к базе и пишем примерно такой код:
function airtableUpdate(agent) {
const name = agent.parameters.name;
const email = agent.parameters.email;
const message = agent.parameters.message;
return base('Table1').create([
{
"fields": {
"Name": name,
"Email": email,
"Message": message
}
}
]).then(result => {
agent.add('Заявка принята, ожидайте...');
})
}
Очень просто, верно?
Не забудьте связать функцию с нужным интентом, используя intentMap в нижней части программного кода. Сохраняем, запускаем интент и наблюдаем новую запись в таблице Airtable.
Выборка данных
Теперь про чтение данных. Тут всё намного интереснее. Можно запрашивать из базы любое количество записей, делать фильтрацию данных, поиск, использовать регулярные выражения и т.д.
Для извлечения данных напишем новую функцию. И попробуем получить не все записи, а только те, которые удовлетворяют нашему условию. Предположим, нам нужны пользователи проживающие в Киеве.
function airtableSelect(agent) {
return base("Table1").select({
maxRecords: 5
filterByFormula: 'AND({Location} = "Киев")'
})
.firstPage().then(result => {
var str = "";
result.forEach(function(record) {
str = str + record.fields.Name + " ";
});
agent.add('Найдено: '' + str);
Мы задействовали фильтрацию таблицы по полю Location. Получили N-ное количество записей (я указал не больше пяти) и имя каждого полученного пользователя заносим в переменную str. Далее, отправляем агенту ответ и добавляем переменную str со списком пользователей.
Обратите внимание на параметр maxRecords, он очень пригодится. Представьте, если база данных большая и в чат-бот нужно вернуть 20 или 50 или больше записей. Как их выводить пользователю? Будет логичным разбить выборку на порции (страницы) и используя функцию fetchNextPage() получать и возвращать данные.
Что касается поиска и фильтрации, то можно фильтровать сразу по нескольким полям, сравнивать целочисленные значения, даты. Осуществлять поиск по строковым значениям и много всего прочего. Подробнее о возможностях фильтрации смотрите в API.
Также было бы неплохо добавить код для обработки ошибок.
Если вам нужен не просто текстовый ответ, а представление данных в виде карточек или с кнопками, то используйте JSON.
Например:
"fulfillmentMessages": [
{
"card": {
"title": "какое-то значение",
"imageUri": "ссылка на картинку",
"buttons": [
{
"text": "button_text",
"postback": "ссылка куда-то"
}
]
}
}]
Здесь мы формируем ответ агенту (боту) в формате карточек с кликабельной кнопкой. Неплохо использовать для вывода карточек товаров. Подробнее в справке по Dialogflow. Только имейте ввиду, что код ответа, например, для Telegram может отличаться от Facebook Messenger или DF Messenger.
На базе примеров, которые я привел выше, вы можете построить полноценную систему управления контентом.
Возможности
Например, вы создаете чат-бота для интернет-магазина. У вас сотни товаров. Как быть? Создавать вручную сотни интентов с описанием каждого товара? Можно, конечно, если вам не жалко своего времени. Как потом поддерживать эту “махину”? Значительно проще вести учет товаров в базе данных, а чат-боту дать возможность динамически обращаться к базе и выбирать ту или иную информацию по запросу пользователя.
Airtable умеет импортировать данные из множества форматов плюс интегрироваться с сервисами автоматизации, такими как Zapier, Workato, Integromat. Нужны связанные таблицы? При создании поля укажите “Link to another record”:
Возможности просто колоссальные! Чтобы все их рассмотреть, понадобится не одна статья.
Я понимаю, что большинство читателей моего сайта не имеют отношения к программированию и по этому я постарался сделать примеры максимально простыми и понятными. Практически вся необходимая информация лежит в справке Dialogflow и Airtable. Берите и пользуйтесь.
Помощь
Если возникнут вопросы или столкнетесь с трудностями — добро пожаловать на консультацию. Можно писать сразу в Telegram, для согласования все организационных вопросов.
Постараюсь помочь. Успехов!
P.S. Буду очень благодарен за обратную связь в виде комментариев. Если есть пожелания по новым материалам — пишите.