Русский
Русский
English
Статистика
Реклама

Чатбот

Из песочницы Urban Bot или как писать чат-ботов для Telegram, Slack, Facebook на React.js

27.07.2020 22:10:16 | Автор: admin

image


В этой статье я хочу познакомить с новой библиотекой Urban Bot, которая адаптирует React для написания чат-ботов. Ниже я расскажу, зачем эта библиотека появилась на свет, какие дает преимущества и как написать вашего первого чат-бота.


Чат-бот это чаще всего отдельный чат в мессенджере, в котором вы общаетесь не с человеком, а с программой. Он может присылать сообщения в виде текста, изображений, кнопок и многих других UI элементов и реагировать на сообщения от пользователей. Современные чат-боты это полноценные UI приложения внутри мессенджеров.

В отличии от большинства чат-бот библиотек, которые чаще всего просто оборачивают http запросы в функции с готовыми аргументами и предоставляют подписки вида bot.on('message', callback), иногда позволяя передавать контекст между вызовами, Urban Bot предлагает совершенно иной подход к разработке чат-ботов через декларативное программирование и компонентный подход. Живой пример, написанный на Urban Bot, вы можете попробовать в Telegram, cсылка на чат-бот, и посмотреть код на GitHub.


Как мы заметили выше, чат-боты это полноценные UI приложения. А какой язык в 2020 и какая библиотека наиболее подходит для разработки UI приложений? Правильно, JavaScript и React. Такая интеграция позволяет легко и непринужденно строить чат-боты любой сложности без единого знания об API мессенджеров. Далее я расскажу, как создавать простые компоненты и на их основе строить сложных чат-ботов, работать с навигацией, создавать диалоги любой вложенности, писать одно приложение и запускать в любых мессенджерах, и многое другое.


Отправка сообщений


Так выглядит самый простой пример на Urban Bot. Для отправки текстового сообщения нам нужно создать функцию и вернуть из него готовый компонент Text с текстом внутри, который мы хотим отправить. Когда компонент отрендериться, все пользователи чат-бота получат сообщение "Hello, world!".


import React from 'react';import { Text } from '@urban-bot/core';function App() {    return (        <Text>           Hello, world!        </Text>    );}

Изображение можно отправить так:


import React from 'react';import { Image } from '@urban-bot/core';function App() {    const imageByURL =  'https://some-link.com/image.jpg';    return <Image file={imageByURL} />;}

Urban Bot имеет готовый набор компонентов, для каждого вида сообщений, для файлов File, для кнопок ButtonGroup и много других, подробнее можно взглянуть здесь. В каждый из них можно передать определенный набор пропсов, например, имитировать будто бот печатает сообщение 1 секунду <Text simulateTyping={1000}>.


Получение сообщений


Мы рассмотрели как посылать сообщения, давайте разберемся как подписываться на сообщения от пользователей. За подписки в Urban Bot отвечают React Hooks.


Чтобы подписаться на текстовые сообщения, мы можем использовать хук useText.


import React from 'react';import { Text, useText } from '@urban-bot/core';function App() {    useText(({ text }) => {        console.log(`Пользователь отправил сообщение ${text}`);    });    return (        <Text>            Hello, world!        </Text>    );}

Urban Bot предоставляет готовы набор хуков для разных типов сообщений. Например, useImage, если пользователь отправил изображение, useFile и т.д. Полный список здесь. В каждый хук также приходит мета информация, кто отправил сообщение и т.д.


Эхо бот


Теперь, зная базовые концепции, мы можем соединить получение и отправку сообщения. Напишем простой компонент, который после получения сообщения отправит его пользователю обратно.


В этом компоненте мы впервые добавим работу с переменными через React хук useState. Этот хук возвращает переменную и функцию, чтобы ее изменять. React.useState нужен, чтобы изменение переменной приводило к ререндеру и, соответсвенно, отправке нового сообщения. Мы определим начальное значение переменной text как "Привет" и передадим в компонент Text. Также мы подпишемся на сообщения от пользователей с помощью хука useText, и будем изменять text через функцию setText. После вызова setText React перерендерит компонент Echo с новым значением, и пользователь получит новое сообщение с тем что он сам отправил боту.


import React from 'react';import { Text, useText } from '@urban-bot/core';function Echo() {    const [text, setText] = React.useState('Привет!');    useText(({ text }) => {        setText(text);    });    return (        <Text>            {text}        </Text>    );}

