Дерзкий telegram бот
Недавно, в попытках разобраться с nlp, мне пришла идея написать простого telegram бота, который будет разговаривать, как дерзкий гопник. То есть:
Для имплементации был выбран JavaScript с ES6 и Flow. Возможно, Python подошёл бы лучше, так как под него существует больше стабильных и проверенных библиотек для nlp. Но для JS есть Az.js, которого вполне хватило.
Для работы с Telegram API был использован node-telegram-bot-api.
Осторожно, под катом присутствует нецензурная речь и детали реализации!
Часть с реализацией работы с Telegram API не сильно интересная, и про это уже написано множество статей, и её я опущу.
Начну сразу с того, как бот пытается найти подходящий ответ. Первый метод поиска ответа – слово-триггер:
user: Хочу новую машину!
bot: Хотеть невредно!
Для начала мы имеем список пар [regexp, ответ] :
Потом мы должны разбить сообщение от пользователя на слова:
Пройти по всем триггерам и вернуть возможные ответы:
Вышло очень просто. Теперь пришло время второго метода поиска ответа – отвечать дерзким вопросом на вопрос:
Для того чтобы определить, является ли сообщение вопросом, мы должны проверить его на наличие вопросительного знака в конце и на наличие вопросительных слов, как «когда», «где» и т.д.:
Третий метод поиска ответа – ответ нецензурной рифмой. Этот метод наиболее сложный:
user: хочу в Австрию!
bot: хуявстрию
user: у него есть трактор
bot: хуяктор
Вкратце: мы просто заменяем первый слог существительного или прилагательного на «ху» и трансформированную гласную из слога, как «о» → «ё», «а» → «я» и т.д.
Для начала мы должны уметь получать первый слог слова. Это несложно:
Потом нужно заменять первый слог на «ху» + гласную, если это возможно:
И, наконец, возвращать все возможные рифмы для слов из сообщения:
Последний метод поиска ответа – отвечать в замешательстве грубой фразой:
Этот метод более чем простой, поэтому будет реализован в агрегирующей все методы функции:
Как управлять триггерами цепочек чат-бота
Сервис SendPulse позволяет создавать автоматизированные цепочки сообщений для чат-ботов, когда бот предоставляет информацию подписчику по заранее заданному сценарию и запускать по установленным триггерам.
Разделы
Типы триггеров
Триггер — это действия подписчиков или команды, которые они присылают в сообщениях в чате. Триггеры могут быть трех типов:
В сервисе SendPulse есть три триггера по умолчанию:
Пользователи могут создавать новые триггеры, редактировать, привязывать к цепочкам сообщений или отвязывать от них, а также удалять существующие триггеры.
Как создать новый триггер
Нажмите кнопку «Создать новый триггер».
Выберите тип триггера.
Для триггера с типом «После подписки» укажите, через какой период после подписки будет запущена цепочка сообщений, связанная с этим триггером.
Для триггера с типом «Событие а360» укажите событие, которое нужно отслеживать. Когда SendPulse получит событие для указанного контакта, чат-бот запустит цепочку.
Для триггера с типом «Команда» укажите команды (ключевые слова), при получении которых будет запускаться цепочка сообщений, и время повторного вызова. Нажимайте «Enter» после ввода команды, чтобы перейти к вводу следующей.
Можно указывать повторный вызов в минутах, часах или днях.
Нажмите «Добавить», чтобы сохранить триггер.
Когда новый триггер добавлен, можно переходить к созданию цепочки сообщений, которую он будет запускать.
Примечание: сервис не позволяет создавать несколько триггеров с одинаковыми командами.
Как редактировать существующий триггер
Выберите нужный триггер на панели и нажмите «Редактировать триггер».
Сделайте необходимые изменения и нажмите «Сохранить».
Как удалить триггер
Выберите триггер на панели, нажмите «Редактировать триггер» > «Удалить триггер».
После удаления триггера, цепочку, которая была привязана к нему, можно найти в сохраненных цепочках.
Как убрать подсказки от бота
Если пользователь введет часть вашей команды, бот предложит ему ответ в виде кнопки с названием вашего триггера — после нажатия на нее запустится цепочка.
Чтобы отключить эту функцию, перейдите в настройки чат-бота на вкладку «Общие» и выберите опцию «Отключать подсказки от бота при неточном соответствии в сообщении».
Пишем telegram бота на языке R (часть 2): Добавляем боту поддержку команд и фильтры сообщений
В предыдущей публикации мы разобрались как создать бота, инициализировали экземпляр класса Bot и ознакомились с методами отправки сообщений с его помощью.
В этой статье я продолжаю данную тему, поэтому приступать к чтению данной статьи я рекомендую только после прочтения первой части.
В ходе статьи мы напишем нескольких простых ботов, последний будет по заданной дате и коду страны определять является ли день в данной стране выходным или рабочим согласно производственного календаря. Но, как и прежде цель статьи ознакомить вас с интерфейсом пакета telegram.bot для решения ваших собственных задач.
Все статьи из серии «Пишем telegram бота на языке R»
Содержание
Если вы интересуетесь анализом данных возможно вам будут интересны мои telegram и youtube каналы. Большая часть контента которых посвящены языку R.
Класс Updater
Handlers — обработчики
С помощью обработчиков вы добавляете в Dispetcher реакции бота на различные события. На момент написания статьи в telegram.bot добавлены следующие типы обработчиков:
Добавляем первую команду боту, обработчик команд
Если вы никогда ранее не использовали ботов, и не в курсе, что такое команда, то команды боту необходимо отправлять с помощью прямого слеша / в качестве префикса.
Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather (о создании бота я рассказывал в первой статье).
Схематически процесс построения такого простейшего бота можно изобразить следующим образом.
Обработчик текстовых сообщений и фильтры
Как отправлять боту команды мы разобрались, но иногда нам требуется, что бы бот реагировал не только на команды, но и на какие-то обычные, текстовые сообщения. Для этого необходимо использовать обработчики сообщений — MessageHandler.
Пока мы не будем писать какие-то новые методы, т.к. у нас уже есть метод с помощью которого бот с нами здоровается. От нас требуется только создать нужный фильтр и обработчик сообщений.
Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather (о создании бота я рассказывал в первой статье).
Теперь попробуем отправить боту несколько сообщений, в которых будут встречаться перечисленные ранее слова приветствия:
Но главное, что мы сделали — добавили боту фильтр с помощью функции BaseFilter() :
Как вы могли заметить, фильтры необходимо добавлять в объект MessageFilters, в котором изначально уже есть небольшой набор готовых фильтров. В нашем примере в объект MessageFilters мы добавили элемент hi, это новый фильтр.
В функцию BaseFilter() вам необходимо передать фильтрующую функцию. По сути, фильтр — это просто функция, которая получает экземпляр сообщения и возвращает TRUE или FALSE. В нашем примере, мы написали простейшую функцию, которая с помощью базовой функции grepl() проверяет текст сообщения, и если он соответствует регулярному выражению привет|здравствуй|салют|хай|бонжур возвращает TRUE.
Ну и в итоге, мы добавляем в диспетчер созданный только, что обработчик hi_txt_hnd.
Как я уже писал выше, в пакете telegram.bot и объекте MessageFilters уже есть набор встроенных фильтров, которые вы можете использовать:
Если вы хотите совместить некоторые фильтры в одном обработчике просто используйте знак | — в качестве логического ИЛИ, и знак & в качестве логического И. Например, если вы хотите что бы бот вызывал один и тот же метод когда он получает видео, изображение или документ используйте следующий пример создания обработчика сообщений:
Добавление команд с параметрами
Мы уже знаем, что такое команды, как их создавать и как заставить бота выполнить нужную команду. Но в некоторых случаях помимо названия команды, нам необходимо передать некоторые данные для её выполнения.
Ниже пример бота, который по заданной дате и стране возвращает вам тип дня из производственного календаря.
Приведённый ниже бот использует API производственного календаря isdayoff.ru.
Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather (о создании бота я рассказывал в первой статье).
Но, помимо имени команды, данный метод ждёт от вас введения двух параметров, код страны и дату. Далее бот проверяется, является ли заданный день в указанной стране выходным, сокращённым или рабочим согласно официального производственного календаря.
Давайте запустим, и протестируем нашего бота.
Запускаем бота в фоновом режиме
Последний шаг который нам осталось выполнить — запустить бота в фоновом режиме.
Для этого следуйте по описанному ниже алгоритму:
Наш бот запущен в фоновом режиме, и будет работать до тех пор, пока вы не остановите задачу, или не выключите ваш ПК или сервер на котором его запустили.
Заключение
В этой статье мы разобрались как написать полноценного бота, который не только умеет отправлять сообщения, но и реагировать на входящие сообщения и команды. Полученных знананий уже достаточно для решения большинства ваших задач.
В следующей статье речь пойдёт о том, как добавить боту клавиатуру, для более удобной работы.
Подписываетесь на мой telegram и youtube каналы.
# Триггеры
Триггеры предоставляют самый мощный функционал в боте. Вы можете настроить любую реакцию на любое сообщение пользователей.
Желать доброго утра админам (или любым конкретным пользователям), по утрам, если они зайдут в беседу? – Не вопрос.
При отправке пользователями gif’ок вежливо попросить её удалить в течение минуты, и если он это не сделает – удалить гифку и выдать предупреждение, а если сделает – написать «спасибо за понимание»? – Пожалуйста.
Отправлять в чат «Хозяин, вас звали!» с ссылкой на ваш профиль, когда вас упоминают в группе? – Да, и такое возможно.
Основная функция триггера – определенное УСЛОВИЕ, и при его выполнении, происходит определенное ДЕЙСТВИЕ, которое вы задаете сами.
# Тарифы на триггеры
Данная таблица рассказывает о различиях тарифов на триггеры. Лимита на группы условий/группы действий нет – вы можете создать 6 групп действий, в каждой из которой будет по одному действию, или 1 группу действий с шестью действиями для тарифа «Starter».
Если вы выйдете за лимиты триггера или истечет срок тарифа – (появится красная надпись, уведомляющая о том, что превышено количество триггеров или действий в них) триггеры будут работать, с ограничениями. Например, если вы создали 4 действия без тарифа, работать будут три. Также и количество триггеров – если будет больше, чем возможно, остальные просто не будут работать.
# Навигация по триггерам
Заходим в раздел «Триггеры чата», нажимаем на «+ Добавить новый»
Далее, выйдет окно с условиями создания триггера:
Задаем название триггеру.
Старайтесь назвать триггер так, чтобы его было легко найти и редактировать среди других.
# Тип выполнения триггера
«Выполнить все действие» — это значит, что за определенное условие, будет выполнены все указанные и заданные вами далее действия. (В том случае, если вы укажете несколько действий)
«Условия» — это определенные сообщения, слова, смайлы, после совершения которых применяются определенные действия.
«Действия» — это определенные реакции на заданные условия, действием может быть ограничение каких-либо действий участника чата, предупреждение, исключение из чата или удаление данного сообщения.
# Отработка триггеров
Отработка триггеров происходит поочередности. На картинке ниже выделен красным номер, по которым идет очередь срабатывания триггеров
Чтобы триггеры работали подряд по порядку необходимо включить тумблер «Продолжить выполнение цепи триггера по окончании текущего триггера» в расширенных настройках, доступных с тарифа «Advanced»
Если тумблер выключен, то сработает только один триггер, тот, который с меньшим номерком.
# Условия триггеров
Создаем условия с помощью «+», открывается отдельное окно «Группа условий» и снизу отдельная кнопка «+». Нажимая на отдельную кнопку, создается еще одна группа условий с отдельными функциями.
В инструменте «Действия» функционал такой же.
# Типы условия:
Всего 18 условий, 4 инициатора, 8 типов сообщений и 6 фильтров для условий на текст сообщения.
# Полное совпадение
Триггер сработает при полном совпадении сообщения с указанным Вами значением в условии. То есть, если укажете в условии «Привет», условие выполнится только при сообщении «Привет». Если будет «Привет. Знаешь…», или «Привет.», или «Привет)» условие НЕ выполнится. *Исключение в том случае, если включить фильтр «Не учитавать символы» ниже, тогда последние два варианта бот пропустит.
# Сообщение начинается с
Триггер сработает, если сообщение пользователя будет начинаться со строк (слов/выражений), указанных вами в значениях условия. Пример: в значених «Ты». Условие сработает на сообщения: «Ты – самый вредный!», «Тыквы полезные!», «Ты123абв»
# Сообщение заканчивается на
Триггер сработает, если сообщение пользователя будет заканчиваться строками (словами/выражениями), указанными вами в значениях условия, иначе триггер не сработает. Аналогично: если в условии «ейка», оно сработает на «лейка», «абвгдейка».
# Сообщение содержит
# Регулярное выражение
Самое мощное условие, самое сложное. Однако если вы овладеете регулярными выражениями – получите нескончаемый функционал для вашего бота. С помощью этого инструмента можно составлять любые условия на текст пользователя! При должной настройке оно может заменить шесть условий в триггерах и в какой-то мере большинство текстовых фильтров.
Выполняет поиск на основе регулярного выражения языка Java. Тестер и краткий справочник по регулярным выражениям доступен по нажатию кнопки «Помощь» в верхней панели. Также есть небольшая статья, посвященная регулярным выражениям в инструкции.
# Длина сообщения меньше или равна
Триггер сработает, если длина сообщения будет меньше или равна указанному вами количеству символов. Можно включить/отключить подсчёт пробелов.
# Длина сообщения больше или равна
Триггер сработает, если длина сообщения будет больше или равна указанному вами количеству символов. Можно включить/отключить подсчёт пробелов.
# Тип сообщения
Доступно 13 видов сообщений, выберите те, на которые сработает триггер. Например, если поставить фото, то каждый раз когда участники будут присылать фото, условие будет выполняться.
# Регулярное выражение на меньшинах в сообщениях
Регулярное выражение, срабатывающее на логин (@username), написанный в чат в сообщениях пользователей. Значения указывать так: (username), обязательно в нижнем регистре. О работе с регулярными выражениями можно ознакомиться в инструкции. Тестер и краткий справочник по регулярным выражениям доступен по нажатию кнопки «Помощь» в верхней панели.
# Регулярное выражение на текстовых меньшинах в сообщениях
В официальном клиенте Telegram’а при написании символа «@» в чат появляется список недавних участников:
Если юзернейм у пользователя есть, то кликнув по пользователю вы получите его @username. Если юзернейма нет, то по клику вы получите его кликабельный никнейм. Например, ник пользователя – Tania Pupkina. У вас после нажатия будет слово Tania с ссылкой на её профиль. Вот это условие срабатывает на такие слова. В значениях указывать это слово (например Tania), оформленное как регулярное выражение, например «(Tania)». О работе с регулярными выражениями можно ознакомиться в инструкции. Тестер и краткий справочник по регулярным выражениям доступен по нажатию кнопки «Помощь» в верхней панели.
# Регулярное выражение на номерах телефонов
Срабатывает на номер телефона (оформленный как регулярное выражение), на который был зарегистрирован аккаунт Telegram. Телефонный номер указывать в международном формате без плюса. Возможно использовать только когда пользователь отправил свои контакты боту.
# Язык клиента
Условие на основе выбранного языка клиента Telegram (установленный язык в приложении Telegram). Значения указывать по типу: ru, en, ua. Ввиду особенностей Telegram’а, если в приложении выставлен язык русский, срабатывает на значения en и ru, поэтому будьте аккуратны с этим. Со значениями, которые можно указывать в качестве языка клиента, Вы можете ознакомиться здесь.
# Регулярное выражение на логине пользователя
Возможность сделать срабатывание условия для конкретного пользователя по его юзернейму. Обычно работает в сочетаниях с другими условиями в одной группе действий. Значения указываются таким образом: ^(username1)$, ^(username2)$ ИЛИ ^(username1|username2)$, обязательно в нижнем регистре. О работе с регулярными выражениями можно ознакомиться в инструкции. Тестер и краткий справочник по регулярным выражениям доступен по нажатию кнопки «Помощь» в верхней панели.
# Минимальная длина логина
Можете указать минимальное количество символов которое будет содержаться в логине пользователя (@username пользователя). Если логин будет содержать меньше указанных вами символов, сработает действие. Минимально возможная длина логина в Telegram – 5, максимально возможная – 32.
# Максимальная длина логина
Можете указать максимальное количество символов которое будет содержаться в логине пользователя. Если логин будет содержать больше символов что вы указали, то сработает действие. Минимально возможная длина логина в Telegram – 5, максимально возможная – 32.
# Регулярное выражение на имени пользователя
Возможность сделать условие для конкретного пользователя по его никнейму. Обычно работает в сочетаниях с другими условиями в одной группе действий. Значения указываются таким образом: ^(ник этого пользователя)$ ИЛИ ^(имя1 фамилия1|имя2 фамилия2)$, обязательно в нижнем регистре. О работе с регулярными выражениями можно ознакомиться в инструкции. Тестер и краткий справочник по регулярным выражениям доступен по нажатию кнопки «Помощь» в верхней панели.
# Минимальная длина имени
Можете указать минимальное количество символов, которое будет содержаться в имени пользователя. Если имя пользователя будет содержать меньше символов, чем было указано, то триггер сработает.
# Максимальная длина имени
Можете указать максимальное количество символов, которое будет содержаться в имени пользователя. Если имя пользователя будет содержать больше символов что вы указали, то триггер сработает.
# Ранг пользователя соответствует
Укажите желаемое количество рангов и на участника с соответствующими рангами сработает триггер.
# Ранг пользователя ниже
Задайте минимальное количество рангов, на участника с показателем рангов меньше указанных, сработает триггер.
# Ранг пользователя выше
Задайте максимальное количество рангов, на участника с показателем рангов больше указанных, сработает триггер.
Ранг – это текущий статус участника в чате. Ранги даются за выполнение определенных действий, которые устанавливает администратор чата.
# Следующий инструмент «Фильтр условия»
# Инструмент «Инициатор триггера»
Инициатор триггера – участник группы, на которого будет срабатывать триггер.
Под администраторами понимаются участники группы, которые способны изменять настройки бота, а не администраторы чата.
# Инструмент «Тип сообщения»
Любое – условие сработает при любом сообщении;
Все реплаи – условие сработает только на реплаи (ответы);
Реплаи к боту – условие сработает только на ответы ботов;
Реплаи к пользователю – условие сработает только на ответы пользователей, кроме администраторов;
Реплаи к админу – условие сработает только на ответы администраторов;
Под администраторами понимаются участники группы, которые способны изменять настройки бота, а не администраторы чата.
Реплаи к @ChatKeeperBot – условие сработает на ответы к сообщениям от @ChatKeeperBot;
Не реплай – условие сработает на сообщения, которые были отправлены не реплаем (ответом);
Первое сообщение пользователя – условие сработает при первом сообщении нового участника.
# Инструмент «Инвертирование»
# Действия триггеров
Пишем telegram бота на языке R (часть 2): Добавляем боту поддержку команд и фильтры сообщений
В предыдущей публикации мы разобрались как создать бота, инициализировали экземпляр класса Bot и ознакомились с методами отправки сообщений с его помощью.
В этой статье я продолжаю данную тему, поэтому приступать к чтению данной статьи я рекомендую только после прочтения первой части.
В ходе статьи мы напишем нескольких простых ботов, последний будет по заданной дате и коду страны определять является ли день в данной стране выходным или рабочим согласно производственного календаря. Но, как и прежде цель статьи ознакомить вас с интерфейсом пакета telegram.bot для решения ваших собственных задач.
Все статьи из серии «Пишем telegram бота на языке R»
Содержание
Если вы интересуетесь анализом данных возможно вам будут интересны мои telegram и youtube каналы. Большая часть контента которых посвящены языку R.
Класс Updater
Handlers — обработчики
С помощью обработчиков вы добавляете в Dispetcher реакции бота на различные события. На момент написания статьи в telegram.bot добавлены следующие типы обработчиков:
Добавляем первую команду боту, обработчик команд
Если вы никогда ранее не использовали ботов, и не в курсе, что такое команда, то команды боту необходимо отправлять с помощью прямого слеша / в качестве префикса.
Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather (о создании бота я рассказывал в первой статье).
Схематически процесс построения такого простейшего бота можно изобразить следующим образом.
Обработчик текстовых сообщений и фильтры
Как отправлять боту команды мы разобрались, но иногда нам требуется, что бы бот реагировал не только на команды, но и на какие-то обычные, текстовые сообщения. Для этого необходимо использовать обработчики сообщений — MessageHandler.
Пока мы не будем писать какие-то новые методы, т.к. у нас уже есть метод с помощью которого бот с нами здоровается. От нас требуется только создать нужный фильтр и обработчик сообщений.
Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather (о создании бота я рассказывал в первой статье).
Теперь попробуем отправить боту несколько сообщений, в которых будут встречаться перечисленные ранее слова приветствия:
Но главное, что мы сделали — добавили боту фильтр с помощью функции BaseFilter() :
Как вы могли заметить, фильтры необходимо добавлять в объект MessageFilters, в котором изначально уже есть небольшой набор готовых фильтров. В нашем примере в объект MessageFilters мы добавили элемент hi, это новый фильтр.
В функцию BaseFilter() вам необходимо передать фильтрующую функцию. По сути, фильтр — это просто функция, которая получает экземпляр сообщения и возвращает TRUE или FALSE. В нашем примере, мы написали простейшую функцию, которая с помощью базовой функции grepl() проверяет текст сообщения, и если он соответствует регулярному выражению привет|здравствуй|салют|хай|бонжур возвращает TRUE.
Ну и в итоге, мы добавляем в диспетчер созданный только, что обработчик hi_txt_hnd.
Как я уже писал выше, в пакете telegram.bot и объекте MessageFilters уже есть набор встроенных фильтров, которые вы можете использовать:
Если вы хотите совместить некоторые фильтры в одном обработчике просто используйте знак | — в качестве логического ИЛИ, и знак & в качестве логического И. Например, если вы хотите что бы бот вызывал один и тот же метод когда он получает видео, изображение или документ используйте следующий пример создания обработчика сообщений:
Добавление команд с параметрами
Мы уже знаем, что такое команды, как их создавать и как заставить бота выполнить нужную команду. Но в некоторых случаях помимо названия команды, нам необходимо передать некоторые данные для её выполнения.
Ниже пример бота, который по заданной дате и стране возвращает вам тип дня из производственного календаря.
Приведённый ниже бот использует API производственного календаря isdayoff.ru.
Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather (о создании бота я рассказывал в первой статье).
Но, помимо имени команды, данный метод ждёт от вас введения двух параметров, код страны и дату. Далее бот проверяется, является ли заданный день в указанной стране выходным, сокращённым или рабочим согласно официального производственного календаря.
Давайте запустим, и протестируем нашего бота.
Запускаем бота в фоновом режиме
Последний шаг который нам осталось выполнить — запустить бота в фоновом режиме.
Для этого следуйте по описанному ниже алгоритму:
Наш бот запущен в фоновом режиме, и будет работать до тех пор, пока вы не остановите задачу, или не выключите ваш ПК или сервер на котором его запустили.
Заключение
В этой статье мы разобрались как написать полноценного бота, который не только умеет отправлять сообщения, но и реагировать на входящие сообщения и команды. Полученных знананий уже достаточно для решения большинства ваших задач.
В следующей статье речь пойдёт о том, как добавить боту клавиатуру, для более удобной работы.
Подписываетесь на мой telegram и youtube каналы.