Если вы еще не знакомы с Airtable, я вам очень рекомендую посмотреть на этот сервис. Airtable — это не просто альтернатива таблицам Google, а полноценная база данных, которая очень легко интегрируется с любым сервисом, включая Dialogflow.

С помощью Airtable можно реализовать систему сбора данных любой сложности (прием заказов, учет клиентов и т.д.). Кроме того, Airtable заменит вам CRM и систему управления контентом. Вместо того, чтобы плодить сотни интентов в своем чат-боте, вы можете весь контент разместить в удобном табличном виде в Airtable, а чат-бот будет читать информацию из базы и формировать «на лету» ответ для вывода пользователям.

Как ни странно, но Airtable проще “подружить” с Dialogflow, чем Google Таблицы. Также просто, как Firebase, о коротом я писал немного ранее.

Для начала, создадим простую базу данных для теста. Бесплатный тариф Airtable позволяет нам создавать неограниченное количество баз данных, но не более 1200 записей в каждой. Не знаю, какие у вас задачи, но мне хватало бесплатного тарифа.

Итак, для примера я создал базу из одной таблицы (Table1) следующей структуры:

  • Name
  • Email
  • Message
  • Location

А чат-бот будет принимать контактные данные от пользователя и заносить напрямую в базу данных.

Возвращаемся к Dialogflow и создадим тестовый интент, в котором запросим от пользователя необходимые данные.

Я сделаю пока три параметра.

1

Не забываем активировать параметр «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”:

2

Возможности просто колоссальные! Чтобы все их рассмотреть, понадобится не одна статья.

Я понимаю, что большинство читателей моего сайта не имеют отношения к программированию и по этому я постарался сделать примеры максимально простыми и понятными. Практически вся необходимая информация лежит в справке Dialogflow и Airtable. Берите и пользуйтесь.

Помощь

Если возникнут вопросы или столкнетесь с трудностями — добро пожаловать на консультацию. Можно писать сразу в Telegram, для согласования все организационных вопросов.

Постараюсь помочь. Успехов!

P.S. Буду очень благодарен за обратную связь в виде комментариев. Если есть пожелания по новым материалам — пишите.