Кнопки


Давайте также напишем пример с кнопками, сделаем простейший счетчик. Для этого нам понадобятся компоненты ButtonGroup и Button. Каждой кнопке мы определим свой обработчик, который будет менять count на +1 или -1 и будем передавать результат в ButtonGroup в проп title. Мы установим проп isNewMessageEveryRender как false, чтобы при последующих ререндерах отправлялось не новое сообщение с новыми кнопками, а просто изменялось начальное сообщение.


import React from 'react';import { ButtonGroup, Button } from '@urban-bot/core';function Counter() {    const [count, setCount] = React.useState(0);    const increment = () => setCount(count + 1);    const decrement = () => setCount(count - 1);    return (        <ButtonGroup title={count} isNewMessageEveryRender={false}>            <Button onClick={increment}>+1</Button>            <Button onClick={decrement}>-1</Button>        </ButtonGroup>    );}


Мы написали два простых компонента эхо и счетчик. Давайте представим, что мы хотим чтобы они были у нас в одном чат-боте, но работали независимо. Для этого мы можем подключить компонент Router и разделить компоненты по разным путям. Пути это обычные сообщения от пользователей.


Теперь, когда пользователь напишет "/echo" отрендериться компонент Echo, когда "/counter" управление перейдет в Counter. Роуты также могут принимать path как regexp.


import React from 'react';import { Router, Route } from '@urban-bot/core';import { Echo } from './Echo';import { Counter } from './Counter';function App() {    return (        <Router>            <Route path="/echo">                <Echo />            </Route>            <Route path="/counter">                <Counter />            </Route>        </Router>    );}

Визуальный пример, чтобы увидеть как будет работать код.


image


Если вы почувствовали концепцию, то уже поняли, что можно создавать десятки, сотни компонентов, комбинировать их вместе, либо разделять роутером, делиться компонентами между разными чат-ботами и строить действительно сложные SPA внутри мессенджеров.


Форматирование текста


Urban Bot позволяет стилизовать сообщения через привычные HTML теги. Писать жирным <b>, курсивом <i>, зачеркнутым <s>, переносить строки <br /> и так далее, полный список здесь.


Пример
const someCode = `function sum2() {    return 2 + 2;}if (sum2() !== 4) {    console.log('WTF');}`;<Text>    Usual text    <br />    <b>Bold text</b>    <br />    <i>Italic text</i>    <br />    <u>Underscore text</u>    <br />    <s>Strikethrough text</s>    <br />    <q>quote</q>    <br />    <b>        Bold and <s>Strikethrough text</s>    </b>    <br />    <code >Code 2 + 2</code >    <br />    <pre>{someCode}</pre>    <br />    <a href="http://personeltest.ru/aways/github.com/urban-bot/urban-bot">External link</a></Text>


Диалоги


Чат-боты могут вести диалоги с пользователем, что-то спрашивать, реагировать на сообщения в зависимости от ответа пользователя. В Urban Bot встроен компонент Dialog, который позволяет легко создавать диалоги любой сложности.


Пример плоского диалога. Бот задаст первый вопрос, после ответа задаст второй, потом третий, потом запустит callback onFinish с готовыми ответами. На каждом шаге можно обрабатывать ответ пользователя через callback onNext.


import React from 'react';import { Dialog, DialogStep, Text } from '@urban-bot/core';function FlatDialogExample() {    return (        <Dialog onFinish={(answers) => console.log(answers)}>            <DialogStep                content={<Text>Привет, как тебя зовут?</Text>}                 id="name"                onNext={(name) => console.log(name)}            >                <DialogStep                    content={<Text>Cколько тебе лет?</Text>}                    id="age"                >                    <DialogStep                         content={<Text>Из какого ты города?</Text>}                        id="city"                    />                </DialogStep>            </DialogStep>        </Dialog>    );}

Можно получать на следующем шаге прошлый ответ через паттерн render-props .


function FlatDialogExample() {    return (        <Dialog>            <DialogStep content={<Text>Привет, как тебя зовут?</Text>}>                {(name) => (                    <DialogStep                         content={<Text>{`${name}, cколько тебе лет?`}</Text>}                    />                )}            </DialogStep>        </Dialog>    );}

Можно добавить валидацию на каждый шаг.


function FlatDialogExample() {    return (        <Dialog onFinish={(answers) => console.log(answers)}>            <DialogStep                content={<Text>Привет, как тебя зовут?</Text>}                id="name"                validation={{                     isValid: (answer) => answer !== 'Самуэль',                     errorText: 'Самуэль заблокирован.'                 }}            >                // ...            </DialogStep>        </Dialog>    );}

Также возможно построение более сложных диалогов, когда бот отвечает определенным образом в зависимости от ответа пользователя. Для предопределенных ответов можно использовать кнопки.


import React from 'react';import { Dialog, DialogStep, Text, ButtonGroup, Button } from '@urban-bot/core';function TreeDialogExample() {    return (        <Dialog>            <DialogStep                content={                    <ButtonGroup title="Привет, что вы хотите купить?">                        <Button id="hat">Футболка</Button>                        <Button id="glasses">Очки</Button>                    </ButtonGroup>                }            >                <DialogStep                    match="hat"                    content={                        <ButtonGroup title="Футболка какого размера?">                            <Button id="m">S</Button>                            <Button id="s">M</Button>                            <Button id="l">L</Button>                        </ButtonGroup>                    }                />                <DialogStep                    match="glasses"                    content={                        <ButtonGroup title="Очки какого цвета?">                            <Button id="black">Черный</Button>                            <Button id="white">Белый</Button>                        </ButtonGroup>                    }                />            </DialogStep>        </Dialog>    );}

Состояние


Что вы можете использовать для управления состоянием? Все то же что и в любом React приложении. Можете использовать React useState и передавать состояние ниже по дереву компонентов через пропсы или React Context. Можно использовать библиотеки для управления состоянием: Redux (пример), MobX (пример), Apollo и любые другие, которые обычно используют вместе с React, вы можете даже переиспользовать готовые части из готовых React Web или React Native приложений, так как Urban Bot использует тот же чистый React, который работает в миллионах приложений.


Сессия


Urban Bot запускается на сервере, соответсвенно, все логика от всех чатов и пользователей обслуживается на одном железе, что кардинально отличается от стандартных React приложений, которые запускаются на стороне каждого клиента. Urban Bot решает эту проблему на своей стороне и отображает приложение уникальным для каждого пользователя, так что, если вы уже писали на React веб или мобильные приложения, вы не почувствуете разницу.


В любом примере на Urban Bot уже вшита работа с сессией. Например, в примере ниже у каждого пользователя, кто зайдет в персональный чат-бот, будет его собственный счетчик.


function Counter() {    const [count, setCount] = React.useState(0);    const increment = () => setCount(count + 1);    const decrement = () => setCount(count - 1);    return (        <ButtonGroup title={count} isNewMessageEveryRender={false}>            <Button onClick={increment}>+1</Button>            <Button onClick={decrement}>-1</Button>        </ButtonGroup>    );}

Если нам понадобится глобальный счетчик, то к этому примеру можно сделать хук, который будет содержать уже общую информацию.


function Counter() {    const [count, setCount] = useGlobalCount();   // ...}

Также, в любом месте приложения мы можем получить данные о конкретном чате, какой пользователь написал, с каким никнеймом и т.д. Если чат-бот персональный, то chat и from будут совпадать.


import React from 'react';import { Text, useText, useBotContext } from '@urban-bot/core';function UserId() {    const { chat } = useBotContext();    useText(({ from }) => console.log(`Пришло сообщение от ${from.username}`));   return <Text>Чат id {chat.id}</Text>;}

Типизация


Urban Bot написан на TypeScript, соответсвенно проект полностью типизирован, и если вы пишете на TypeScript, вам будет очень удобно.


Запуск в мессенджерах


Большой плюс Urban Bot, что он не привязан ни к одному мессенджеру. Есть основной пакет @urban-bot/core, который позволяет создавать абстрактных чат-ботов, а уже их подключать к определенным мессенджерам. В данный момент есть поддержка Telegram, Slack, Facebook. В дальнейшем, мы планируем добавлять любые мессенджеры, где есть чат-боты и открытое API. Если вам интересно, и вы хотите писать Urban Bot приложения для других мессенджеров, скажем Viber, Discord или у вас есть свой мессенджер то пишите к нам в группу https://t.me/urbanbotjs, одной просьбы будет достаточно, чтобы появилось большая мотивация реализовать ваш функционал.


Теперь перейдем к практике. Выше мы создавали компоненты и приложение, но не запускали его. Для запуска нам нужно выбрать мессенджер или мессенджеры, в которых мы хотим запустить наше приложение.


Скажем, у нас есть готовое приложение App и мы хотим его запустить его в Telegram. Для этого нам понадобится класс UrbanBotTelegram из пакет @urban-bot/telegram. Функция render из @urban-bot/core подобная ReactDOM.render и компонент Root. Мы создаем экземпляр UrbanBotTelegram и передаем туда бот токен из Telegram, также можно передать isPolling, чтобы не настраивать вебхук, и бот работал локально. Готовый экземпляр мы передаем в компонент Root, и оборачиваем наше готовое приложение и, соответсвенно, передаем все в функцию render, которая запустит все процессы.


Более подробная инструкция с видео как разрабатывать локально и деплоить Telegram бота можно прочитать в инструкции.


import React from 'react';import { render, Root } from '@urban-bot/core';import { UrbanBotTelegram } from '@urban-bot/telegram';import { App } from './App';const urbanBotTelegram = new UrbanBotTelegram({    token: 'telegramToken',    isPolling: true,});render(    <Root bot={urbanBotTelegram}>        <App />    </Root>);

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


// ...import { UrbanBotSlack } from '@urban-bot/slack';// ...render(    <Root bot={urbanBotTelegram}>        <App />    </Root>);const urbanBotSlack = new UrbanBotSlack({    signingSecret: 'slackSigningSecret',    token: 'slackToken',});render(    <Root bot={urbanBotSlack}>        <App />    </Root>);

Прямой вызов API


С помощью Urban Bot вы можете создавать чат-ботов просто описывая их через компоненты. А что если вам будет нужно вручную вызвать API? Каждый экземпляр UrbanBot* содержит в себе API клиент для активного мессенджера. Рассмотрим пример для Telegram.


Мы можем получить bot с помощью хука useBotContext. bot содержит client и type c типом мессенджера. client будет представлять собой экземпляр библиотеки node-telegram-bot-api . В любом месте приложения можно получить client и вызвать любой метод на ваше усмотрение, скажем блокировать пользователя, если он написал нецензурное сообщение.


import React from 'react';import { useText, useBotContext } from '@urban-bot/core';function SomeComponent() {    const { bot } = useBotContext();    useText(({ text, chat, from }) => {        if (text.includes('бл***')) {            bot.client.kickChatMember(chat.id, from.id);        }    });    // ...}

В каждом мессенджере уникальный API. Если вы разрабатываете несколько мессенджеров одновременно, можно отделять функционал сравнивая bot.type.


import { useBotContext } from '@urban-bot/core';import { UrbanBotTelegram } from '@urban-bot/telegram';import { UrbanBotSlack } from '@urban-bot/slack';function SomeComponent() {    const { bot } = useBotContext();    if (bot.type === UrbanBotTelegram.type) {        // telegram api        bot.client.kickChatMember(/* ... */);    }    if (bot.type === UrbanBotSlack.type) {        // slack api        bot.client.conversations.kick(/* ... */);    }    // ...}

Как попробовать?


У Urban Bot есть стартер, который позволит вам начать разрабатывать чат-ботов за минуту, сделан по аналогии с create-rect-app. Все что вам нужно, чтобы попробовать Urban Bot это выполнить команду в терминале для


TypeScript


npx create-urban-bot my-app

JavaScript


npx create-urban-bot my-app --template js

Команда склонирует шаблон приложения с нужными зависимостями и скриптами на ваш компьютер, и вам останется только открыть проект, передать ваши токены в .env файл и расскоментировать мессенджеры, которые вы хотите разрабатывать. Видео инструкция.


Итого


Несмотря на то что Urban Bot запустился только недавно, на мой взгляд это библиотека с огромным потенциалом. Только представьте, если у вас есть базовые знания React, вы можете написать чат-бот любой сложности на все возможные платформы, создавать и использовать библиотеки с готовым набором компонентов на манер ui-kit, переиспользовать код между вашими другими UI приложеними на React, будь то web или mobile.


Если вы уже разрабатывали чат-ботов, попробуйте Urban Bot, вы почувствуете как библиотека делает за вас кучу работы. Если никогда не разрабатывали, но имеете представление о React, то напишете вашего первого чат-бота за 5 минут. Если вам понравилась идея и хотите, чтобы проект развивался дальше, вступайте в нашу группу в Telegram, ставьте звезду на гитхабе, будем рады любому фидбеку.


Полезные ссылки


Сайт
Github
Группа в Telegram
Наглядный чат-бот в Telegram, с открытым кодом.
Как создать Todo List чат-бот в Telegram с помощью React.js

Подробнее..

Бот в инструментах no code. Детали реализации

18.06.2020 12:21:50 | Автор: admin
Продолжаем экспериментировать с парадигмой no code (и отчасти low code).
Собрали чатбота, помогающего дочитывать большие архивы статей.
В статье расскажем, какие инструменты взяли и на какие их ограничения наткнулись.

image

Материал для статьи и проект собраны вместе с roman_nebel.

Disclaimer. Да, нам тоже проще написать чистым кодом. Но суть nocode-упражнения именно в том, чтобы собирать полезные сервисы из готовых инструментов. Начали давно, продолжаем, нравится. Постепенно обо всём расскажем.

Аудитории Хабра, видимо, интересны технические, а не продуктовые подробности. Если о продуктовом слое работы в no code проектах без погружения в детали реализации тоже есть смысл рассказывать дайте знать в комментариях.

Что хотели сделать


Хотели помочь людям (и себе):

  • приучить читать на английском;
  • уходить на обед: Вот статья, почитаешь за столом.


Делать такой микропродукт решили через Telegram-бота:

  1. Раз в день присылает ссылку на статью из архива. Для пробы раздербанили архив статей про дизайн ReadingDesign. Будет ещё.
  2. Спрашивает читателя, понравилась статья или нет. Результаты складываем, копим данные, потом сможем найти самые интересные статьи и оценить активность пользователей.

Бота можно щупать: @bracho_read_bot
Баги есть. Идеи по фичам тоже есть. И план нового релиза есть.
Короче, всё есть, но много не мало, так что кидайте и свои мысли.

Что использовали

Chatforma. Один из многих (выбирали) конструкторов для чатов. Не идеальный, но хоть как-то делает что нужно. О выборе ниже.

Integromat. Передаёт данные туда-сюда по правилам и с условиями. Выбор по умолчанию для no code проектов.

Airtable. База данных с продвинутым интерфейсом и хорошей интеграцией с другими инструментами. Тоже выбор по умолчанию (а ещё мы её давно используем в автоматизации своих бизнес-процессов, но это другой разговор).

Детали по инструментам

Bot Father

Для начала нам нужен сам бот, точнее аккаунт для него в Telegram. Самый простой способ найти Отца Ботов (@BotFather) в Телеграм и в нем зарегистировать нового бота. Пошаговое описание гуглится на любой вкус, если в двух словах: придумываем имя бота, его логин и все. После успеха вам придет токен (ключ для идентификации и связи бота с внешним миром), который и был нам нужен на этом этапе.

Chatforma

В сети есть куча сервисов для создания простеньких ботов для социальных сетей. Но у них у всех есть родовая травма: они созданы для воронок продаж. А потому простые и тупые.

Самый распространенный паттерн: пришел покупатель, с ним поздоровались, спросили, что нужно, облизали и начали навязчиво рассылать спам. Все это делается с помощью простых текстовых развилок и интеграции данных (например, с Битрикс24). Никакого интерактива.

Конечно, есть и решения вроде DialogFlow на Google Cloud, но чем в них разобраться, проще написать все ручками. Поэтому берем вариант попроще.

Взяли Chatforma. Из всего не такого уж многообразия у него у одного есть хоть какое-то API и поддержка Webhook. А раз так, то мы сможем доверить чатбот-платформе функцию непосредственно отправки, а логику настроить где-то в другом месте.

Да, предыдущий no code проект мы делали на AIMyLogic. К сожалению, интеграция с внешними сервисами у него устроена на ноль с плюсом. Так что увы, не в этот раз.

Airtable

Место, где можно хранить данные. В нашем случае это и архив статей, которые отправляет бот, и список пользователей (мы очень любопытны и хотим знать ваши имена), и турнирную таблицу с баллами за прочитанные статьи.

Да, можно было и в Google Таблицах (на них мы уже сделали и эксплуатируем коммерческий no code проект, внезапно это дизайн-задачник). И в SQL можно было. И много где еще.

Причин выбора Airtable две: он приятный на мордочку и замечательно интегрируется со всем и вся. Получаешь токен API прямо в приложении и гоняешь данные в обе стороны как хочешь и где хочешь. Легко и приятно. А мы хотели, чтобы легко и приятно хоть где-нибудь и в чём-нибудь.

Integromat

И, наконец, мозги. Сложно назвать преимущества перед тем же Zapier, тут чистая вкусовщина. Мы уже использовали Integromat в предыдущих проектах, он как-то привычнее. Кстати, собирали список статей из архива мы тоже с помощью него.

Немного суровой коммерции

Все инструменты разной степени платности. Нас не парят микроплатежи в пределах 1000 рублей в месяц. В конце концов, для нашей мегакорпорации это посильные деньги. Но да, если для вас бесплатность инструментов это дело принципа, то в no code игрушки лучше не играть, там почти за всё приходится отстёгивать копеечку.

Как мы это сделали

Базовые настройки

Задача 0 в Chatforma завести нового бота, чтобы он просто был. Регистрируемся на платформе, радуемся, что у нас всего 14 бесплатных дней. Заходим во вкладку боты и находим заветную кнопку Добавить бота. Называем его (имя только для Chatforma, сам бот уже назван) и выбираем соцсеть (Telegram).

После этого сразу идем в нового бота и в разделе настройки прописываем тот самый токен, который дал нам Отец Ботов, без этого ничего работать не будет.
image
Настройка для токена спрятана хорошо, надо еще поискать

Первое, что должен сделать уважающий себя ботостроитель научить бота здороваться. Все просто: идем в Конструктор и видим два заготовленных сообщения: стартовое и по умолчанию. В чем разница: первое это сообщение придет, если вы только запустили бота (нажали Старт). Второе это универсальная заглушка на любое сообщение, которое бот не понимает.image
А еще там можно добавлять инлайн-клавиатуру, но это уже совсем баловство

Собираем пользователей

Для учёта статистики и раздачи уникальных ссылок каждому нам понадобится список пользователей, запустивших бота. Он есть в разделе Пользователи, но практической пользы не несет никакой, кроме возбуждения эго количеством подписавшихся.
image
По шапке таблицы можете легко определить ее полезность

Нам пригодится Integromat, Airtable и API запрос. В Integromat этим запросом вытаскиваем список пользователей и записываем в нужную таблицу в Airtable. Чтобы не плодить дубли, перед записью проверяем на наличие пользователя в таблице по ID. Если такой уже есть отсеиваем, остальных записываем.
image
Отдельный фетиш в Integromat пытаться там все выровнять

Настраиваем рассылку

Дальше интереснее. Нам нужно каждый день генерировать рассылку по всем участникам, вставляя туда рандомную ссылку из Airtable. А еще лучше рандомную ссылку каждому. А еще лучше что-нибудь написать перед ней. Что-то персональное и не повторяющееся каждый день. Идем в раздел Рассылки в надежде воплотить задуманное Все очень плохо.
image
Сейчас объясним, почему

Дело вот в чём. Chatforma умеет создавать два вида рассылок: обычные и авторассылки. Первые подойдут, если нужно единоразово отправить всем (или некоторым) участникам определенный текст, картинку, опрос и так далее. Второй позволяет настроить рассылку по расписанию и дням недели, но функционал отправки ограничен только текстом и медиа, опросы так отправлять нельзя.
image
Просто рассылка

image
Авторассылка

Вернемся к рассылке. То, что предлагает платформа, нам не подходит. Мы не можем сделать персонализированную рассылку и динамически вставлять туда любую информацию. Только заранее заготовленную. А ручками это делать не хочется. Когда у бота два пользователя, это еще ничего, но если их уже три Поэтому решаем проблему с помощью Integromat.

Создаем сценарий со следующей логикой: Получаем список статей из Airtable Оттуда же берем список пользователей, который мы занесли туда ранее Каждый пользователь проходит итерацию, где генерируется рандомное число и статья под таким номером строки отправляется через POST-запрос в Chatforma. Для этого пришлось залезть в документацию к API и найти там нужный метод.

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

Еще нам нужно имитировать интерактив с сообщениями, предшествующими ссылке. Добавляем в базу варианты сообщений и формируем итоговое, используя имя пользователя в телеграмме, рандомную фразу и рандомную ссылку.
image
Вариация на тему бизнес-логики

Вот что после этого происходит на стороне Chatforma. Когда Integromat отправил сообщение, Chatforma его получает и формирует единичную рассылку для конкретного пользователя. В тексте все тоже, что сформировал Integromat. Вроде работает.

Тут же обнаружилась проблема: мало того, что есть задержка при получении данных извне, так еще и Chatforma долго (до 15 минут) проводит уже сформированные рассылки. Получается, что десятичасовая рассылка может прийти и в 10:01 и в 10:16, Техподдержка этот феномен изучала 4 дня и без особых успехов.
image
Но поддержка отзывчивая, и это приятно

Голосовалка

Ссылку все получили, кто-то даже прочитал содержимое. Теперь нужно эту статью оценить. У API Chatforma есть два ограничения, которые не дают нам простора для творчества: мы можем в сторонние сервисы отправлять только ответы, полученные из такой сущности, как Опрос. По API мы можем возвращать только текст, нужный нам опрос мы можем создать только внутри Chatforma, а значит можем пользоваться только теми видами рассылки, который описали ранее.

В итоге сделали следующее: расплодили опросы о качестве статьи на каждый день для всех подписчиков, поставили его на 11:00. После того, как пользователь проголосует, результат через webhook уходит в Integromat, и на основании ответа последней присланной статье для нужного пользователя проставляются баллы. Подсчет такой: за Огонь +1 балл проголосовавшему и +1 балл статье, за Не очень -1 балл статье и +1 пользователю. За Не читал ничего. Еще планировали отправлять пользователю сообщение-отбивку после голосования, но от этой идеи отказались. Потому что скорость доставки в духе Почты России в её лучшие годы.
image
В это голосование ЕР не вмешается

Итого по инструментам

Airtable

Никаких проблем при интеграции, записи и получении данных.

Integromat

Сервис хорошо справляется с линейными операциями. Если появляется логика if/else и сравнение данных, схема получается достаточно запутанной. Но работает.
Приходится много оптимизировать процессы, так как все тарифы ограничены по количеству выполненных элементов.

Chatforma

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

Найденные недостатки.
  1. Ограничение видов контента в зависимости от вида рассылки.
  2. Содержание рассылки, направленной через API, ограничено только текстом.
  3. Webhook умеет отправлять только результаты опроса, а не любые действия пользователя.
  4. Большая задержка при отправке рассылок.
  5. Баги с задержкой внесения изменений после сохранения.
  6. Лог не хранит присланные пользователем сообщения, только ответы на опросы.
  7. Заплатить за сервис целый квест, и нужно очень хотеть, чтобы его пройти.


Вопросы к вам


  1. Бота можно щупать: @bracho_read_bot и конечно, просим репортить о багах и предлагать фичи.
  2. Какие ещё архивы англоязычных статей зашить в бота? Кое-что уже отобрали, хотим ещё.
  3. Продуктоведы, вы тут есть? Вам о продуктовой части no code рассказывать или ну его и сами с усами?
  4. Набор no code инструментов. Есть ли что получше для этой задачи? Конечно, в кандидатах на вылет в основном Chatforma.
Подробнее..

Как мы не сделали стартап в сфере телемедицины

04.04.2021 20:17:04 | Автор: admin

В 2019 году я и мой товарищ решили сделать проект под названием "Polyclinica". Его основной идеей было перенаправить трафик людей, "гуглящих" свои симптомы в приложение-чатбот (a.k.a симптом-чекер), рекомендующий пользователю врача, к которому стоит обратиться. К врачу также можно записаться прямо на сайте через интеграцию API https://docdoc.ru/. Мы разработали полноценный MVP, выступали на нескольких стартап-конференциях, но что-то пошло не так. Цель написания данной статьи -- проанализировать свои ошибки и получить обратную связь от компетентных читателей.

Какую проблему решает Polyclinica?

Итак, наша гениальная идея заключалась в том, что люди, проводящие много времени за чтением сомнительных медицинских статей в интернете хотят получить сервис, где есть единая и достоверная информация, которую можно получить удобным способом.

Единство и достоверность информации заключалось в обработке имеющихся медицинских данных и их структуризации в виде графа знаний, где вершины это -- болезни, симптомы, и врачи.

Под удобным способом получения информации подразумевается чат-бот, поддерживающий как ручной ввод, так и проводящий опрос с кнопочным вводом.

Важно заметить, что бот не ставит диагноз, а лишь рекомендует профиль врача, к которому следует обратиться.

Что мы делали?

Изначально, в нашей команде было всего 2 человека: я и мой товарищ. Мы покрывали техническую часть проекта. Затем, в рамках курсового проекта в университете, реализацией также занимались несколько наших одногруппников, которые также покрывали технические компетенции. После окончания курсовой, наша команда опять сократилась до 2-х человек. Периодически, состав команды менялся, но ядро оставалось то же.

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

Что делать дальше?

В данный момент проект заморожен, однако, MVP-версия всё ещё реально работает: http://polyclinica.perevalov.com/. Есть несколько идей по значительному улучшению технической части, но их реализация пока что не запланирована.

Пишите ваши мысли по поводу данной идеи в комментарии, также, если вы заинтересованы в проекте, мы открыты к сотрудничеству. Спасибо за прочтение.

Подробнее..

FAQ чатбот COVID-19 спустя год

19.03.2021 18:12:20 | Автор: admin

Предисловие

Около года назад я решил написать чат-бота, который отвечает на часто задаваемые вопросы о COVID-19. В тот момент многим показалось, что моя идея не более чем хайп, который спустя короткий промежуток времени потухнет. Однако, оказалось, что спустя год, данная тема только набирает обороты. В этой статье я расскажу о том, как мы создавали чат-бот для консультации по вопросам COVID-19 по просьбе МВД (BMI) Германии, а также выражу идею о создании аналогичного проекта в России.

Зачем нужен этот чатбот?

На протяжении всей пандемии (и сейчас) информационные источники предоставляют большое количество разнородной статистики по заболеваниям, смертям, течении болезни симптомам и т.д. Более того, в личной коммуникации люди нередко (и неосознанно) могут искаженно передавать свой или чужой опыт по тому, как действовать если ты или твои близкие заболели, как интерпретировать статистику, стоит ли вакцинироваться и вообще, что всё это значит? Кончено, наверняка существует единый централизованный источник(и) точной информации, однако найти и опознать их не всегда просто, а если речь идёт о статистических данных, то тут ситуация ещё сложнее.

В связи с этим, возникает потребность в существовании единого и простого в использовании источника информации. Казалось бы, почему, например, горячая линия не является таковым источником? По моему личному опыту (а я несколько раз летал за границу во время пандемии, а также сталкивался с вирусом лицом к лицу), качество услуг горячей линии в моем городе, мягко говоря, не всегда отличное. Долгое время ожидания, неконсистентная информация и т.д. Поэтому, виртуальный ассистент или чатбот, называйте как хотите, более чем достойная альтернатива и отличное решение проблем единства информации и сложности доступа к ней.

Кейс МВД Германии

С Августа 2020 года я являюсь PhD студентом и научном сотрудником в одном из немецких вузов. В мои обязанности также входит помогать моему научруку проводить курс Question Answering & Chatbots. В рамках курса, студенты совместно с реальными организациями из индустрии делают реальные проекты по чатботам в заданном домене знаний. В этом году, одной из организаций было МВД Германии, которое уже на тот момент имело разработанный простенький FAQ Бот, работающий на немецком языке. Их запрос заключался в разработке функциональности доступа к данным через вопросы на естественном языке (data-driven questions). Например: "Сколько случаев заражений было в прошлый месяц в Берлине"? Фишка в том, что приложение должно было работать не только на немецком, но и на английском, а также определять как большие города (Мюнхен, Гамбург), так и маленькие посёлки и районы.

Результатом работы стало приложение, которое будет в дальнейшем интегрировано в основной функционал чатбота. Демо доступно по этой ссылке: https://coronabot.ins.hs-anhalt.de/

Как видите, запрос на разработку таких вещей не какая-то мимолётная шалость вчерашнего студента, а реальная потребность на государственном уровне.

Личная инициатива

Идея данной статьи заключается в том, чтобы сподвигнуть заинтересованных людей на создание данного приложения в Российской Федерации в рамках совместного сотрудничества. Ведь без партнёрства со стороны государства или больших компаний идея вряд ли получит дальнейшее развитие. Текущая реализация FAQ чатбота на русском языке всё ещё доступна в телеграме. Вы можете с ним пообщаться и сообщить о багах или пожеланиях в комментариях к данной статье -- это поможет нам в дальнейшей разработке.

Обобщая данную статью, решения на базе чатботов могут быть полезны не только в кейсе ковида, а в любых других, например -- государственные услуги.

Спасибо за внимание!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru