Вторник , 16 апреля 2024
Бизнес-Новости
Разное / Написать бота для telegram: от первой строчки до запуска

Написать бота для telegram: от первой строчки до запуска

Содержание

Как легко создать бота в Telegram для своего бизнеса

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

И наконец, долгожданный релиз от SendPulse — чат-боты в Telegram пополнили компанию ботов ВКонтакте и Facebook Messenger.

Возможности чат-ботов Telegram от SendPulse:

  • Отправка сообщений-автоответов и цепочек сообщений, когда срабатывает заданный триггер, добавление переменных, тегов, отправка веб-хуков по действиям внутри цепочки.
  • Возможность сохранить введенные пользователем данные в переменные.
  • Сегментация на этапе отправки рассылки по датам подписки, активности, тегам и переменным
  • Виджет подписки на бота Telegram, VK и Facebook Messenger для сайта. В одном виджете вы можете объединить кнопки подписки на все три мессенджера.
  • Объединенный лайв-чат с подписчиками страниц Telegram, VK и Facebook Messenger в панели SendPulse.

Из этой статьи вы узнаете, что такое боты в Telegram и на наглядных примерах увидите, где и как они используются в бизнесе. Я также покажу, как в SendPulse создать чат-бота в Telegram и подробнее опишу возможности сервиса.

Что такое чат-бот в Telegram

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

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

Чат-бот в Telegram для бизнеса — как и где можно использовать

Чат-боты могут здорово применяться для самых разных нужд малого, среднего и большого бизнеса — записи на консультацию, ответы на частые вопросы в службах поддержки и отделах продаж, поиск сотрудников и многое другое. Примечательно, что Telegram боты задействованы как в B2C, так и B2B сфере. Сейчас я расскажу подробнее, где и как они будут полезны.

Инфобизнес

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

Event индустрия

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

Продажи

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

Служба поддержки

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

Клиники

Узнать о клинике и ее специалистах, получить ответы на частые вопросы и записаться к врачу, отменить прием или изменить время и дату, перенаправить на чат с оператором.

Новостные сайты

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

HR

Поиск сотрудников через чат-бота: отсеять кандидатов, передать в работу тестовое задание. C помощью чат-бота Роман Рыбальченко искал сотрудника в свое агентство и написал об этом кейс для нашего блога. Он создал чат-бот в Facebook Messenger через SendPulse, аналогичный бот вы можете построить и в Telegram.

Моя подруга, которая работает менеджером по персоналу в IT компании с тысячами сотрудников, создала бота в Телеграм для ответа на частые вопросы сотрудников по медицинскому страхованию. Через него также можно получить доступ к списку клиник и всем необходимым документам по страховке. Получается очень удобно — и ее не дергают лишний раз и вся информация находится в одном месте.

Кафе и рестораны

Посмотреть меню, заказать блюдо, забронировать столик, оставить отзыв, связаться с менеджером ресторана, отправить рассылку с новостями, специальными предложениями и обновлениями меню. Все можно сделать с помощью чат-бота в Telegram. Особенно это актуально, если вы ведете свое сообщество в Телеграме и у вас есть там аудитория.

Мы описывали в нашем блоге кейс кафе «Цапа», которые создали бота в Facebook Messenger и повысили вовлеченность аудитории своей страницы и количество заказов на вынос.

Вы можете позаимствовать логику этого бота и подогнать под свои цели и особенности заведения.

Примеры чат-ботов в Telegram

Я собрала реальные примеры применения чат-ботов в Telegram разными видами бизнеса.

Чат-бот шоумена и ведущего мероприятий

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

Бот в Телеграме шоумена и ведущего мероприятий

Чат-бот психолога

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

Бот дает много полезной информации уже на старте общения, чем и располагает к себе.

Чат-бот Джулия — онлайн-помощник психолога

Рассылка обновлений от новостного портала

Новостной сайт «Коммерсантъ» использует бота в Телеграме, чтобы подписать читателей на рассылку новостей. При этом вы можете выбрать, как часто и в какое время получать обновления. Если нужно найти новости на сайте прямо сейчас, просто введите ключевое слово и бот предложит вам подборку новостей на эту тему.

Чат-бот издания «Коммерсантъ»

Чат-бот страховой компании

Украинское отделение страховой компании UNIQA тоже использует бота в Telegram. С помощью него вы можете узнать, какие документы нужны для оформления разных видов страховки: медицинская, на автомобиль и туристическая. Он также помогает оформить страховой случай и связаться с оператором по каждому из указанных разделов.

Чат-бот страховой компании

Откройте для себя чат-бота

Выстраивайте автоворонки продаж и отвечайте на вопросы пользователей с помощью чат-бота в Facebook, VK и Telegram.

Создать чат-бота

Как в SendPulse создать бота в Telegram

Теперь расскажу подробно о функционале чат-ботов в Telegram на примере простого бота для выдуманной кулинарной школы Best Cook:

Так выглядит переписка с чат-ботом для пользователя

А вот схема этого чат-бота в визуальном редакторе SendPulse:

Схема бота в визуальном редакторе

Чтобы построить такую цепочку, вам нужно сначала создать своего бота в Telegram, а затем подключить его к SendPulse — с этого и начнем.

Создайте бота в Telegram

В поиске Telegram найдите @botfather и создайте своего бота с помощью команды «/newbot». На этом этапе вам нужно определиться с именем бота.

Вы получите ссылку на бота в Телеграме и цифровой токен доступа. Токен вам понадобится, чтобы подключить бота в аккаунте SendPulse.

Цифровой токен вашего бота, который нужно вставить в аккаунте SendPulse

Подключите бота к вашему аккаунту в SendPulse

В аккаунте SendPulse выберите раздел «Чат-боты», вкладку «Управление ботами», где подключаются чат-боты для Telegram, Facebook Messenger и ВКонтакте. В строку Telegram введите цифровой токен, который вы получили при создании бота через @botfather и нажмите «Подключить».

Вставляем токен в разделе «Чат-боты» аккаунта SendPulse

Для успешного подключения и тестирования вам нужно подписаться на собственного бота.

Подписываемся на собственного бота

После подключения все боты, которыми вы управляете, будут показаны в списке в разделе «Управление ботами».

В нашем случае — это бот выдуманной кулинарной школы Cooking School.

Чат-бот в Telegram подключен к аккаунту SendPulse

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

Запуск автоответов и цепочек сообщений чат-бота

В сервисе чат-ботов SendPulse есть понятие «триггер» — это условие, по которому отправляется автоответ или запускается последовательная цепочка сообщений.

Вы можете использовать триггеры двух видов: предустановленные и те, что создаются вручную.

Предустановленные триггеры

В личном кабинете SendPulse перейдите во вкладку «Чат-боты», откройте ваш подключенный чат-бот в Telegram. В разделе «Структура бота» вы увидите такие триггеры: «Приветственная серия», «Стандартный ответ» и «После отписки».

Предустановленные триггеры
Триггер «Приветственная серия»

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

Настройка приветственной серии после подписки на бота

В приветственном сообщении рекомендуется рассказать, как отписаться от бота, если ваши сообщения окажутся пользователю не интересны. Для отписки от бота в блоке по умолчанию установлены стандартные команды «/unsubscribe» и «/stop». Этот текстовый блок вы можете редактировать или удалить.

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

Пример приветственного сообщения чат-бота
Стандартный автоответ, если бот не распознал фразу пользователя

Прописать цепочки на все запросы пользователя невозможно. Если человек напишет фразу с ключевым словом, для которого не настроен триггер, ему отправится сообщение по «Стандартному автоответу».

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

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

Пример цепочки для триггера «Стандартный ответ»

Подробнее о блоке «Действие» и об остальных блоках цепочки автоответов в Telegram расскажем ниже.

Триггер «Отписка от бота»

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

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

Автоответ «Отписка от бота»

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

Триггеры, которые создаются вручную

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

Добавление триггера вручную

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

Тип триггера «После подписки»

Запускает цепочку автоответов после подписки через интервал, который вы указываете в минутах, часах или днях.

Добавление триггера «После подписки»

Этот тип триггера можно использовать вместо предустановленного триггера «Приветственная серия» и отправлять с его помощью приветственное сообщение.

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

Тип триггера «Команда»

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

Обратите внимание, что прописывать нужно ключевые слова и словосочетания. Можно добавить несколько разных слов, по которым будет запускаться цепочка, например: «доставка», «отправка», «самовывоз», «получение».

Добавление триггера «Команда»

Создали триггер — приступайте к созданию цепочки сообщений.

Как настроить цепочку автоответов в редакторе чат-бота

В визуальном редакторе цепочки автоответов строятся с помощью специальных блоков: «Сообщение», «Цепочка», «Действие» и «Пауза». Они расположены на панели слева.

Блоки, из которых строится цепочка автоответов

Дальше рассмотрим сам процесс построения цепочки.

Создаем цепочку

Выбираем триггер и нажимаем «Создать цепочку». Либо же к триггеру можно привязать цепочку, созданную ранее, если у вас уже имеются таковые.

Создание цепочки для выбранного триггера

Настраиваем стартовый блок

Справа в окне редактора цепочки вводим сообщение, которое отправляется пользователю в ответ на выбранный триггер. В нашем примере сообщение отправится после того, как пользователь напишет слово «Привет».

Стартовый блок в визуальном редакторе чат-бота

Вы можете отправить следующее сообщение только после того, как пользователь отреагировал на ваше предыдущее сообщение. Например, нажал на кнопку, которую нужно добавить в это сообщение. Рассмотрим, как добавить кнопку в редакторе.

Добавляем кнопку

Нажмите «Добавить кнопку» и введите текст кнопки. В нашем случае будет три кнопки: «Узнать о школе», «Мастер-классы», «Контакты менеджера».

Добавляем кнопки для дальнейшего развития цепочки

В одно сообщение вы можете добавить до двенадцати кнопок. Текст кнопки вмещает 20 символов без пробелов. В кнопки можно добавлять ссылки.

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

Создаем следующее сообщение

Перетащите блок «Сообщение» с левой панели в рабочую зону и соедините его с нужной кнопкой.

Для развития цепочки перетаскиваем блок «Сообщение» в рабочую зону

Заполните сообщения текстом и, если нужно, добавьте другие элементы.

Какие элементы можно добавить в сообщение чат-бота в SendPulse:

  • текст;
  • эмодзи;
  • изображение и вложение;
  • кнопка со ссылкой или без;
  • создать несколько реплик в одном сообщении, разделяя их задержкой до 5 секунд, чтобы текст не слипался;
  • переменные из адресной книги;
  • ввод данных пользователем, которые можно сохранить в уже существующую переменную или создать новую — для этого можно использовать кнопки быстрых ответов.
Элементы, которые можно добавить в сообщение

Чтобы добавить небольшую паузу между репликами в сообщении, воспользуйтесь элементом «Задержка». Укажите в редакторе, какая пауза будет между репликами — это до 5 секунд. Задержка в чате выглядит так:

Задержка между репликами в сообщении

Ввод данных пользователя

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

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

Ввод данных пользователя через быстрые ответы

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

Дополнительные блоки для построения цепочки

В цепочку можно добавить еще три вида блоков.

Блок «Пауза»

Используется для задержки отправки следующего сообщения. Вы можете указать паузу от нескольких минут до одного дня.

Блок «Действие»

Для блока действие есть такие опции:

  • «Открыть чат» — повышает приоритет чата: оповещает администратора о сообщении и открывает чат в панели SendPulse.
  • «Отписать от бота» — если в какой-то ветке сценария бота нужно удалить клиента из списка подписчиков и больше не отправлять ему сообщения.
  • «Добавить тег» — после нажатия на кнопку подписчику будет присвоен выбранный вами тег, с помощью которого вы сможете отправлять рассылки с сегментацией. О том, как использовать теги подробно читайте в базе знаний.
  • «Установить переменную» — система установит или обновит значение для выбранной вами переменной.
  • «Отправить вебхук» — можно отправить POST запрос с данными подписчика на ваш URL. Это нужно, чтобы, к примеру, отправить данные о подписчике и о том, что он прошел по какой-то ветке бота, в свою CRM. Подробнее о вебхуках читайте в нашей базе знаний.
Опции блока «Действие»
Блок «Цепочка»

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

Блок «Цепочка»

Дополнительные возможности сервиса чат-ботов SendPulse

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

Сегментация при рассылке

На этапе отправки рассылки доступна сегментация подписчиков по датам подписки, активности, тегам и переменным, по попаданию подписчика в цепочку или получению рассылки.

Сегментация списка при отправке рассылки

Кроме текста в сообщение вы можете добавлять кнопки со ссылками, изображения и файлы.

Статистика

Чтобы узнать, сколько новых подписчиков бота появилось за месяц, общее количество подписчиков и количество отправленных сообщений, откройте вкладку «Статистика».

Статистика чат-бота

Сохраненные цепочки

Если ранее вы создали цепочку для триггера, а потом отвязали ее, то она не будет удалена. Она попадет в раздел «Сохраненные цепочки». Вы сможете привязывать ее к уже существующему триггеру.

Виджет подписки

Во вкладке «Виджеты подписки» настраивайте виджет для сайта сразу с тремя кнопками — для VK и Facebook Messenger и Telegram, если у вас есть аккаунты в этих трех маркетинговых каналах. Если такой необходимости нет, выбирайте только одну кнопку.

Виджет подписки на рассылки в Telegram, VK и в Facebook Messenger

Лайв-чат

В сервисе чат-ботов от SendPulse вы можете управлять чатами с подписчиками своих чат-ботов в Telegram, сообществ ВКонтакте и Facebook страниц через общий список лайв-чатов.

Общий список лайв-чатов Telegram, ВКонтакте и Facebook Messenger

Заключение

Надеюсь, что этот материал был полезен и вы убедились, что чат-боты в Telegram использовать для бизнеса не просто можно, но и нужно, и что вы разобрались, как построить чат-бота в SendPulse. Не забывайте, что у нас есть еще и чат-боты в Facebook Messenger и ВКонтакте. Если вы представлены на всех трех каналах, это прекрасная возможность работать со всеми подписчиками на одной маркетинговой платформе.

А чтобы лучше разобраться в теме чат-ботов, вы можете прочитать выжимку из онлайн-конференции SendPulse о чат-ботах и мессенджер-маркетинге. Также вам будет полезен Телеграм-канал «Чат-боты и мессенджер-маркетинг»

Мы и дальше работаем над развитием сервиса и уже очень скоро вас порадуем новым функционалом — следите за новостями и автоматизируйте маркетинг в SendPulse.

[Всего: 9   Средний:  5/5]

Создаем бота для Telegram

В рамках данной статьи я расскажу о том, как быстро и легко написать программу-бота для популярного мессенджера Telegram. Писать бота мы будем на языке Python, параллельно изучая его основы. Договоримся, что вы используете Linux в качестве операционной системы, либо знаете как выполнить аналоги команд в Windows.

Установка необходимых библиотек

Нам понадобятся следующие библиотеки и программы:

  • pip — менеджер пакетов для Python
  • python — интерпретатор языка
  • virtualenv — виртуальное окружение
  • telebot — обертка над telegram API для языка Python

Теперь откроем консоль и наберем несколько команд. Первым делом загрузим менеджер пакетов для питона и виртуальное окружение, внутри которого мы будем устанавливать все остальные пакеты, чтобы не засорять систему и не порождать конфликтов с другими проектами. Также скачаем проект telebot, который носит название pyTelegramBotAPI.

sudo apt-get install python-pip sudo pip install pyTelegramBotAPI sudo pip install virtualenv

Следующая команда создаст в вашей директории новую директорию venv, в которой будет хранить все локальные библиотеки. Подробности про виртуальные окружения можно прочитать по адресу: http://docs.python-guide.org/en/latest/dev/virtualenvs/ Можно работать и без виртуального окружения, но тогда убедитесь, что устанавливаемые вами библиотеки не конфликтуют с другими библиотеками в системе (например, могут сломаться некоторые программы, заточенные под старые версии пакетов).

virtualenv venv

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

source venv/bin/activate

Создание Telegram-бота

Начнем с создания простого бота для Telegram. Чтобы наш бот функционировал, нужно первым делом его создать. Для этого в телеграме есть специальный мета-бот BotFather (@BotFather). Добавьте его через поиск в вашем клиенте телеграмма. Список его команд можно получить, написав в чате с ним команду /help. Для создания нового бота нужно написать команду /newbot и в следующем сообщении передать название бота (должно заканчиваться словом bot). В ответ вам придет сообщение с API токеном — он понадобится нам для создания соединения с телеграммом.

Создайте файл simplebot.py со следующим содержанием:

# -*- coding: utf-8 -*- import telebot bot = telebot.TeleBot("") @bot.message_handler(commands=['help', 'start']) def send_welcome(message): msg = bot.send_message(message.chat.id, 'Привет! Я codex_bot!') @bot.message_handler(commands=['auth']) def send_auth(message): pass bot.polling()

Код довольно интуитивен, поясним только основные идеи. Когда пользователь будет вводить команды /start и /help — выполнится функция send_welcome, которая отправит пользователю в чат сообщение с приветствием. При вводе /auth пока ничего происходить не будет.

Запустите бота командой:

python simplebot.py

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

/setdescription

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

/setcommands

Выберите бота из списка и в следующем письме введите перечень команд в формате:

команда1 - Описание команды команда2 - Еще одно описание команды

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

Telegram-бот на Python: пошаговое руководство

Делимся инструкцией, как написать бота с помощью библиотеки python-telegram-bot за считанные минуты. На примере гайда от программиста Давида Мастроматтео.

Установка python-telegram-bot

Для создания бота понадобится пакет python-telegram-bot — оболочка для API от Telegram. Написать бота с помощью этой библиотеки очень просто, так как она полностью совместима с Python 3.6+.

Первое, что нужно сделать — установить python-telegram-bot. Вот ссылка на официальную документацию библиотеки. 

$ pip install python-telegram-bot –upgrade

Создание бота

Теперь можно взяться за создание бота. Для этого даже не нужно писать код. Перейдите в Telegram и найдите канал @BotFather, который отвечает за регистрацию новых ботов. Начните общаться с ботом и введите команду /newbot. Затем BotFather спросит у вас имя и юзернейм.

BotFather 1

BotFather 2

У BotFather можно запросить много других интересных вещей. Например, изменить изображение профиля бота.

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

Программирование бота 

Пакет python-telegram-bot состоит из оболочки API Telegram. Этот инструмент доступен через telegram.Bot-классы. Помимо них, есть еще модуль telegram.ext, который значительно упростит работу.

Модуль telegram.ext содержит много классов, но самые важные — telegram.ext.Updater и telegram.ext.Dispatcher. Updater отвечает за выборку новых обновлений от Telegram. Также он передает их в Dispatcher, после чего они обрабатываются с помощью Handler.

Приступим к программированию:

# mastrobot_example.py
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

# function to handle the /start command
def start(update, context):
    update.message.reply_text('start command received')

# function to handle the /help command
def help(update, context):
    update.message.reply_text('help command received')

# function to handle errors occured in the dispatcher 
def error(update, context):
    update.message.reply_text('an error occured')

# function to handle normal text 
def text(update, context):
    text_received = update.message.text
    update.message.reply_text(f'did you said "{text_received}" ?')

def main():
    TOKEN = "insert here your token and don't share it with anyone!"

    # create the updater, that will automatically create also a dispatcher and a queue to 
    # make them dialoge
    updater = Updater(TOKEN, use_context=True)
    dispatcher = updater.dispatcher

    # add handlers for start and help commands
    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(CommandHandler("help", help))

    # add an handler for normal text (not commands)
    dispatcher.add_handler(MessageHandler(Filters.text, text))

    # add an handler for errors
    dispatcher.add_error_handler(error)

    # start your shiny new bot
    updater.start_polling()

    # run the bot until Ctrl-C
    updater.idle()

if __name__ == '__main__':
    main()

В функции main создан класс Updater, который автоматически сгенерировал объект Dispatcher, доступный через .dispatcher-свойства класса Updater.

Добавьте несколько обработчиков:

  • команда /start вызывает функцию start(), которая отвечает пользователю информативным сообщением;
  • команда /help вызывает функцию help(), которая отвечает пользователю информативным сообщением;
  • если при отправке сообщений возникает ошибка, вызываем функцию error();
  • если пользователь напишет фразы или символы, которые не являются командой, вызываем функцию text(), отвечающую пользователю тем же полученным текстом.

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

Тестирование

Теперь можно протестировать бота. Запустите его.

$ python mastrobot_example.py

Пошлите ему команду /start .

Ура, бот работает!

Но это не конец. Надо создать бота, который сообщает пользователю его ежедневный биоритм. Для этого следует применить команду /start. С ее помощью при запуске чата можно получить данные о дне рождения пользователя. Затем надо создать функцию для обработки новой команды /biorhythm, чтобы отправить ответ пользователю с его личным биоритмом.

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

# function to handle the /start command
def start(update, context):
    first_name = update.message.chat.first_name
    update.message.reply_text(f"Hi {first_name}, nice to meet you!")
    start_getting_birthday_info(update, context)


В параметре update можно найти полезную информацию о пользователе, например, его имя.

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

STATE = None

BIRTH_YEAR = 1
BIRTH_MONTH = 2
BIRTH_DAY = 3

Теперь необходимо реализовать функцию start_getting:_birthday_info(), она вызывается с помощью команды start(). После запуска вы получите информацию о дне рождения от пользователя.

def start_getting_birthday_info(update, context):
    global STATE
    STATE = BIRTH_YEAR
    update.message.reply_text(f"I would need to know your birthday, so tell me what year did you born in...")

Для переменной STATE устанавливается значение BIRTH_YEAR, чтобы после ответа пользователя было понятно, что вопрос касался года рождения. Затем отправляется сообщение, чтобы узнать год рождения.

Теперь пользователь ответит обычным текстом, поэтому нужно изменить функцию text().

def text(update, context):
    global STATE

    if STATE == BIRTH_YEAR:
        return received_birth_year(update, context)

    if STATE == BIRTH_MONTH:
        return received_birth_month(update, context)

    if STATE == BIRTH_DAY:
        return received_birth_day(update, context)

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

Эти функции можно записать так:

def received_birth_year(update, context):
    global STATE

    try:
        today = datetime.date.today()
        year = int(update.message.text)
        
        if year > today.year:
            raise ValueError("invalid value")

        context.user_data['birth_year'] = year
        update.message.reply_text(f"ok, now I need to know the month (in numerical form)...")
        STATE = BIRTH_MONTH
    except:
        update.message.reply_text("it's funny but it doesn't seem to be correct...")

def received_birth_month(update, context):
    global STATE

    try:
        today = datetime.date.today()
        month = int(update.message.text)

        if month > 12 or month < 1:
            raise ValueError("invalid value")

        context.user_data['birth_month'] = month
        update.message.reply_text(f"great! And now, the day...")
        STATE = BIRTH_DAY
    except:
        update.message.reply_text("it's funny but it doesn't seem to be correct...")

def received_birth_day(update, context):
    global STATE

    try:
        today = datetime.date.today()
        dd = int(update.message.text)
        yyyy = context.user_data['birth_year']
        mm = context.user_data['birth_month']
        birthday = datetime.date(year=yyyy, month=mm, day=dd)

        if today - birthday < datetime.timedelta(days=0):
            raise ValueError("invalid value")

        context.user_data['birthday'] = birthday
        STATE = None
        update.message.reply_text(f'ok, you born on {birthday}')

    except:
        update.message.reply_text("it's funny but it doesn't seem to be correct...")

Когда получен год рождения пользователя, остается проверить, допустимое ли это значение. Если да, то оно сохраняется в словаре context.user_data[]. Продолжайте устанавливать значения для переменной STATE и задавать следующие вопросы.

Когда зададите последний вопрос и будете знать день рождения, создайте переменную даты и сохраните ее в context.user_data[] словаре.

Если пользователь вводит недопустимое значение, то получает ответ, что оно неверно. Значение переменной STATE не меняется, поэтому пользователь застревает на этом вопросе, пока не ответит правильно.

Создание команды

Теперь нужно обработать команду /biorhythm.

Добавьте новый обработчик команд в функцию main().

dispatcher.add_handler(CommandHandler("biorhythm", biorhythm))

Напишите функцию расчета биоритма:

# This function is called when the /biorhythm command is issued

def biorhythm(update, context):

    user_biorhythm = calculate_biorhythm(

        context.user_data['birthday'])

    update.message.reply_text(f"Phisical: {user_biorhythm['phisical']}")

    update.message.reply_text(f"Emotional: {user_biorhythm['emotional']}")

    update.message.reply_text(f"Intellectual: {user_biorhythm['intellectual']}")

def calculate_biorhythm(birthdate):

    today = datetime.date.today()

    delta = today - birthdate

    days = delta.days

    phisical = math.sin(2*math.pi*(days/23))

    emotional = math.sin(2*math.pi*(days/28))

    intellectual = math.sin(2*math.pi*(days/33))

    biorhythm = {}

    biorhythm['phisical'] = int(phisical * 10000)/100

    biorhythm['emotional'] = int(emotional * 10000)/100

    biorhythm['intellectual'] = int(intellectual * 10000)/100

    biorhythm['phisical_critical_day'] = (phisical == 0)

    biorhythm['emotional_critical_day'] = (emotional == 0)

    biorhythm['intellectual_critical_day'] = (intellectual == 0)

    return biorhythm

В примере представлены две разные функции: одна для обработки команды, а другая для расчета биоритма. Таким образом удается разделить ответственность этих функций.

Полный код бота

# mastrobot_example2.py
import datetime
import math
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

STATE = None
BIRTH_YEAR = 1
BIRTH_MONTH = 2
BIRTH_DAY = 3

# function to handle the /start command
def start(update, context):
    first_name = update.message.chat.first_name
    update.message.reply_text(f"Hi {first_name}, nice to meet you!")
    start_getting_birthday_info(update, context)

def start_getting_birthday_info(update, context):
    global STATE
    STATE = BIRTH_YEAR
    update.message.reply_text(
        f"I would need to know your birthday, so tell me what year did you born in...")

def received_birth_year(update, context):
    global STATE

    try:
        today = datetime.date.today()
        year = int(update.message.text)

        if year > today.year:
            raise ValueError("invalid value")

        context.user_data['birth_year'] = year
        update.message.reply_text(
            f"ok, now I need to know the month (in numerical form)...")
        STATE = BIRTH_MONTH
    except:
        update.message.reply_text(
            "it's funny but it doesn't seem to be correct...")

def received_birth_month(update, context):
    global STATE

    try:
        today = datetime.date.today()
        month = int(update.message.text)

        if month > 12 or month < 1:
            raise ValueError("invalid value")

        context.user_data['birth_month'] = month
        update.message.reply_text(f"great! And now, the day...")
        STATE = BIRTH_DAY
    except:
        update.message.reply_text(
            "it's funny but it doesn't seem to be correct...")

def received_birth_day(update, context):
    global STATE

    try:
        today = datetime.date.today()
        dd = int(update.message.text)
        yyyy = context.user_data['birth_year']
        mm = context.user_data['birth_month']
        birthday = datetime.date(year=yyyy, month=mm, day=dd)

        if today - birthday < datetime.timedelta(days=0):
            raise ValueError("invalid value")

        context.user_data['birthday'] = birthday
        STATE = None
        update.message.reply_text(f'ok, you born on {birthday}')

    except:
        update.message.reply_text(
            "it's funny but it doesn't seem to be correct...")

# function to handle the /help command
def help(update, context):
    update.message.reply_text('help command received')

# function to handle errors occured in the dispatcher
def error(update, context):
    update.message.reply_text('an error occured')

# function to handle normal text
def text(update, context):
    global STATE

    if STATE == BIRTH_YEAR:
        return received_birth_year(update, context)

    if STATE == BIRTH_MONTH:
        return received_birth_month(update, context)

    if STATE == BIRTH_DAY:
        return received_birth_day(update, context)

# This function is called when the /biorhythm command is issued
def biorhythm(update, context):
    print("ok")
    user_biorhythm = calculate_biorhythm(
        context.user_data['birthday'])

    update.message.reply_text(f"Phisical: {user_biorhythm['phisical']}")
    update.message.reply_text(f"Emotional: {user_biorhythm['emotional']}")
    update.message.reply_text(f"Intellectual: {user_biorhythm['intellectual']}")

def calculate_biorhythm(birthdate):
    today = datetime.date.today()
    delta = today - birthdate
    days = delta.days

    phisical = math.sin(2*math.pi*(days/23))
    emotional = math.sin(2*math.pi*(days/28))
    intellectual = math.sin(2*math.pi*(days/33))

    biorhythm = {}
    biorhythm['phisical'] = int(phisical * 10000)/100
    biorhythm['emotional'] = int(emotional * 10000)/100
    biorhythm['intellectual'] = int(intellectual * 10000)/100

    biorhythm['phisical_critical_day'] = (phisical == 0)
    biorhythm['emotional_critical_day'] = (emotional == 0)
    biorhythm['intellectual_critical_day'] = (intellectual == 0)

    return biorhythm

def main():
    TOKEN = "insert here your token and don't share it with anyone!"

    # create the updater, that will automatically create also a dispatcher and a queue to
    # make them dialoge
    updater = Updater(TOKEN, use_context=True)
    dispatcher = updater.dispatcher

    # add handlers for start and help commands
    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(CommandHandler("help", help))
    # add an handler for our biorhythm command
    dispatcher.add_handler(CommandHandler("biorhythm", biorhythm))

    # add an handler for normal text (not commands)
    dispatcher.add_handler(MessageHandler(Filters.text, text))

    # add an handler for errors
    dispatcher.add_error_handler(error)

    # start your shiny new bot
    updater.start_polling()

    # run the bot until Ctrl-C
    updater.idle()


if __name__ == '__main__':
    main()


Пришло время проверить его:

Telegram bot

Поздравляем! Telegram-бот на Python полностью готов. 

Бот, созданный для примера, был сохранен. Его можно протестировать по имени пользователя @mastro35_mastrobot.

Как создать бота в Телеграм для получения оповещений с форм сайта

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

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

Как создать бота

1. Первым делом, у вас должен быть установлен мессенджер Telegram. На телефоне или ПК, а желательно и там и там. Я буду показывать на примере ПК, но на телефоне все то же самое.

2. Далее нужно найти через поиск в мессенджере главного бота, что создает других. Это BotFather — единственный бот, который управляет ими всеми. Используйте его для создания новых учетных записей ботов и управления существующими ботами. Найдите и нажмите на него, чтобы открылся его чат.

3. Теперь нужно запустить BotFather. Для этого нужно нажать кнопку ЗАПУСТИТЬ внизу чата или написать в чат /start, если вместо кнопки у вас поле для ввода.

4. После запуска появится список команд, переместитесь в начало сообщения и нажмите на команду /newbot или просто пропишите эту команду через поле сообщения.

5. Теперь BotFather предложит вам назвать своего бота. Это название вы будете видеть в списке контактов. В примере бот назван как testmailbot. Можете называть как угодно, например: Бот для формы контактов, Бот какого-то плагина, Мой бот с сайта и тд. Без разницы, лишь бы вы понимали что это за бот и если у вас их будет много, вы их не путали.

6. Далее BotFather предложит вам указать имя бота. Вот тут нужно быть внимательным. Имя бота вводится только латиницей и в конце должно заканчиваться на bot. В примере это testmailbot_bot. Задавайте что хотите, если имя будет существовать, BotFather вас предупредит. Так что придумайте что-то уникальное.

7. Если вы задали правильное имя, то BotFather напишет вам, что все готово и вашему боту присвоен Токен, который понадобится для доступа через HTTP API. Этот токен нам и нужен для того, чтобы формы отправляли свои данные в Телеграм.

8. Теперь найдем и запустим нашего бота. Для этого в поиске контактов в Telegram найдите бота и нажмите на него.

9. Так же нужно запустить бота. Внизу есть кнопка ЗАПУСТИТЬ или напишите в чат /start, если вместо кнопки у вас поле для ввода.

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

8. Чтобы добавить бота в групповой чат, если вы захотите иметь несколько ботов для нескольких форм, то вам нужно перейти в настройки Telegram и выбрать пункт — Создать группу.

9. Далее нужно ввести название для группы. Вводите какое вам нравится.

10. Теперь нужно добавить участников в группу, то бишь нашего бота. Есть 2 способа. Можно просто на странице самого бота нажать на его настройки и там выбрать пункт Добавить в группу. После чего вам предложит ваши собственные группы. Выберите ту что создали только что для ботов и все. Второй вариант — нажмите на настройки группы и выберите пункт — Добавить участников.

11. Перед вами появится окно поиска, введите в поле имя своего бота, то что вводили в пункте 6. Возможно, найдется несколько ботов, но только у одного будет точное название, в нашем примере это @testmailbot_bot. Когда найдете своего бота, выделите и нажмите кнопку — Добавить.

12. Последнее что нужно сделать чтобы передавать данные с форм которые поддерживают передачу на Телеграм, это получить ID чата. Тут два варианта. Если вы используете только чат бота, то ID один, если чат группы с ботами, то ID другой. Чтобы узнать нужный ID, нужно в адресной строке браузера перейти по ссылке, которую нужно сформировать.

https://api.telegram.org/botХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ/getUpdates

Вместо ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ нужно вставить тот токен, который вам дал BotFather в пункте 7, этой инструкции.

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

Перейдите по получившейся у вас ссылке. Если вы увидите много кода все ок, но если что-то примерно такое:

{«ok»:true,»result»:[]}

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

Рекомендую открывать ссылку в браузере Mozilla Firefox. В нем данные отображаются сгруппировано и очень легко понять где нужный ID. Где чат бота, где чат группы, если вы в нее добавили бота.

Как видите, по изображению видно что вначале показывает ID чата бота с моим именем, у вас будет с вашим, после того как вы напишите что-нибудь боту. Ну а далее ID группы, в которую мы добавили нашего бота в пункте 9/10.

Много непонятного, но среди этого кода нужно всего одно значение. Какое, зависит от того используете ли вы лишь бота или чат. Если только бота то ищите, ID такого типа — «id»:380199086,»first_name». И з этого вам нужно только номер 380199086. Если у вас группа с ботами, то такого «id»:-1011500162037. У ID груп стоит черточка в начале. Вам, опять же, нужен номер только с черточкой -1011500162037. Если, вдруг, вы добавили токен и ID в форму, а сообщения не приходят, то попробуйте другой. Сложностей не должно возникнуть.

После успешного добавления испытайте плагин или форму. Вы должны получить оповещение на Telegram, в моем примере, это выглядело так:

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

На этом все, спасибо за внимание. 🙂

Урок 1: Введение, простой echo-бот

Приветствую тебя, читатель! Telegram Bot API – это мощный инструмент для вообще чего угодно. Автоматизация действий, работа с пользователями, онлайн-магазины, игры и много чего ещё. В этом учебнике мы научимся писать ботов для Telegram на языке Python.

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

Язык программирования будет Python 3, но это не означает, что любители PHP, Ruby и т.д. в пролёте; все основные принципы совпадают. Я не буду особо останавливаться на описании самого языка, желающие могут ознакомиться с документацией по Python здесь.

Подготовка к запуску

Взаимодействие ботов с людьми основано на HTTP-запросах. Чтобы не мучаться с обработкой «сырых» данных, воспользуемся библиотекой pyTelegramBotAPI, которая берет на себя все нюансы отправки и получения запросов, позволяя сконцентрироваться непосредственно на логике. Установка библиотеки предельно простая:

pip install pytelegrambotapi
python3
Скриншот из терминала с запущенным интерпретатором Python
Обратите внимание: библиотека называется pyTelegramBotAPI, а не telebot. Последнюю ставить не нужно!

Теперь можно выйти из режима Python-консоли (Ctrl+Z или Ctrl+D, или exit())

Пишем простого echo-бота

Ну, довольно слов, перейдем к делу. В качестве практики к первому уроку, напишем бота, повторяющего присланное текстовое сообщение. Создадим каталог, а внутри него 2 файла: bot.py и config.py. Я рекомендую выносить различные константы и настройки в файл config.py, дабы не загромождать другие. В файл config.py впишем:

# Токен ненастоящий :) Подставьте свой
token = '1234567890:AAE_abCDEFghijKLmNOpqRsTuVWxyz'

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

@bot.message_handler(content_types=["text"])
def repeat_all_messages(message): # Название функции не играет никакой роли
    bot.send_message(message.chat.id, message.text)

У читателя возникнет вопрос: зачем там символ “@”? Что это вообще за message_handler? Дело в том, что после приёма сообщения от Telegram его надо обработать по-разному в зависимости от того, что это за сообщение: текст “привет” или текст “пока”, может быть, вообще стикер или музыка. Первое, что придёт в голову – написать множество конструкций if-then-else, но такой подход некрасивый и позволяет быстро запутаться.
Для решения этой проблемы автор библиотеки pyTelegramBotAPI реализовал механизм хэндлеров, которые используют питоновские декораторы (пока просто запомним это слово). В хэндлере описывается, в каком случае необходимо выполнять ту или иную функцию. Например, хэндлер @bot.message_handler(content_types=["text"]) выполнит нижестоящую функцию, если от Telegram придёт текстовое сообщение, а хэндлер @bot.message_handler(commands=["start"]) сработает при получении команды /start.

Теперь запустим бесконечный цикл получения новых записей со стороны Telegram:

if __name__ == '__main__':
    bot.infinity_polling()

Функция infinity_polling запускает т.н. Long Polling, бот должен стараться не прекращать работу при возникновении каких-либо ошибок. При этом, само собой, за ботом нужно следить, ибо сервера Telegram периодически перестают отвечать на запросы или делают это с большой задержкой приводя к ошибкам 5xx)

Итак, полный код файла bot.py выглядит следующим образом:

import config
import telebot

bot = telebot.TeleBot(config.token)

@bot.message_handler(content_types=["text"])
def repeat_all_messages(message): # Название функции не играет никакой роли
    bot.send_message(message.chat.id, message.text)

if __name__ == '__main__':
     bot.infinity_polling()

Готово! Осталось запустить бота: python3 bot.py

Бот работает

На этом первый урок окончен.

Урок №2 →

Глава 1 Создаём бота, и отправляем с его помощью сообщения в telegram (1)

В этой главе мы разберёмся как создать телеграм бота, и отправлять с его помощью уведомления в telegram.

Создание телеграм бота

Для начала нам необходимо создать бота. Делается это с помощью специального бота BotFather, переходим по ссылке и пишем боту /start.

После чего вы получите сообщение со списком команд:

I can help you create and manage Telegram bots. If you're new to the Bot API, please see the manual (https://core.telegram.org/bots).

You can control me by sending these commands:

/newbot - create a new bot
/mybots - edit your bots [beta]

Edit Bots
/setname - change a bot's name
/setdescription - change bot description
/setabouttext - change bot about info
/setuserpic - change bot profile photo
/setcommands - change the list of commands
/deletebot - delete a bot

Bot Settings
/token - generate authorization token
/revoke - revoke bot access token
/setinline - toggle inline mode (https://core.telegram.org/bots/inline)
/setinlinegeo - toggle inline location requests (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - change inline feedback (https://core.telegram.org/bots/inline#collecting-feedback) settings
/setjoingroups - can your bot be added to groups?
/setprivacy - toggle privacy mode (https://core.telegram.org/bots#privacy-mode) in groups

Games
/mygames - edit your games (https://core.telegram.org/bots/games) [beta]
/newgame - create a new game (https://core.telegram.org/bots/games)
/listgames - get a list of your games
/editgame - edit a game
/deletegame - delete an existing game

Для создания нового бота отправляем команду /newbot.

BotFather попросит вас ввести имя и логин бота.

BotFather, [25.07.20 09:39]
Alright, a new bot. How are we going to call it? Please choose a name for your bot.

Alexey Seleznev, [25.07.20 09:40]
My Test Bot

BotFather, [25.07.20 09:40]
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.

Alexey Seleznev, [25.07.20 09:40]
@my_test_bot

Имя вы можете ввести произвольное, а логин должен заканчиваться на bot.

Если вы всё сделали правильно, то получите следующее сообщение:

Done! Congratulations on your new bot. You will find it at t.me/my_test_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:
123456789:abcdefghijklmnopqrstuvwxyz

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

Далее вам понадобится полученный API токен, в моём примере это 123456789:abcdefghijklmnopqrstuvwxyz.

Более подробно о возможностях BotFather можно узнать из этой публикации. На этом шаге подготовительные работы по созданию бота завершены.

Установка пакета для работы с телеграм ботом на R

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

Для работы с Telegram Bot API мы будем использовать R пакет telegram.bot.

Установка пакетов в R осуществляется функцией install.packages(), поэтому для установки нужного нам пакета используйте команду install.packages("telegram.bot").

Более подробно узнать об установке различных пакетов можно из этого видео.

После установки пакета его необходимо подключить:

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

Созданного вами бота можно найти в Telegram по заданному при создании логину, в моём случае это @my_test_bot.

Отправьте боту любое сообщение, например “Привет бот.” На данный момент это нам надо для того, что бы получить id вашего с ботом чата.

Теперь в R пишем следующий код.

library(telegram.bot)

# создаём экземпляр бота
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Запрашиваем информацию о боте
print(bot$getMe())

# Получаем обновления бота, т.е. список отправленных ему сообщений
updates <- bot$getUpdates()

# Запрашиваем идентификатор чата
# Примечание: перед запросом обновлений вы должны отправить боту сообщение
chat_id <- updates[[1L]]$from_chat_id()

Изначально мы создаём экземпляр нашего бота функцией Bot(), в качестве аргумента в неё необходимо передать полученный ранее токен.

Хранить токен в коде считается не лучшей практикой, поэтому вы можете хранить его в переменной среды, и считывать его из неё. По умолчанию в пакете telegram.bot реализована поддержка переменных среды следующего наименования: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА. Вместо ИМЯ_ВАШЕГО_БОТА подставьте имя которое вы задали при создании, в моём случае будет переменная R_TELEGRAM_BOT_My Test Bot.

Создать переменную среды можно несколькими способами, я расскажу о наиболее универсальном и кроссплатформенном. Создайте в вашей домашней директории (узнать её можно с помощью команды path.expand("~")) текстовый файл с названием .Renviron. Сделать это также можно с помощью команды file.edit(path.expand(file.path("~", ".Renviron"))).

И добавьте в него следующую строку.

R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА=123456789:abcdefghijklmnopqrstuvwxyz

Далее вы можете использовать сохранённый в переменной среды токен с помощью функции bot_token(), т.е. вот так:

bot <- Bot(token = bot_token("My Test Bot"))

Метод getUpdates()позволяет нам получить обновления бота, т.е. сообщения которые были ему отправлены. Метод from_chat_id(), позволяет получить идентификатор чата, из которого было отправлено сообщение. Этот идентификатор нам нужен для отправки сообщений от бота.

Помимо id чата из объекта полученного методом getUpdates() вы получаете и некоторую другую полезную информацию. Например, информацию о пользователе, отправившем сообщение.

updates[[1L]]$message$from
$id
[1] 000000000

$is_bot
[1] FALSE

$first_name
[1] "Alexey"

$last_name
[1] "Seleznev"

$username
[1] "AlexeySeleznev"

$language_code
[1] "ru"

Итак, на данном этапе у нас уже есть всё, что необходимо для отправки сообщения от бота в телеграм. Воспользуемся методом sendMessage(), в который необходимо передать идентификатор чата, текст сообщения, и тип разметки текста сообщения. Тип разметки может быть Markdown или HTML и устанавливается аргументом parse_mode.

# Отправка сообщения
bot$sendMessage(chat_id,
                text = "Привет, *жирный текст* _курсив_",
                parse_mode = "Markdown"
)

Если вам необходимо отправить сообщение от бота не в чат, а в публичный канал, то в chat_id указывайте адрс вашего канала, например '@MyTGChannel'.

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

Пример ссылки приватного канала: https://t.me/c/012345678/11

Соответвенно, к id 012345678 вам необходимо добавить -100, в таком случае в chat_id надо указать -100012345678.

Основы форматирования Markdown разметки:

  • Жирный шрифт выделяется с помощью знака *:
    • пример: *жирный шритф*
    • результат: жирный шритф
  • Курсив задаётся нижним подчёркиванием:
    • пример: _курсив_
    • результат: курсив
  • Моноширинный шрифт, которым обычно выделяется программный код, задаётся с помощью апострофов:
    • пример: `моноширинный шрифт`
    • результат: моноширинный шрифт

Основы форматирования HTML разметки:

В HTML вы заворачиваете часть текста, которую надо выделать, в теги, пример <тег>текст</тег>.

  • <тег> — открывающий тег
  • </тег> — закрывающий тег

Теги HTML разметки

  • <b> — жирный шрифт
    • пример: <b>жирный шрифт</b>
    • результат жирный шрифт
  • <i> — курсив
    • пример: <i>курсив</i>
    • результат: курсив
  • <code> — моноширинный шрифт
    • пример: <code\>моноширинный шрифт</code\>
    • результат: моноширинный шрифт

Помимо текста вы можете отправлять и другой контент используя специальные методы:

# Отправить изображение
bot$sendPhoto(chat_id,
  photo = "https://telegram.org/img/t_logo.png"
)

# Отправка голосового сообщения
bot$sendAudio(chat_id,
  audio = "http://www.largesound.com/ashborytour/sound/brobob.mp3"
)

# Отправить документ
bot$sendDocument(chat_id,
  document = "https://github.com/ebeneditos/telegram.bot/raw/gh-pages/docs/telegram.bot.pdf"
)

# Отправить стикер
bot$sendSticker(chat_id,
  sticker = "https://www.gstatic.com/webp/gallery/1.webp"
)

# Отправить видео
bot$sendVideo(chat_id,
  video = "http://techslides.com/demos/sample-videos/small.mp4"
)

# Отправить gif анимацию
bot$sendAnimation(chat_id,
  animation = "https://media.giphy.com/media/sIIhZliB2McAo/giphy.gif"
)

# Отправить локацию
bot$sendLocation(chat_id,
  latitude = 51.521727,
  longitude = -0.117255
)

# Имитация действия в чате
bot$sendChatAction(chat_id,
  action = "typing"
)

Т.е. например с помощью метода sendPhoto() вы можете отправить сохранённый в виде изображения график, который вы построили с помощью пакета ggplot2.

Как отправить в telegram таблицу

К сожалению на момент написания книги telegram не поддерживает полноценные таблицы в HTML или Markdown, но вы можете иметировать подобие таблицы. Для этого воспользуйтесь кодом представленной ниже функции to_tg_table():

library(purrr)
library(tidyr)
library(stringr)

# функция для перевода data.frame в telegram таблицу 
to_tg_table <- function( table, align = NULL, indents = 3, parse_mode = 'Markdown' ) {
  
  # если выравнивание не задано то выравниваем по левому краю
  if ( is.null(align) ) {
    
    col_num <- length(table)
    align   <- str_c( rep('l', col_num), collapse = '' )
  
  }
  
  # проверяем правильно ли заданно выравнивание
  if ( length(table) != nchar(align) ) {
    
    align <- NULL
    
  }
  
  # новое выравнивание столбцов 
  side <- sapply(1:nchar(align), 
         function(x) { 
           letter <- substr(align, x, x)
           switch (letter,
                   'l' = 'right',
                   'r' = 'left',
                   'c' = 'both',
                   'left'
           )
  })
  
  # сохраняем имена
  t_names      <- names(table)

  # вычисляем ширину столбцов
  names_length <- sapply(t_names, nchar) 
  value_length <- sapply(table, function(x) max(nchar(as.character(x))))
  max_length   <- ifelse(value_length > names_length, value_length, names_length)
  
  # подгоняем размер имён столбцов под их ширину + указанное в indents к-во пробелов 
  t_names <- mapply(str_pad, 
                    string = t_names, 
                    width  = max_length + indents, 
                    side   = side)
  
  # объединяем названия столбцов
  str_names <- str_c(t_names, collapse = '')
  
  # аргументы для фукнции str_pad
  rules <- list(string = table, width = max_length + indents, side = side)

  # поочереди переводим каждый столбец к нужному виду
  t_str <-   pmap_df( rules, str_pad )%>%
              unite("data", everything(), remove = TRUE, sep = '') %>%
              unlist(data) %>%
              str_c(collapse = '\n') 
  
  # если таблица занимает более 4096 символов обрезаем её
  if ( nchar(t_str) >= 4021 ) {
    
    warning('Таблица составляет более 4096 символов!')
    t_str <- substr(t_str, 1, 4021)
    
  }
  
  # символы выделения блока кода согласно выбранной разметке
  code_block <- switch(parse_mode, 
                       'Markdown' = c('```', '```'),
                       'HTML' = c('<code>', '</code>'))
           
  # переводим в code
  res <- str_c(code_block[1], str_names, t_str, code_block[2], sep = '\n')
  
  return(res)
}

С помощью этой функци вы можете преобразовать любой data.frame и отправить в telegram:

# преобразуем таблицу iris 
tg_table <- to_tg_table( head(iris, 15) )

# отправляем таблицу в telegram
bot$sendMessage(194336771, 
                tg_table,
                "Markdown")

В telegram это буедет выглядеть так:

У функции to_tg_table() есть несколько дополнительных аргументов:

  • align — выравнивнивание столбцов, тектовая строка, каждая буква соответвует одному столбцу, пример 'llrrc':
    • l — выравнивание по левой стороне
    • r — выравнивание по правой стороне
    • c — выравнивание по центру
  • indents — количество пробелов для разделения столбцов.
  • parse_mode — разметка сообщения, Markdown или HTML.

Пример с выравниванием столбцов:

# преобразуем таблицу iris 
tg_table <- to_tg_table( head(iris, 15), 
                         align = 'llccr')

# отправляем таблицу в telegram
bot$sendMessage(194336771, 
                tg_table,
                "Markdown")

Как добавить в сообщение Emoji

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

Получить полный список доступных смайлов можно по этой ссылке.

Таблица смайлов

Из таблицы нас интересует поле Unicode. Скопиройте код нужного вам смайла, и замените U+ на \U000. Т.е. если вам необходимо отправить смайл, код котого в таблице U+1F601, то в коде на R вам необходимо добавить его в текст сообщения вот так — \U0001F601.

Пример:

bot$sendMessage(chat_id, 
                'Сообщение со смайлом \U0001F601 код которого в таблице U+1F601')

Результат:

Проверка планировщика задач Windows, и отправка уведомления о задачах, работа которых была завершена аварийно

Для работы с планировщиком заданий Windows вам необходимо установить пакет taskscheduleR, и для удобства работы с данными установим пакет dplyr.

# Установка пакетов
install.packages(c('taskscheduleR', 'dplyr'))
# Подключение пакетов
library(taskscheduleR)
library(dplyr)

Далее с помощью функции taskscheduler_ls() мы запрашиваем информацию о задачах из нашего планировщика. С помощью функции filter() из пакета dplyr мы убираем из списка задач те, которые были успешно выполненны и имеют статус последнего результата 0, и те, которые ещё ни разу не запускались и имеют статус 267011, выключенные задачи, и задачи которые выполняются в данный момент.

# запрашиваем список задач
task <- task <- taskscheduler_ls() %>%
        filter(! `Last Result`  %in% c("0", "267011") & 
               `Scheduled Task State` == "Enabled" & 
               Status != "Running") %>%
        select(TaskName) %>%
        unique() %>%
        unlist() %>%
        paste0(., collapse = "\n")

В объекте task у нас теперь список задач, работа которых завершилась ошибкой, этот список нам надо отправить в Telegram.

Если рассмотреть каждую команду подробнее, то:

  • filter() — фильтрует список задач, по описанным выше условиям
  • select() — оставляет в таблице только одно поле с названием задач
  • unique() — убирает дубли названий
  • unlist() — переводит выбранный столбец таблицы в вектор
  • paste0() — соединяет названия задач в одну строку, и ставит в качестве разделителя знак перевода строки, т.е. \n.

Всё что нам остаётся — отправить этот результат в телеграм.

bot$sendMessage(chat_id,
                text = task,
                parse_mode = "Markdown"
)

Итак, на данный момент код бота выглядит вот так:

# Подключение пакета
library(telegram.bot)
library(taskscheduleR)
library(dplyr)

# инициализируем бота
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# идентификатор чата
chat_id <- 123456789

# запрашиваем список задач
task <- taskscheduler_ls() %>%
        filter(! `Last Result`  %in% c("0", "267011")  &
               `Scheduled Task State` == "Enabled" & 
               Status != "Running") %>%
        select(TaskName) %>%
        unique() %>%
        unlist() %>%
        paste0(., collapse = "\n")

# если есть проблемные задачи отправляем сообщение
if ( task != "" ) {

  bot$sendMessage(chat_id,
                  text = task,
                  parse_mode = "Markdown"
  )

}

При использовании приведённого выше примера подставьте в код токен вашего бота и ваш идентификатор чата.

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

Так же вы можете вынести различные настройки в отдельный файл конфигурации, и хранить в нём id чата и токен. Читать конфиг можно например с помощью пакета configr.

[telegram_bot]
;настройки телеграм бота и чата, в который будут приходить уведомления
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"
library(configr)

# чтение конфина
config <- read.config('C:/путь_к_конфигу/config.cfg', rcmd.parse = TRUE)

bot_token <- config$telegram_bot$bot_token
chat_id     <- config$telegram_bot$chat_id

Настраиваем расписание запуска проверки задач

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

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

  1. Пропишите в системную переменную Path путь к папке в которой установлен R, в Windows путь будет примерно таким: C:\Program Files\R\R-4.0.2\bin.
  2. Создайте исполняемый bat файл, в котором будет всего одна строка R CMD BATCH C:\rscripts\check_bot\check_bot.R. Замените C:\rscripts\check_bot\check_bot.R на полный путь к вашему R файлу.
  3. Далее настройте с помощью планировщика задач Windows расписание запуска, например на каждые пол часа.

Заключение

В этой главе мы разобрались с тем, как создать бота, и отправлять с его помощью различные уведомления в telegram.

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

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

Тесты и задания

Тесты

Для закрепления материла рекомендую вам пройти тест доступный по ссылке.

Задания

  1. Создайте с помощью BotFather бота.
  2. Перейдите к диалогу с ботом, и узнайте идентификатор вашего с ботом чата.
  3. Отправьте с помощью созданного бота в telegram первые 20 строк из встроенного в R набора данных ToothGrowth.

Если вы всё сделали правильно то результат будет следующим:

как создать своего чат-бота, если совсем в них не разбираешься

Как создавать ботов для мессенджеров без каких-либо навыков в программировании? Какие сервисы и платформы для этого существуют? И какой функционал они предоставляют? Об этом на мастер-классе по созданию чат-ботов рассказал ведущий программист Санкт-Петербургского информационно-аналитического центра (СПб ИАЦ) Артем Копылов. СПб ИАЦ работает в ведении Комитета по информатизации и связи и занимается разработкой городских порталов, решениями в сфере госсектора, в том числе помогает разгрузить системы с помощью внедрения алгоритмов обработки запросов и ботов. Мероприятие состоялось в рамках онлайн-марафона от Центра карьеры Университета ИТМО ITMO.Digital.CareerWeek’20. Записали самое интересное.

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

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

Самые продвинутые боты становятся полноценными виртуальными помощниками, такими как Алиса от Яндекса или Алекса от Amazon.

Чат-бот. Источник: shutterstock.com

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

Например, Санкт-Петербургская компания Just Ai, занимающаяся разработкой бизнес-решений на основе искусственного интеллекта, создала свой конструктор — Aimylogic. Он позволяет создавать не только текстовые чат-боты, но и боты обзвонов, которые можно встроить на любой платформе: на сайте интернет-магазина, лендинговой странице, в телеграм-канале и так далее. Есть интеграция и с крупными системами для бизнеса, такими как Битрикс24, LiveTex и Webim.

В конструкторе есть большое количество готовых шаблонов и скриптов, например, обработка заявок на кредит, онлайн-заказы для интернет-магазина, бронирование столика в кафе, сбор информации для доставки, бот для обработки типовых запросов и сбора лидов, HR-бот с интеграцией Trello и сервисом автоматизации IFTTT.

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

Источник: shutterstock.com

Важной особенностью Aimylogic является блок «Интенты», благодаря которому можно легко настроить сценарий взаимодействия с пользователем. В него можно добавить ключевые слова и фразы, которые могут написать (или произнести) пользователи и таким образом активировать определенную ветку сценария. Причем у конструктора есть встроенный алгоритм машинного обучения, благодаря которому он может понимать и реагировать на пользовательские фразы на естественном языке. То есть вам достаточно указать в блоке «Фразы» примеры слов, а дерево синонимов, схожих выражений или вариантов написания с ошибками выстроится автоматически.

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

Сайт предоставляет бесплатный пробный период 14 дней по тарифу «Developer». Из недостатков платформы можно выделить довольно высокую стоимость (она рассчитывается из количества пользователей бота в месяц), отсутствие функции автоматических рассылок и вебхуков — механизма оповещения системы о событиях, например, совершения оплаты через сайт банка.

Источник: shutterstock.com

Botmother специализируется на создании ботов для мессенджеров и соцсетей: Telegram, Facebook, Viber, Одноклассников и Вконтакте. В отличие от предыдущего конструктора, функционал включает автоматические рассылки по базе пользователей, встроенные платежи в Telegram, статистику пользователей и их взаимодействия с ботом. Однако все эти дополнительные функции недоступны в бесплатном режиме.

Прежде чем начать работу с конструктором, необходимо создать заготовку через BotFather в Telegram. В нем нужно придумать и зарегистрировать уникальное имя бота, после чего генерируется специальный токен, позволяющий встраивать бота уже на своей площадке. Этот же токен используется и в конструкторах. Дальше уже его можно настроить, задать алгоритм взаимодействия с пользователем и так далее.

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

Компания Спб ИАЦ разработала свой конструктор ботов для Telegram — Isaak.io. Сейчас проект находится в стадии тестирования, но большинство функций вполне рабочие. Конструктор абсолютно бесплатный, поэтому он может стать отличной площадкой для обучения и тренировки.

Источник: shutterstock.com

Функционал также реализован в виде наглядного графического дерева связей. На сайте представлен весь необходимый инструментарий для тонкой настройки бота: вывод определенного текста, отправка медиа-файлов (картинки, видео документа), запрос API — то есть подключение к данным, хранящимся во внутренних системах компании. Например, бот может показать баланс на карте. Также есть функция настройки рассылки, сбора статистики и вебхуки.

Начало работы также происходит через создание заготовки в BotFather. Далее в конструкторе можно добавить кнопки навигации, окно для ввода данных пользователем, сценарий взаимодействия через функцию «Условие», логирование, которое помимо сбора статистики может использоваться для ограничения действий пользователя (например, если нужно, чтобы пользователь мог проголосовать или ответить на вопрос только один раз). Также есть функция загрузки данных с внешнего сайта через кнопку «HTTP запрос», например, если нужно посмотреть товары в наличии в интернет-магазине или отсортировать вакансии с агрегатора вроде hh.ru.

В разработке используется сторонний сервис от Google — Dialogflow, который помогает научить алгоритм распознавать текстовую и голосовую речь пользователя в ее естественном виде. Также в будущем планируется интеграция с голосовыми помощниками — Алисой от Яндекса и Google Ассистентом.

Перейти к содержанию

Подключите бота Bot Framework к Telegram — служба ботов

  • 2 минуты на чтение
Эта страница полезна?

Оцените свой опыт

да Нет

Любой дополнительный отзыв?

Отзыв будет отправлен в Microsoft: при нажатии кнопки «Отправить» ваш отзыв будет использован для улучшения продуктов и услуг Microsoft.Политика конфиденциальности.

Представлять на рассмотрение

В этой статье

ПРИМЕНЯЕТСЯ К: SDK v4

Вы можете настроить своего бота для общения с людьми с помощью приложения для обмена сообщениями Telegram.

Подсказка

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

Посетите отца бота, чтобы создать нового бота в Telegram

Создайте нового бота Telegram с помощью Bot Father.

Создать нового Telegram-бота

Чтобы создать нового бота Telegram, отправьте команду / newbot .

Укажите понятное имя

Дайте боту Telegram понятное имя.

Укажите логин

Дайте боту Telegram уникальное имя пользователя.

Скопируйте токен доступа

Скопируйте токен доступа бота Telegram.

Введите токен доступа бота Telegram

Войдите на портал Azure. Перейдите к своему боту или создайте нового Azure Bot.

Перейдите в раздел каналов вашего бота на портале Azure и выберите Telegram .

Примечание

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

Вставьте ранее скопированный токен в поле Access Token и нажмите Сохранить .

Ваш бот успешно настроен для общения с пользователями в Telegram.

Дополнительная информация

Для получения информации о том, как создать сообщение, которое реализует действия, специфичные для Telegram, смотрите, как реализовать специфические для канала функции.

Как создать чат-бота на Python для Telegram за 9 простых шагов — блог MindK

Часть 3 нашей серии статей о чат-ботах содержит пошаговое руководство по созданию бота для Telegram на Python.Бот должен уметь отображать обменные курсы, показывать разницу между прошлым и текущим обменными курсами, а также использовать современные встроенные клавиатуры.

Теперь давайте перейдем к делу и узнаем, как создать бота для Python Telegram.

Подробнее: 8 вопросов, которые следует задать себе перед созданием чат-бота .

Содержание :

Шаг № 0: Немного теории Telegram Bot API

Вот простой вопрос, чтобы начать наше руководство: как вы разрабатываете чат-ботов Telegram?

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

 https://api.telegram.org/bot/METHOD_NAME 

Токен — это уникальная строка символов, необходимая для аутентификации бота в системе. Он генерируется при создании бота и выглядит так:

 123456: ABC-DEF1234ghIkl-zyx57W2v1u123ew11 

METHOD_NAME (и это очевидно из его названия) — это метод, например, getUpdates , sendMessage , getChat и т. Д.

Для выполнения запросов вы можете использовать как GET, так и POST запросы.Многие методы требуют дополнительных параметров (например, при использовании метода sendMessage необходимо указывать chat_id и text). Параметры могут быть переданы в виде строки запроса URL, application / x-www-form-urlencoded и application-json (кроме загрузки файлов).

Еще одно требование — кодировка UTF-8.

После отправки запроса API вы получите ответ в формате JSON. Например, если мы получим данные с помощью метода « getMe », мы получим что-то вроде этого:

 ПОЛУЧИТЬ https: // api.telegram.org/bot/getMe 
 {
   ок: правда,
   результат: {
       id: 231757398,
       first_name: "Обменный курс Бот",
       имя пользователя: "exchangetestbot"
   }
} 

Если «ok» равно true, запрос был успешным, и результат будет отображаться в поле «результат». Если «ok» равно false, вы увидите сообщение об ошибке в поле «description».

Здесь вы можете найти список всех типов данных и методов Telegram Bot API.

Следующий вопрос: как получать сообщения пользователей?

Это можно сделать двумя способами.

Вы можете вручную делать запросы с помощью метода getUpdates . В ответ вы получите массив объектов Update. Этот метод действует как технология длительного опроса (вы делаете запрос, обрабатываете данные, а затем начинаете заново). Чтобы избежать повторной обработки одних и тех же данных, рекомендуется использовать параметр смещение .

Второй способ — использовать веб-перехватчики. Вы должны использовать метод setWebhook только один раз. После этого Telegram отправит все обновления по указанному URL-адресу, как только они появятся.

Единственное ограничение — вам нужен HTTPS (однако разрешены и самозаверяющие сертификаты).

А как выбрать оптимальный способ приема сообщений?

Метод getUpdates лучше всего подходит, если:

  1. Вы не хотите или не можете настраивать HTTPS во время разработки.
  2. Вы используете языки сценариев, которые сложно интегрировать в веб-сервер.
  3. Ваш бот перегружен.
  4. Время от времени вы меняете сервер бота.

Метод перехвата является лучшим выбором, если:

  1. Вы кодируете на веб-языке (например, PHP).
  2. У вашего бота низкая нагрузка, и нет смысла регулярно запрашивать обновления вручную.
  3. Ваш бот постоянно интегрирован в веб-сервер.

В этом руководстве я буду использовать метод getUpdates.

Теперь, как сделать программу-бот?

@BotFather используется для создания ботов Telegram. Он также позволяет выполнять базовую настройку (описание, фото профиля, встроенную поддержку и т. Д.).).

Существует множество библиотек, которые могут упростить работу с Telegram Bot API. Назову несколько:

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

В этом руководстве по боту Telegram я собираюсь создать чат-бота Python с помощью библиотеки pyTelegramBotApi.

Шаг №1: Реализуйте запросы обменных курсов

Давайте напишем сценарий Python, который будет реализовывать логику для запросов конкретных курсов обмена валют.Мы собираемся использовать API ПриватБанка.

Пример ответа:

 [
    {
        ccy: "EUR",
        base_ccy: "UAH",
        купить: «28.70000»,
        продажа: "29.10000"
    },
    {
        ccy: «RUR»,
        base_ccy: "UAH",
        купить: "0,39300",
        продажа: "0.40300"
    },
    {
        ccy: "USD",
        base_ccy: "UAH",
        купить: "25.40000",
        продажа: "25.70000"
    }
]
 

Создадим файл pb.ру и напишем следующий код:

 # - * - кодировка: utf-8 - * -
импорт ре
запросы на импорт
импортировать json 
URL = 'https: // api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5 '
def load_exchange (): вернуть json.loads (requests.get (URL) .text) def get_exchange (ccy_key): для exc в load_exchange (): если ccy_key == exc ['ccy']: вернуть отл вернуть ложь def get_exchanges (ccy_pattern): результат = [] ccy_pattern = re.escape (ccy_pattern) + '. *' для exc в load_exchange (): если re.match (ccy_pattern, exc ['ccy'], re.IGNORECASE) не равно None: result.append (искл.) вернуть результат

Мы реализовали три метода:

  • load_exchange: загружает курсы обмена по указанному URL-адресу и возвращает тип dict .
  • get_exchange: возвращает обменные курсы для запрошенной валюты.
  • get_exchanges: возвращает список валют в соответствии с шаблоном (требуется при поиске валют во встроенных запросах).

Шаг № 2: Создайте бота Telegram с помощью @BotFather

Свяжитесь с ботом @BotFather, чтобы получить список команд чата Telegram.

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

 Готово! Поздравляю с приобретением нового бота. Вы найдете его на telegram.me/ <имя пользователя>.
Теперь вы можете добавить описание, раздел и изображение профиля для вашего бота, см. / Help для получения списка команд.
Кстати, когда вы закончите создавать своего крутого бота, обратитесь в нашу службу поддержки ботов, если вы хотите получить для него лучшее имя пользователя.
Просто убедитесь, что бот полностью работает, прежде чем делать это.

Используйте этот токен для доступа к HTTP API:
<токен> (здесь идет токен бота)

Описание Bot API см. На этой странице: https: // core.telegram.org/bots/api 

Давайте настроим параметры бота. Укажите описание и текст (команды / setdescription и / setabouttext ), фотографию профиля ( / setuserpic ), включите встроенный режим ( / setinline ), добавьте подсказки команд ( / setcommands ).

Вам нужно будет использовать две команды: / help и / exchange . Опишем их в / setcommand s.

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

Шаг № 3: Настройте и инициализируйте бота

Начнем с создания файла config.py для настройки:

 # - * - кодировка: utf-8 - * -
TOKEN = '<токен бота> ’'
TIMEZONE = 'Европа / Киев'
TIMEZONE_COMMON_NAME = 'Киев' 

Вот токен бота и часовой пояс, в котором он будет работать (он понадобится вам в будущем, чтобы указать время обновления сообщения.Telegram API не позволяет узнать часовой пояс пользователя, поэтому время обновления должно отображаться с подсказкой часового пояса).

Давайте создадим файл bot.py , импортируем все необходимые библиотеки, файлы конфигурации и ранее созданный pb.py . Если какие-то библиотеки отсутствуют, установите их через pip .

 # - * - кодировка: utf-8 - * -
импортный телебот
конфигурация импорта
импорт pb
дата и время импорта
импорт pytz
импортировать json
отслеживание импорта

P_TIMEZONE = pytz.часовой пояс (config.TIMEZONE)
TIMEZONE_COMMON_NAME = config.TIMEZONE_COMMON_NAME 

Давайте создадим бота, используя библиотеку pyTelegramBotAPI . Для этого в конструктор нужно передать токен:

 бот = Telebot.TeleBot (config.TOKEN)
bot.polling (none_stop = True) 

Шаг №4: Напишите обработчик команды / start

Теперь ваш чат-бот Python инициализирован и постоянно запрашивает метод getUpdates. Параметр none_stop отвечает за продолжение опроса, даже если API возвращает ошибку при выполнении метода.

Тогда можно вызывать любые методы Telegram Bot API из переменной бота.

Начнем с написания обработчика команд / start и добавим его перед строкой bot.polling (none_stop = True) :

 @ bot.message_handler (commands = ['start'])
def start_command (сообщение):
   bot.send_message (
       message.chat.id,
       'Привет! Я могу показать вам курсы обмена ПриватБанка. \ N '+
       'Чтобы узнать курсы обмена, нажмите /exchange.\n' +
       'Чтобы получить помощь, нажмите / help.'
   ) 

Как видите, pyTelegramBotApi использует декораторы Python для инициализации обработчиков различных команд Telegram. Вы также можете перехватывать сообщения, используя регулярное выражение, их тип содержимого и лямбда-функции.

В нашем случае, если условие commands = [‘start’] истинно, будет вызвана функция start_command . В эту функцию будет передан объект сообщения (десериализованный тип сообщения). После этого вы просто выполняете send_message в том же чате с указанным сообщением.

Уф, это было легко, не так ли?

Шаг № 5: Создайте обработчик команд / help

Давайте приправим наш обработчик команд / help встроенной кнопкой, связывающей ваш аккаунт Telegram. Назовем кнопку «Написать разработчику».

 @ bot.message_handler (commands = ['help'])
def help_command (сообщение):
   keyboard = telebot.types.InlineKeyboardMarkup ()
   keyboard.add (
       telebot.types.InlineKeyboardButton (
           «Сообщение разработчику», url = 'telegram.я / artiomtb '
       )
   )
   bot.send_message (
       message.chat.id,
       '1) Чтобы получить список доступных валют, нажмите /exchange.\n' +
       '2) Нажмите на интересующую вас валюту. \ N' +
       «3) Вы получите сообщение, содержащее информацию об исходной и целевой валютах», +
       'курсы покупки и продажи. \ n' +
       '4) Нажмите «Обновить», чтобы получить текущую информацию о запросе. '+
       Также бот покажет разницу между предыдущим и текущим курсами обмена.\ n '+
       5) Бот поддерживает inline. Введите @  в любом чате и первые буквы валюты. ',
       reply_markup = клавиатура
   )
 

Как вы можете видеть в приведенном выше примере, я использовал дополнительный параметр ( reply_markup ) для метода send_message . Метод получил InlineKeyboardMarkup, состоящий из одной кнопки InlineKeyboardButton с текстом: «Сообщение разработчику» и url = ’telegram.me / artiomtb’.

Это выглядит так:

Шаг № 6: Добавьте обработчик команд / exchange

Обработчик команд / exchange отображает меню выбора валюты и встроенную клавиатуру бота, состоящую из 3 кнопок: USD, EUR и RUR (это валюты, поддерживаемые банковским API).

 @ bot.message_handler (commands = ['exchange'])
def exchange_command (сообщение): 
keyboard = telebot.types.InlineKeyboardMarkup () keyboard.row ( telebot.types.InlineKeyboardButton ('USD', callback_data = 'get-USD') ) keyboard.row ( telebot.types.InlineKeyboardButton ('EUR', callback_data = 'get-EUR'), telebot.types.InlineKeyboardButton ('RUR', callback_data = 'get-RUR') ) bot.send_message (message.chat.id, «Нажмите на выбранную валюту:», reply_markup = keyboard)

Позвольте мне объяснить, что такое callback-данные в InlineKeyboardButton.Когда пользователь нажимает эту кнопку, вы получите CallbackQuery (его параметр data будет содержать callback-data ) в getUpdates . Таким образом, вы будете точно знать, какую кнопку нажал пользователь, и обрабатывать ее соответствующим образом.

Кстати, вот как выглядит ответ / exchange :

Шаг № 7: Напишите встроенный обработчик нажатия кнопки

pyTelegramBotAPI предлагает использовать декоратор @ bot.callback_query_handler , который передаст объект CallbackQuery во вложенную функцию.

 @ bot.callback_query_handler (func = лямбда-вызов: True)
def iq_callback (запрос):
   data = query.data
   если data.startswith ('get-'):
       get_ex_callback (запрос) 

Давайте реализуем метод get_ex_callback :

 def get_ex_callback (запрос):
   bot.answer_callback_query (query.id)
   send_exchange_result (query.message, query.data [4:]) 

Метод answer_callback_query требуется для удаления состояния загрузки, которое появляется при нажатии кнопки.Давайте отправим сообщение на send_exchange_query . Вам нужно будет передать ему Сообщение и код валюты (вы можете получить его из query.data. Если это было, например, get-USD, передайте USD).

Давайте реализуем send_exchange_result :

 def send_exchange_result (сообщение, ex_code):
   bot.send_chat_action (message.chat.id, 'набор текста')
   ex = pb.get_exchange (ex_code)
   bot.send_message (
       message.chat.id, serialize_ex (ex),
       reply_markup = get_update_keyboard (ex),
       parse_mode = 'HTML'
   ) 

Это тоже довольно просто.

Давайте сначала отправим состояние набора текста в чат, чтобы бот отображал индикатор набора текста, пока банковский API получает запрос. Теперь давайте вызовем метод get_exchange из файла pb.py, который получит код валюты (например, доллар США). Вам также нужно будет вызвать два новых метода в send_message : serialize_ex, в сериализаторе валюты и get_update_keyboard (который возвращает клавиатуру к кнопкам «Обновить» и «Поделиться»).

 def get_update_keyboard (например):
   keyboard = telebot.types.InlineKeyboardMarkup ()
   keyboard.row (
       telebot.types.InlineKeyboardButton (
           'Обновлять',
           callback_data = json.dumps ({
               'т': 'у',
               'e': {
                   'b': ex ['купить'],
                   's': ex ['распродажа'],
                   'c': ex ['ccy']
               }
           }).заменять(' ', '')
       ),
       telebot.types.InlineKeyboardButton ('Поделиться', switch_inline_query = ex ['ccy'])
   )
   возврат клавиатуры 

Давайте запишем в get_update_keyboard текущий обменный курс в callback_data , используя формат JSON.JSON намеренно сжат, поскольку максимально допустимый размер файла составляет 64 байта.

t ключ означает тип, а e ключ означает обмен. Остальное делается по тому же принципу.

Кнопка «Поделиться» будет иметь параметр switch_inline_query . Нажатие кнопки предложит пользователю выбрать один из своих чатов, открыть этот чат и вставить имя пользователя бота и указанный встроенный запрос в поле ввода.

Затем давайте представим метод serialize_ex и вспомогательный serialize_exchange_diff , необходимые для отображения разницы между текущим и старым обменными курсами после нажатия кнопки «Обновить».

 def serialize_ex (ex_json, diff = None):
   результат = '' + ex_json ['base_ccy'] + '->' + ex_json ['ccy'] + ':  \ n \ n' + \
            'Купить:' + ex_json ['купить']
   если разница:
       результат + = '' + serialize_exchange_diff (diff ['buy_diff']) + '\ n' + \
                 'Продать:' + ex_json ['распродажа'] + \
                 '' + serialize_exchange_diff (diff ['sale_diff']) + '\ n'
   еще:
       result + = '\ nSell:' + ex_json ['sale'] + '\ n'
   вернуть результат

def serialize_exchange_diff (разница):
   результат = ''
   если diff> 0:
       result = '(' + str (diff) + '< img draggable = " src = "https: //sworg/images/core/emoji/2.3/svg/2197.svg"> "src =" https : //sworg/images/core/emoji/2.3/svg/2197.svg ">" src = "https: //sworg/images/core/emoji/72x72/2197.png"> "src =" https : //sworg/images/core/emoji/72x72/2197.png ">) '
   elif diff <0:
       result = '(' + str (diff) [1:] + '<img class=" src = "https: //sworg/images/core/emoji/2.3/svg/2198.svg"> "src =" https : //sworg/images/core/emoji/2.3/svg/2198.svg ">" src = "https: //sworg/images/core/emoji/72x72/2198.png"> "src =" https : //sworg/images/core/emoji/72x72/2198.png ">) '
   вернуть результат 

Как видите, метод serialize_ex получает необязательный параметр diff. Здесь вы передадите разницу между обменными курсами в формате {‘buy_diff’: , ‘sale_diff’: }.Это произойдет во время сериализации, когда вы нажмете кнопку «Обновить». Он нам не понадобится при первом отображении курсов валют на экране.

Вот как выглядит ответ бота при нажатии кнопки USD:

Шаг № 8: Реализуйте обработчик кнопки обновления

Теперь вы готовы реализовать обработчик кнопки «Обновить». После дополнения метода iq_callback он будет выглядеть следующим образом:

 @ bot.callback_query_handler (func = лямбда-вызов: True)
def iq_callback (запрос):
   данные = запрос.данные
   если data.startswith ('get-'):
       get_ex_callback (запрос)
   еще:
       пытаться:
           если json.loads (data) ['t'] == 'u':
               edit_message_callback (запрос)
       кроме ValueError:
           пройти 

Если данные обратного вызова начинаются с get- ’ ( get- долларов США, get- евро и т. Д.), Тогда давайте вызовем get_ex_callback , как мы делали раньше. В противном случае давайте попробуем разобрать JSON и получить его ключ t . Если он равен «u», вызовите метод edit_message_callback .Давайте реализуем это:

 def edit_message_callback (запрос):
   data = json.loads (query.data) ['e']
   exchange_now = pb.get_exchange (данные ['c'])
   текст = serialize_ex (
       exchange_now,
       get_exchange_diff (
           get_ex_from_iq_data (данные),
           exchange_now
       )
   ) + '\ n' + get_edited_signature ()
   если query.message:
       bot.edit_message_text (
           текст,
           query.message.chat.id,
           query.message.message_id,
           reply_markup = get_update_keyboard (exchange_now),
           parse_mode = 'HTML'
       )
   elif запрос.inline_message_id:
       bot.edit_message_text (
           текст,
           inline_message_id = query.inline_message_id,
           reply_markup = get_update_keyboard (exchange_now),
           parse_mode = 'HTML'
       )
 

Как это работает?

  1. Загрузить текущий обменный курс ( exchange_now = pb.get_exchange (data [‘c’] ).
  2. Сгенерируйте текст для нового сообщения, сериализуя текущий обменный курс с параметром diff , который вы получите с помощью новых методов (о них я напишу ниже).Давайте также добавим подпись редактирования — get_edited_signature .
  3. Вызовите метод edit_message_text , если исходное сообщение является обычным. Если это ответ на встроенный запрос, передайте другие параметры.

Метод get_ex_from_iq_data анализирует JSON из callback_data :

 def get_ex_from_iq_data (exc_json):
   возвращение {
       'buy': exc_json ['b'],
       'распродажа': exc_json ['s']
   } 

Метод get_exchange_diff получает старый и текущий обменные курсы и возвращает разницу в {‘buy_diff’: , ‘sale_diff’: } format:

 def get_exchange_diff (последний, сейчас):
   возвращение {
       'sale_diff': float ("%.6f "% (float (now ['sale']) - float (last ['sale']))),
       'buy_diff': float ("%. 6f"% (float (now ['buy']) - float (last ['buy']))))
   }
 

get_edited_signature генерирует «обновлено…» текст:

 def get_edited_signature ():
   return ' Обновлено' + \
          str (datetime.datetime.now (P_TIMEZONE) .strftime ('% H:% M:% S')) + \
          '(' + TIMEZONE_COMMON_NAME + ') ' 

Вот как выглядит сообщение после обновления, если курсы валют не изменились:

А вот как это выглядит при изменении курса валют:

Шаг № 9: Реализуйте встроенный режим

Внедрение inline означает, что запись @ + имени бота в любом чате активирует поиск введенного текста и предложит результаты.Щелкнув по одному из них, бот отправит результат от вашего имени (с пометкой «через бота»).

 @ bot.inline_handler (func = лямбда-запрос: True)
def query_text (inline_query):
   bot.answer_inline_query (
       inline_query.id,
       get_iq_articles (pb.get_exchanges (inline_query.query))
   ) 

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

Библиотека передаст объект InlineQuery в функцию query_text . Внутри вы используете функцию answer_inline_query , которая должна получить inline_query_id и массив объектов (результаты поиска).

Давайте использовать get_exchanges из pb.py для поиска нескольких валют, соответствующих поисковому запросу. Давайте передадим этот массив в метод get_iq_articles , который вернет массив из InlineQueryResultArticle:

 def get_iq_articles (обмены):
   результат = []
   за отл в обменах:
       result.append (
           telebot.types.InlineQueryResultArticle (
               id = exc ['ccy'],
               title = exc ['ccy'],
               input_message_content = телебот.types.InputTextMessageContent (
                   serialize_ex (exc),
                   parse_mode = 'HTML'
               ),
               reply_markup = get_update_keyboard (отлично),
               description = 'Конвертировать' + exc ['base_ccy'] + '->' + exc ['ccy'],
               thumb_height = 1
           )
       )
   вернуть результат
 

Теперь, когда вы вводите @exchnagetestbot + пробел в любом чате, вы увидите следующее:

Введите usd, и результат будет мгновенно отфильтрован:

Кликнем на предложенный результат:

Также работает кнопка «Обновить»:

Молодец! Вы успешно реализовали встроенный режим!

Завершение

Поздравляю! Теперь вы знаете, как создать чат-бота Python для Telegram, реализовать встроенную клавиатуру, обновление сообщений и встроенный режим.Вы можете похвалить себя по спине и поднять тост за нового Botfather.

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

Артикул:

Подробнее о чат-ботах:

Простой способ написать бот для Telegram

В этой статье я покажу, как создать эхо-бота с помощью Corvid от Wix. Это быстро, просто и абсолютно БЕСПЛАТНО.

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

Давайте создадим простого бота, который будет отвечать тем же сообщением, что и он. Назовем его EchoBot.

Вот как выглядит поток, который нам нужно реализовать:

Рабочий процесс сервера сообщений
  1. Пользователь отправляет сообщение EchoBot.
  2. Сервер принимает это сообщение и создает всю необходимую логику.
  3. Сервер реагирует на действия пользователя, отправляя сообщение с помощью Telegram API.

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

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

Вам также может понравиться: Государственное управление в Корвиде.

Шаг 1

Чтобы реализовать первый шаг в нашем потоке, нам нужно создать соединение между ботом Telegram и вашим сайтом Wix (серверная часть). Для этого воспользуемся HTTP-функциями. Чтобы создать функцию HTTP, добавьте файл с именем http-functions.js в серверную часть своего сайта. В этом файле вы можете найти пример функции. Очистите этот файл и напишите следующую функцию:


После публикации сайта ваша конечная точка будет доступна по адресу:

https: // {user_name}.wixsite.com/{site_name}/_functions/updatesLisner

Или, для сайтов премиум-класса, по телефону:

https: // www. {User_domain} / _functions / updatesLisner

Затем вам нужно установить эту конечную точку в качестве веб-перехватчика для вашего бота. Для этого вам необходимо сделать HTTP-запрос GET. Вы можете сделать это из браузера:

https://api.telegram.org/bot/setWebhook?url=

Вы должны получить такой ответ:

{"ok": true, "result": true, "description": "Webhook был установлен"}

После этого первый шаг готов!

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

Ошибки и журналы в реальном времени

Шаг 2

Упростить пример логики нашего бота довольно просто: создать echo. Давайте извлечем текст сообщения из обновления . Согласно спецификации объекта обновления:

const text = update.message.text;

Итак, у нас есть текста , который нам нужно отправить обратно в чат.

Шаг 3

Теперь нам нужно ответить пользователю sendMessage.Создайте эту функцию в backend / http-functions.js :


Эта функция просто делает запрос POST с двумя параметрами в теле:

1. текст .

2. chat_id .

У нас уже есть текст из шага два. Мы можем получить chat_id из объекта обновления:

const chatId = update.message.chat.id;

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


Наконец, опубликуйте свой сайт и отправьте сообщение своему боту!

Примечание : создание ботов с помощью Corvid от Wix — очень масштабируемое решение. Вы можете использовать данные Wix для хранения данных для вашего бота. Просто создайте коллекцию, и все готово.

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

Дополнительная литература

Изначально это сообщение было опубликовано на канале Medium .

telegram-bot Tutorial => Создайте бота с помощью BotFather

Пример

Откройте чат с @BotFather в Telegram и нажмите команду / start .

После получения списка команд выберите команду / newbot , чтобы получить это сообщение:

Хорошо, новый бот. Как мы это назовем? Пожалуйста, выберите имя для вашего бота.

Введите имя для вашего бота, которое может быть любым, и отправьте его.После этого BotFather запросит имя пользователя для вашего бота:

Хорошо. Теперь давайте выберем логин для вашего бота. Он должен заканчиваться ботом . Вот так, например: TetrisBot или tetris_bot.

Это должно заканчиваться словом «бот». Если желаемое имя пользователя занято или недоступно, попробуйте еще раз с другим именем.

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

Готово! Поздравляю с приобретением нового бота. Вы найдете это на telegram.me/???bot. Теперь вы можете добавить описание, раздел о разделе и изображение профиля для вашего бота, см. / help для получения списка команд. Посредством Кстати, когда вы закончите создавать своего крутого бота, обратитесь в нашу службу поддержки ботов. если вам нужно лучшее имя пользователя для него. Просто убедитесь, что бот полностью перед тем, как вы это сделаете.

Используйте этот токен для доступа к HTTP API: xxx: xxx

Теперь с полученным токеном вы можете отправить тестовое сообщение, позвонив на сайт https: // api.telegram.org/botBOTTOKEN/sendmessage?chat_id=YOURCHATID&text=YOURTEXT

Существует два основных метода взаимодействия телеграмм-ботов: метод выталкивания и метод вытягивания. Используя метод pull, вы должны время от времени вызывать / getupdates , чтобы проверять, есть ли новые сообщения, отправленные вашему боту. Метод push использует веб-перехватчик (метод / setwebhook ) для вашего скрипта, который вызывается каждый раз, когда пользователь отправляет сообщение вашему боту.

Предоставленная информация представляет собой файл в формате JSON со всей необходимой информацией (об отправителе и сообщении).

Вы можете написать своего бота на многих языках (PHP, Python, Lua …), если они могут обрабатывать веб-перехватчик как ввод и вызывать веб-сайты.

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




Как создать бота Telegram с Node.js менее чем за 3 минуты | от Луи Петрика

Это, наверное, проще, чем вы думаете

Источник: автор

Telegram — альтернатива WhatsApp, на мой взгляд, довольно хорошая. Это бесплатное использование считается очень безопасным. Но самое лучшее:
Мы можем запрограммировать собственных ботов!

Вот как его создать с помощью Node.js.
Давайте выпустим и создадим нашего собственного бота Telegram!

Начало работы

Во-первых, нам нужно зарегистрировать нашего бота. Мы можем сделать это в приложении Telegram, связавшись с BotFather .

Просто введите «botfather» в поле поиска и выберите вариант с синей галочкой.

Источник: автор

Просто нажмите «старт» в чате и просмотрите варианты. Вам нужно только выбрать имя и логин — тогда вы можете сохранить ключ. Пожалуйста, держите это в секрете.

Вы уже можете найти своего бота в поиске Telegram. Ищите
«@ » — но, конечно, бот пока ничего не может.

Приступим к кодированию. Я использую пакет NPM для работы с Telegram API.Просто установите его с помощью:

 yarn add node-telegram-bot-api 

Затем мы можем использовать пакет. Поместите свой токен в переменную для него.

Готово! Теперь мы можем начать что-то делать с ботом. Вот простой пример.

С помощью onText мы можем реагировать на сообщения, соответствующие шаблону регулярного выражения. В этом примере выражение / \ / echo (. +) / говорит, что мы должны написать «/ echo» и некоторый текст за ним.

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

bot.sendMessage используется для отправки сообщения (какой сюрприз!). или — это строка, отправляемая после команды echo.
Да, бот отправляет обратно то, что мы ему отправили.
Запустите узел app.js , откройте чат с ботом и отправьте что-то вроде этого:

Источник: автор

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

Как я уже сказал, нам нужно использовать chatId для отправки сообщений пользователям — для что; нам нужно его где-то хранить.В производственном приложении для этого, конечно же, следует выбрать энергонезависимое хранилище — MySQL, MongoDB или другую базу данных.

В нашем примере я храню идентификаторы в массиве. Пользователь может зарегистрироваться в боте с помощью «/ register» — тогда боту будет разрешено отправлять ему сообщения. Бот отправляет сообщение каждому пользователю один раз в секунду — мы просто просматриваем массив пользователей с помощью цикла for.

Как только мы отправляем боту «/ register», мы получаем спам с сообщениями.

Реагировать на все сообщения i

С помощью бота.onText мы смогли реагировать на сообщения о сопоставлении регулярных выражений. Но что, если мы хотим обрабатывать все входящие сообщения? Это возможно с bot.on ("сообщение") — он запускается всякий раз, когда кто-то отправляет сообщение.

Вот быстрый пример. Бот запускается для каждого сообщения, но отвечает только тогда, когда пользователь отправляет «собаку».

Отправка опросов

В Telegram мы можем многое обменять. Не только стикеры, видео и текстовые сообщения, но и опросы. Создать очень просто:

 бот.sendPoll (chatId, «Telegram отличный?», [«Конечно», «Конечно»]) 

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

Вот как легко создать бота Telegram с Node.js!

Спасибо за прочтение. Хотели бы вы увидеть в будущем более сложный проект? Тогда не стесняйтесь оставлять мне свое мнение.

Создание бота Telegram для электронной коммерции с использованием Python и фауны.

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

Прежде чем мы начнем, позвольте мне сообщить вам, что я буду называть этого бота telegram-business до конца этого руководства.

ЧТО МОЖЕТ СДЕЛАТЬ ТЕЛЕГРАММА-БИЗНЕС

Прежде всего, есть два типа пользователей: клиенты и владельцы бизнеса.Функции бота классифицируются в зависимости от типа пользователей, которым разрешено работать на платформе. Следующее включает особенности Telegram-Business:

КЛИЕНТСКИЕ ОСОБЕННОСТИ:
  • Клиенты могут просматривать предприятия из четырех различных категорий.
  • Клиенты могут просматривать продукты любого из этих предприятий.
  • Покупатели могут оформить заказ на товар.
ОСОБЕННОСТИ ВЛАДЕЛЬЦА БИЗНЕСА:
  • Владельцы бизнеса могут создавать каталог и добавлять товары.
  • Владельцы бизнеса получат уведомление, когда пользователь разместит заказ.

Предварительные требования

Для этого урока я буду использовать Python3, а также платформу Fauna. Чтобы следовать этому руководству, вам нужно установить Python и иметь учетную запись в Fauna. Если у вас нет учетной записи Fauna, вы можете зарегистрироваться на веб-сайте здесь. В ваших интересах иметь фундаментальные знания Python, чтобы следовать этому руководству. Я также буду использовать Cloudinary для хранения изображений продуктов.Вы можете зарегистрировать бесплатную учетную запись Cloudinary здесь. Вот подробный список того, что нам нужно для этого бота:

  • Python3
  • Счет фауны
  • Облачный аккаунт

Подготовка базы данных

Первое, что мы хотим сделать, это создать нашу базу данных по Фауне. Перейдите на сайт fauna.com и войдите в свою панель управления. После входа в систему нажмите кнопку «Новая база данных» на панели инструментов, чтобы создать новую базу данных.

Это приведет вас к странице, как на изображении выше. Заполните необходимые поля и нажмите «Сохранить» , чтобы создать новую базу данных для нашего бота.

Создание коллекций

Затем мы создадим по три коллекции для каждой сущности на нашей платформе; Пользователи, предприятия и продукты . Щелкните «Новая коллекция». Откроется новая страница, подобная приведенной ниже:

Назовите это Users и нажмите кнопку «Сохранить» , чтобы создать коллекцию.После этого создайте две другие коллекции: Business и Products . Как только вы закончите, у вас должны появиться три коллекции в пункте меню коллекций.

Перейдем к созданию индексов для удобного поиска информации из нашей базы данных.

Создание индексов

Для нашей системы электронной коммерции нам нужно будет создать несколько индексов, которые помогут быстрее получать нужную информацию. Чтобы создать заголовок указателя, перейдите к пункту меню indexes и нажмите кнопку «New Index» , чтобы создать новый указатель.Вы должны перейти на новую страницу, которая выглядит примерно так:

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

Затем создайте еще три индекса со следующей информацией:

  • business_by_name : {исходная коллекция: Business , термин: name }
  • product_by_business : {исходная коллекция: Продукт , термин: sme }
  • business_by_category : {исходная коллекция: Business , термин: категория }
Создание API_KEY

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

Сборка бота

Разговор с BotFather

Чтобы создать бота Telegram, мы должны зарегистрировать его у отца бота Telegram. Чтобы создать своего бота, откройте Telegram и найдите отца-бота или просто нажмите здесь, чтобы перейти в чат отца-бота.

Оказавшись там, введите «/ start» , чтобы начать разговор с отцом-ботом, и он покажет вам список команд, которые вы можете использовать для взаимодействия с ним; эти команды можно ввести или щелкнуть для их выполнения.

Выберите команду / newbot , чтобы создать нового бота. Как только мы это сделаем, бот-отец попросит имя, а затем имя пользователя. Как только мы это сделаем, отец бота предоставит нам информацию о новом боте, например ссылку на бота и токен доступа, который нам сейчас нужен.Скопируйте это и сохраните где-нибудь.

Скриптинг Telegram-Business

Мы начнем с создания виртуальной среды для нашего проекта, открытия командной строки и изменения каталога на желаемое место (желательно, чтобы это была новая пустая папка). Оказавшись там, создайте виртуальную среду, используя любой желаемый менеджер виртуальной среды на Python. Я использую virtualenv для создания, например, «env» , я запускаю следующую команду:

virtualenv env

Затем мы активируем нашу виртуальную среду и установим следующие пакеты python:

  • Python-telegram-bot : который помогает нам писать код для управления нашим ботом.

  • Faunadb : это пакет Python, который помогает нам взаимодействовать с api Fauna из наших скриптов.

  • python-dotenv : который поможет нам легко читать переменные конфигурации.

  • Cloudinary : клиентская библиотека для нашего API хранилища фотографий. Обязательно зарегистрируйтесь в облачной учетной записи и получите свой api_key и секрет из панели управления. Они нам понадобятся позже.

Начнем с создания следующих файлов в папке нашего проекта:

  • обработчики.py
  • main.py
  • config.py
  • .env

Я разделю реализацию обработчиков на две части:

  • Функции клиента
  • Бизнес-функции

Начнем с бизнес-функций, которые включают взаимодействие бота с пользователями, которые являются владельцами бизнеса. Первое, что нам нужно сделать, это добавить наши токены и ключи от botFather, cloudinary и Fauna в .env следующим образом:

  BOT_TOKEN = *** 486 **: ******* - **** ro
API_SECRET = - **** OcAGV ****
API_KEY = ******** 21
FAUNA_KEY = f **** 8sZ ***** J **** Gd4 **** Q
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Как только это будет сделано, мы переходим к файлу config.py , и там мы указываем некоторые переменные на эти переменные среды из файла .env , считывая их через установленный нами пакет python-dotenv ранее. Этот пакет позволяет нам читать переменные среды из файлов и даже прямо из командной строки.

  импорт ОС
из dotenv import load_dotenv

load_dotenv ()

ТОКЕН = os.getenv ('BOT_TOKEN')
api_secret = os.getenv ('API_SECRET')
api_key = os.getenv ('API_KEY')
FAUNA_KEY = os.getenv ('FAUNA_KEY')
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Теперь мы можем использовать эти переменные в нашем коде без чтения из файла env. Затем мы начнем с наших методов-обработчиков, которые будут обрабатывать то, как бот взаимодействует с пользователями в Telegram.

Начнем с методов обработчика, отвечающих за управление взаимодействием бота с пользователями, которые регистрируются как владельцы бизнеса.. Файл для этого кода — handlers.py , и импортируйте необходимые зависимости.

  из импорта телеграммы (
    Ответить
    ОтветитьKeyboardRemove, Обновить,
    InlineKeyboardButton, InlineKeyboardMarkup
)
из telegram.ext import (
    CommandHandler, CallbackContext,
    ConversationHandler, MessageHandler,
    Фильтры, средство обновления, CallbackQueryHandler
)
из импорта конфигурации (
    api_key, sender_email,
    api_secret,
    FAUNA_KEY
)
импорт облачных
из облачного.загрузчик импорт загрузка
из запроса импорта faunadb как q
из faunadb.client import FaunaClient
из faunadb.errors import NotFound
  
Войти в полноэкранный режимВыйти из полноэкранного режима

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

  # настроить облачный
cloudinary.config (
    cloud_name = "любопытный паул",
    api_key = api_key,
    api_secret = api_secret
)

# Конфигурация клиента фауны
client = FaunaClient (секрет = FAUNA_KEY)

# Определить параметры
ВЫБОР, КЛАСС_СОСТОЯНИЕ, SME_DETAILS, ВЫБОР_РЕФ, \
    SME_CAT, ADD_PRODUCTS, SHOW_STOCKS, POST_VIEW_PRODUCTS = диапазон (8)
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Первая конфигурация предназначена для нашего экземпляра Cloudinary, а вторая — для нашего экземпляра клиента Fauna. Следующие переменные представляют состояния бота или, по крайней мере, состояние, в котором он может находиться, когда с ним взаимодействуют пользователи.Этого требует «обработчик разговоров» — метод, который позволяет нам создавать сценарии для наших ботов, делая их взаимодействие с людьми более естественным. Имена каждой переменной немного указывают, какое состояние они представляют. Например, состояние SME_DETAILS привязано к определенным методам запроса у пользователя подробностей их бизнеса.

Добавление методов обработчика

Мы продолжим с этого момента, добавив методы-обработчики в наш скрипт. Первый метод обработчика, который нам нужно добавить, — это тот, который обрабатывает то, что происходит, когда мы инициируем диалог с ботом с помощью команды / start .

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

  def start (обновление, контекст: CallbackContext) -> int:
    print ("Вы звонили")
    bot = context.bot
    chat_id = update.message.chat.id
    bot.send_message (
        chat_id = chat_id,
        text = "Привет, дружище, добро пожаловать в SMEbot!"
        "Пожалуйста расскажи мне о себе, "
        "укажите свое полное имя, адрес электронной почты и номер телефона",
        "через запятую каждый e.грамм: "
        "Джон Доу, [email protected], +234567897809"
    )
    вернуться ВЫБИРАЯ
  
Войти в полноэкранный режимВыйти из полноэкранного режима

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

Следующее состояние — ВЫБОР , и это состояние связано с другим методом, который принимает вводимые пользователем данные и анализирует их, чтобы убедиться, что они верны, прежде чем использовать информацию для регистрации пользователя.Затем он предлагает пользователю выбрать тип пользователя, то есть клиент или владелец бизнеса . Добавьте следующие строки кода, чтобы добавить этот метод:

  # получить общие данные пользователя от пользователя и сохранить
def select (update, context):
    bot = context.bot
    chat_id = update.message.chat.id
    # создать новую запись данных
    данные = update.message.text.split (',')
    если len (данные) <3 или len (данные)> 3:
        bot.send_message (
            chat_id = chat_id,
            text = "Недействительный ввод, не забудьте указать детали"
            "как указано в инструкции"
        )
        бот.Отправить сообщение(
            chat_id = chat_id,
            text = "Введите / start, чтобы перезапустить бота"
        )
        вернуть ConversationHandler.END
    #TODO: проверьте, существует ли уже пользователь, прежде чем создавать нового пользователя
    new_user = client.query (
        q.create (q.collection ('Пользователь'), {
            "данные":{
                "имя": данные [0],
                "электронная почта": данные [1],
                «телефон»: данные [2],
                "is_smeowner": ложь,
                "предпочтение": "",
                "chat_id": chat_id
            }
        })
    )
    контекст.user_data ["идентификатор-пользователя"] = новый_пользователь ["ссылка"]. id ()
    context.user_data ["имя-пользователя"] = данные [0]
    context.user_data ['данные-пользователя'] = новый_пользователь ['данные']
    reply_keyboard = [
    [
        InlineKeyboardButton (
            text = "SME",
            callback_data = "SME"
        ),
        InlineKeyboardButton (
            text = "Клиент",
            callback_data = "Клиент"
        )
    ]
  ]
  разметка = InlineKeyboardMarkup (reply_keyboard, one_time_keyboard = True)
    bot.send_message (
        chat_id = chat_id,
        text = "Информация собрана успешно !..🎉🎉 \ n "
        "К чему из перечисленного вы относитесь?",
        reply_markup = разметка
    )
    вернуть CLASS_STATE

  
Войти в полноэкранный режимВыйти из полноэкранного режима

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

Мы также храним некоторую информацию о пользователе в памяти с контекстом .user_data [] атрибут — который нам понадобится позже в других методах обработчика. Наконец, мы возвращаем ответ, а также новое состояние разговора, в этом состоянии ( CLASS_STATE ) мы определяем, с каким пользователем мы имеем дело, то есть с клиентом или владельцем бизнеса .

  def classer (обновление, контекст):
    bot = context.bot
    chat_id = update.callback_query.message.chat.id
    name = context.user_data ["имя пользователя"]
    если update.callback_query.data.lower () == "sme":
        # обновить пользователя как smeowner
        client.query (
            q.update (
                q.ref (q.collection ("Пользователь"), context.user_data ["идентификатор-пользователя"]),
                {"data": {"is_smeowner": True}}
            )
        )
        bot.send_message (
            chat_id = chat_id,
            text = f "Отлично! {имя}, расскажи, пожалуйста, о своей компании"
            "укажите свое название бренда, адрес электронной почты бренда, адрес и номер телефона"
            "в таком порядке, через запятую (,) каждый e.грамм: "
            "JDWears, [email protected], 101-Mike Avenue-Ikeja, +234567897809",
            reply_markup = ReplyKeyboardRemove ()
        )

        вернуть SME_DETAILS
    категории = [
        [
            InlineKeyboardButton (
                text = "Одежда / Мода",
                callback_data = "Одежда / Мода"
            ),
            InlineKeyboardButton (
                text = "Аппаратные аксессуары",
                callback_data = "Аппаратные аксессуары"
            )
        ],
        [
            InlineKeyboardButton (
                text = "Еда / Кухонные принадлежности",
                callback_data = "Еда / Кухонные принадлежности"
            ),
            InlineKeyboardButton (
                text = "ArtnDesign",
                callback_data = "ArtnDesign"
            )
        ]
    ]
    бот.Отправить сообщение(
        chat_id = chat_id,
        text = "Вот список доступных категорий"
        "Выберите тот, который вам интересен",
        reply_markup = InlineKeyboardMarkup (категории)
    )
    вернуть CHOOSE_PREF

  
Войти в полноэкранный режимВыйти из полноэкранного режима

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

Давайте добавим обработчик команды «cancel» , чтобы помочь пользователям отменить взаимодействие с ботом в любой момент. Добавьте следующую функцию:

  # Control
def cancel (update: Update, context: CallbackContext) -> int:
    update.message.reply_text (
        'До свидания! Я надеюсь, что когда-нибудь мы сможем снова поговорить.',
        reply_markup = ReplyKeyboardRemove ()
    )

    вернуть ConversationHandler.END
  
Войти в полноэкранный режимВыйти из полноэкранного режима

На этом этапе мы можем протестировать нашего бота, чтобы увидеть, как он реагирует на наши взаимодействия. Чтобы протестировать бота, нам нужно зарегистрировать наши обработчики с помощью метода обработчика разговора в main.py и сопоставить их с каждым состоянием, как показано ниже:

  обработчики импорта
из telegram.ext import (
    CommandHandler, CallbackContext,
    ConversationHandler, MessageHandler,
    Фильтры, средство обновления, CallbackQueryHandler
)
из config import TOKEN

updater = Updater (токен = ТОКЕН, use_context = True)
печать (средство обновления)
диспетчер = средство обновления.диспетчер


def main ():
    conv_handler = ConversationHandler (
        entry_points = [CommandHandler ('начало', handlers.start)],
        состояния = {
            handlers.CHOOSING: [
                MessageHandler (
                    Filters.all, handlers.choose
                )
            ],
            handlers.CLASS_STATE: [
                CallbackQueryHandler (handlers.classer)
            ]
        },
        fallbacks = [CommandHandler ('отмена', handlers.cancel)],
        allow_reentry = True
    )
    диспетчер.add_handler (conv_handler)
    updater.start_polling ()
    updater.idle ()

если __name__ == '__main__':
    главный()
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Сохраните это, перейдите в свой терминал и запустите бота через файл main.py следующим образом:

После того, как вы запустите эту команду, вы можете не увидеть немедленного запроса от терминала, пока не начнете взаимодействовать с ботом. Пойдем к нашему боту и начнем разговор. Используйте ссылку, которую предоставил вам botFather, или просто выполните поиск по имени своего бота в Telegram.

Оказавшись там, используйте команду / start или просто нажмите кнопку запуска в чате, чтобы ваш бот начал разговор. Вы должны увидеть, что ваш бот ответит так:

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

Выбор варианта SME предлагает нам ввести подробную информацию о нашем «бизнес» , как описано в методе classer () , который мы определили ранее.Однако, если мы выбрали вариант клиента в качестве предпочтения, то бот ответит списком вариантов категории на выбор.

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

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

  • Сбор информации о бизнесе и хранение : Для этого есть две функции; первый принимает вводимые пользователем данные с последней фазы бизнеса, анализирует их и сохраняет данные в памяти, передает данные следующему методу обработчика и, наконец, предлагает пользователю выбрать категорию, к которой относится его бизнес.

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

  def business_details (обновление, контекст):
    bot = context.bot
    chat_id = update.message.chat.id
    данные = update.message.text.split (',')
    если len (данные) <4 или len (данные)> 4:
        bot.send_message (
            chat_id = chat_id,
            text = "Недействительный ввод, не забудьте указать детали"
            "как указано в инструкции"
        )
        вернуть SME_DETAILS
    context.user_data ["sme_dets"] = данные
    # категории = [
    # ["Одежда / мода", "Аппаратные аксессуары"],
    # ['Еда / Кухонная посуда', 'ArtnDesign'],
    #         ['Другой']
    #]
    категории = [
        [
            InlineKeyboardButton (
                text = "Одежда / Мода",
                callback_data = "Одежда / Мода"
            ),
            InlineKeyboardButton (
                text = "Аппаратные аксессуары",
                callback_data = "Аппаратные аксессуары"
            )
        ],
        [
            InlineKeyboardButton (
                text = "Еда / Кухонные принадлежности",
                callback_data = "Еда / Кухонные принадлежности"
            ),
            InlineKeyboardButton (
                text = "ArtnDesign",
                callback_data = "ArtnDesign"
            )
        ]
    ]
    разметка = InlineKeyboardMarkup (категории, one_time_keyboard = True)
    бот.Отправить сообщение(
        chat_id = chat_id,
        text = "Выберите категорию для вашего бизнеса из вариантов",
        reply_markup = разметка
    )
    вернуть SME_CAT

def business_details_update (обновление, контекст):
    bot = context.bot
    chat_id = update.callback_query.message.chat.id
    выбор = update.callback_query.data
    # создать бизнес
    new_sme = client.query (
        q.create (
            q.collection («Бизнес»),
            {"данные":{
                "имя": context.user_data ["sme_dets"] [0],
                «электронная почта»: контекст.user_data ["sme_dets"] [1],
                "адрес": context.user_data ["sme_dets"] [2],
                "телефон": context.user_data ["sme_dets"] [3],
                "category": choice.lower ()
            }}
        )
    )
    context.user_data ["sme_name"] = context.user_data ["sme_dets"] [0]
    context.user_data ["sme_id"] = new_sme ["ref"]. id ()
    context.user_data ["sme_cat"] = выбор
    кнопка = [[
        InlineKeyboardButton (
            text = "Добавить товар",
            callback_data = choice.lower ()
        )
    ]]
    бот.Отправить сообщение(
        chat_id = chat_id,
        text = "Корпоративный аккаунт успешно создан,"
        "давайте добавим продукты !.",
        reply_markup = InlineKeyboardMarkup (кнопка)
    )
    вернуть ADD_PRODUCTS
  
Войти в полноэкранный режимВыйти из полноэкранного режима
  • Добавление продуктов : это также включает два метода обработчика: первый запрашивает пользователя и дает инструкции о том, как можно добавить продукт, а второй принимает вводимые пользователем данные, анализирует их и использует для создания нового продукта, добавив его в качестве нового документа в нашу коллекцию продуктов в нашем экземпляре Fauna.
  def add_product (обновление, контекст):
    bot = context.bot
    chat_id = update.callback_query.message.chat.id
    bot.send_message (
        chat_id = chat_id,
        text = "Добавьте название, описание и цену продукта,"
        "через запятую (,) в качестве подписи к изображению товара"
    )
    вернуть ADD_PRODUCTS

def product_info (обновление: Обновление, контекст: CallbackContext):
    data = update.message
    bot = context.bot
    photo = bot.getFile (update.message.photo [-1].file_id)
    file_ = open ('изображение_продукта', 'wb')
    photo.download (out = file_)
    data = update.message.caption.split (',')
    # загрузить изображение в облачный
    send_photo = upload ('product_image', ширина = 200, высота = 150, обрезка = 'thumb')
    # создать новый продукт
    newprod = client.query (
        q.create (
            q.collection ("Продукт"),
            {"данные": {
                    "имя": данные [0],
                    "описание": данные [1],
                    «цена»: float (данные [2]),
                    "изображение": send_photo ["secure_url"],
                    "sme": контекст.user_data ["sme_name"],
                    "sme_chat_id": update.message.chat.id,
                    "категория": context.user_data ["sme_cat"]
                }
            }
        )
    )
    # добавить новый продукт как последний
    client.query (
        q.update (
            q.ref (q.collection ("Бизнес"), context.user_data ["sme_id"]),
            {"данные": {
                "последний": newprod ["ref"]. id ()
            }}
        )
    )
    # context.user_data ["product_data"] = newprod ['data']
    button = [[InlineKeyboardButton (
        text = 'Добавить другой продукт',
        callback_data = контекст.user_data ["sme_name"]
    )]]
    update.message.reply_text (
        "Товар успешно добавлен",
        reply_markup = InlineKeyboardMarkup (кнопка)
    )
    вернуть ADD_PRODUCTS
  
Войти в полноэкранный режимВыйти из полноэкранного режима

На этом завершается бизнес-часть бота. Теперь мы добавим больше методов обработчика, чтобы покрыть функциональные возможности клиента, а именно:

  • Просмотр предприятий из любой категории : это включает в себя метод обработчика, который принимает выбор пользователя и использует наш индекс business_by_category для поиска всех предприятий в этой категории, а затем отображает список предприятий с их последними товарами в виде эскиза вместе с два варианта.
  ## КЛИЕНТ
def customer_pref (обновление, контекст):
    bot = context.bot
    chat_id = update.callback_query.message.chat.id
    data = update.callback_query.data
    печать (данные)
    # получить все компании в категории
    пытаться:
        smes_ = client.query (
            q.map_ (
                лямбда-переменная: q.get (var),
                q.paginate (
                    q.match (
                        q.index ("business_by_category"),
                        str (данные) .lower ()
                    )
                )
            )
        )
        печать (smes_)
        для смэ в smes _ ["data"]:
            кнопка = [
                [
                    InlineKeyboardButton (
                        text = "Просмотреть продукты",
                        callback_data = sme ["данные"] ["имя"]
                    )
                ],
                [
                    InlineKeyboardButton (
                        text = "Выбрать для обновлений",
                        callback_data = "pref" + ',' + sme ["данные"] ["имя"]
                    )
                ]
            ]
            если "последний" в см ['данные'].ключи ():
                thumbnail = client.query (q.get (q.ref (q.collection ("Продукт"), sme ["данные"] ["последний"])))
                печать (эскиз)
                bot.send_photo (
                    chat_id = chat_id,
                    фото = миниатюра ["данные"] ["изображение"],
                    caption = f "{sme ['данные'] ['имя']}",
                    reply_markup = InlineKeyboardMarkup (кнопка)
                )
            еще:
                bot.send_message (
                    chat_id = chat_id,
                    text = f "{sme ['data'] ['name']}",
                    reply_markup = InlineKeyboardMarkup (кнопка)
                )
    кроме NotFound:
        кнопка = [[
            InlineKeyboardButton (
                text = "Выбрать другую категорию?",
                callback_data = "клиент"
            )
        ]]
        бот.Отправить сообщение(
            chat_id = chat_id,
            text = "Здесь пока ничего нет",
            reply_markup = InlineKeyboardMarkup (кнопка)
        )
        вернуть CLASS_STATE
    вернуть SHOW_STOCKS
  
Войти в полноэкранный режимВыйти из полноэкранного режима
  • Просмотр продуктов : Это не требует пояснений и включает в себя перечисление всех продуктов, принадлежащих любому бизнесу, который пользователь решил просмотреть. Мы можем отображать все продукты компании с помощью индекса products_by_business , который мы создали для нашего экземпляра Fauna ранее. Это означает, что мы можем отправить запрос для получения всех продуктов, которые есть в каталоге компании ( с индексом products_by_business ), а затем отобразить результаты пользователю.
  def show_products (обновление, контекст):
    bot = context.bot
    chat_id = update.callback_query.message.chat.id
    data = update.callback_query.data
    если "pref" в данных:
        data = data.split (',') [0] .replace ('', '')
        печать (данные)
        пользователь = client.query (
            q.get (
                q.ref (
                    q.match (q.index ('user_by_name'), context.user_data ['user-data'] ['name']),

                )
            )
        )
        # обновить настройки
        клиент.запрос(
            q.update (
                q.ref (
                    q.collection ('Пользователь'), пользователь ['ref']. id ()
                ),
                {'данные': {'предпочтения': пользователь ['данные'] ['предпочтения'] + данные + ','}}
            )
        )
        кнопка = [
            [
                InlineKeyboardButton (
                    text = "Посмотреть другие категории компаний",
                    callback_data = 'клиент'
                )
            ]
        ]
        bot.send_message (
            chat_id = chat_id,
            text = "Настройки успешно обновлены !!"
        )
        вернуть CLASS_STATE
    продукты = клиент.запрос(
        q.map_ (
            лямбда x: q.get (x),
            q.paginate (
                q.match (
                    q.index ("product_by_business"),
                    update.callback_query.data
                )
            )
        )
    )
    # print (продукты)
    если len (продукты) <= 0:
        bot.send_message (
            chat_id = chat_id,
            text = "'Здесь пока ничего нет, пользователь не добавил ни одного товара !, проверьте позже"
        )
        вернуть CLASS_STATE
    для продукта в продуктах ["данные"]:
        контекст.user_data ["sme_id"] = продукт ['данные'] ['sme']
        кнопка = [
            [
                InlineKeyboardButton (
                    text = "Отправить заказ",
                    callback_data = "заказ;" + product ["ref"]. id ()
                )
            ],
            [
                InlineKeyboardButton (
                    text = "Связаться с владельцем компании",
                    callback_data = "контакт;" + товар ["данные"] ["смэ"]
                )
            ]
        ]
        bot.send_photo (
            chat_id = chat_id,
            фото = продукт ["данные"] ["изображение"],
            caption = f "{продукт ['данные'] ['имя']} \ nОписание: {продукт ['данные'] ['описание']} \ nЦена: {продукт ['данные'] ['цена']}» ,
            reply_markup = InlineKeyboardMarkup (кнопка)
        )
    вернуть POST_VIEW_PRODUCTS
  
Войти в полноэкранный режимВыйти из полноэкранного режима

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

  • Размещение заказа и контактные данные владельца бизнеса : следующий блок отвечает за размещение заказа и предоставление клиенту сведений о владельце бизнеса. Когда пользователь размещает заказ, бот отправляет сообщение владельцу бизнеса, содержащее информацию о продукт, который будет продан, и контакт в Telegram потенциального покупателя.
  def post_view_products (обновление, контекст):
    bot = context.bot
    chat_id = update.callback_query.message.chat.id
    data = update.callback_query.data
    product = client.query (
        q.get (
            q.ref (
                q.collection ("Продукт"),
                data.split (';') [1]
            )
        )
    )["данные"]
    если "заказ" в данных:
        bot.send_message (
            chat_id = продукт ['sme_chat_id'],
            text = "Привет, у вас новый заказ"
        )
        bot.send_photo (
            chat_id = продукт ['sme_chat_id'],
            caption = f "Название: {продукт ['name']} \ n \ nОписание: {product ['description']} \ n \ nЦена: {product ['price']}"
            f "\ n \ n Имя клиента: {context.user_data ['имя-пользователя']} ",
            фото = продукт ['изображение']
        )
        bot.send_contact (
            chat_id = продукт ['sme_chat_id'],
            phone_number = context.user_data ['user-data'] ['phone'],
            first_name = context.user_data ['данные пользователя'] ['имя']
        )
        bot.send_message (
            chat_id = chat_id,
            text = "Заказ успешно размещен"
        )
    elif 'contact' в данных:
        sme_ = client.query (
            q.get (
                q.match (
                    q.index ("имя_бизнеса"),
                    продукт ['sme']
                )
            )
        )['данные']
        bot.send_message (
            chat_id = chat_id,
            text = f "Имя: {sme _ ['name']} \ n \ nТелефон: {sme _ ['phone']} \ n \ nЭлектронная почта: {sme _ ['email']}"
        )

  
Войти в полноэкранный режимВыйти из полноэкранного режима

Тестирование бота

Мы можем сохранить изменения в нашем файле handlers.py , а затем перейти к регистрации вновь добавленных методов в нашем обработчике диалога в main.py , как и в случае с несколькими первыми функциями, а именно:

  обработчики импорта
из telegram.ext import (
    CommandHandler, CallbackContext,
    ConversationHandler, MessageHandler,
    Фильтры, средство обновления, CallbackQueryHandler
)
из config import TOKEN

updater = Updater (токен = ТОКЕН, use_context = True)
печать (средство обновления)
диспетчер = updater.dispatcher


def main ():
    conv_handler = ConversationHandler (
        entry_points = [CommandHandler ('начало', handlers.start)],
        состояния = {
            обработчики.ВЫБОР: [
                MessageHandler (
                    Filters.all, handlers.choose
                )
            ],
            handlers.CLASS_STATE: [
                CallbackQueryHandler (handlers.classer)
            ],
            обработчики.SME_DETAILS: [
                MessageHandler (
                    Filters.all, handlers.business_details
                )
            ],
            обработчики.SME_CAT: [
                CallbackQueryHandler (handlers.business_details_update)
            ],
            обработчики.ADD_PRODUCTS: [
                CallbackQueryHandler (handlers.add_product),
                MessageHandler (Filters.all, handlers.product_info)
            ],
            handlers.CHOOSE_PREF: [
                CallbackQueryHandler (handlers.customer_pref)
            ],
            обработчики.SHOW_STOCKS: [
                CallbackQueryHandler (handlers.show_products)
            ],
            handlers.POST_VIEW_PRODUCTS: [
                CallbackQueryHandler (handlers.post_view_products)
            ]
        },
        fallbacks = [CommandHandler ('отмена', обработчики.Отмена)],
        allow_reentry = True
    )
    dispatcher.add_handler (conv_handler)
    updater.start_polling ()
    updater.idle ()

если __name__ == '__main__':
    главный()
  
Войти в полноэкранный режимВыйти из полноэкранного режима

Обновите код в main.py , чтобы в нем были другие функции, которые мы добавили, как показано выше. После завершения мы можем запустить наш код из cmd, как и раньше, для тестирования нашего бота.

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

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

Заключение

В этой статье мы увидели, как использовать бессерверную платформу Fauna для создания и размещения базы данных, а также индексов и коллекций. Мы увидели, как сгенерировать ключ API для связи с нашей базой данных из других приложений Python, которыми в данном случае был telegram-business.Мы увидели, как создать бота для телеграмм с нуля, используя Python и необходимые библиотеки.

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

Выведите своего чат-бота Telegram на новый уровень | by Beppe Catanese

Telegram Bot может работать с механизмом Pull или Push (см. далее Webhooks). В механизме извлечения бот (ваш код) регулярно проверяет наличие новых доступных сообщений на сервере.

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

  def  main (): 
updater = Updater ('myTelegramToken')

dp = updater.dispatcher

# определить обработчик команд
dp.add_handler (CommandHandler ( " help " , help_command_handler) # определить обработчик сообщений
dp.add_handler (MessageHandler (Filters.text, main_handler)) updater. start_polling ()

Как только бот будет готов к развертыванию, пора включить Webhook: при этом Telegram отправит обновления в зарегистрированную конечную точку webhook, и ваша служба будет занята только при появлении новых входящих сообщений.

 updater.start_webhook (listen =  "0.0.0.0" , 
port = 3978,
url_path = 'myTelegramToken')
updater.bot.setWebhook ('https://example.com/svc/myTelegramToken')

Примечание : webhook прекрасно работает с бессерверной архитектурой или с узлами «по запросу». Я развернул веб-перехватчики Telegram на Heroku Free Tier , который переходит в спящий режим после 30 минут бездействия, но при отправке нового сообщения запускается Heroky Dyno, и сообщение потребляется в течение нескольких секунд.

Примечание 2 : в зависимости от того, где развернут бот, необходимо настроить номер порта. Например, на Heroku порт обычно определяется переменной среды PORT и никогда не должен быть жестко запрограммирован.

Как зарегистрировать веб-перехватчик

Вы можете сделать это, вызвав setWebhook URL: используйте свой личный токен и передайте URL-адрес (должен быть HTTPS) веб-перехватчика.

 https://api.telegram.org/bot{myTelegramToken}/setWebhook?url=https://example.com / svc 

Переключение между режимами Pull и Push

Я считаю чрезвычайно удобным переключаться программно между опросом и веб-перехватчиком с помощью переменной среды: по умолчанию опрос для работы локально, но при развертывании в действующей системе его можно переопределить (на webhook ).

 # читать переменную MODE env, вернуться к 'опросу', если не определено 
mode = os.environ.get ( "MODE" , "polling") if DefaultConfig.MODE == 'webhook' :
# включить веб-перехватчик
updater.start_webhook (listen = "0.0.0.0" ,
port = 3978,
url_path = 'myTelegramToken')
updater.bot.setWebhook ('https: //example.com/svc/myTelegramToken ') else :
# включить опрос
updater.start_polling ()

Ответить на входящее сообщение довольно просто.

 update.message.reply_text («Привет!») 

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

Получить (и сохранить) chat_id , который находится в полезной нагрузке JSON сообщения, отправленного пользователем (да, вам нужно хотя бы одно сообщение)

 {'update_id': 527095032, 
'message': {
'message_id': 412,
'date': 16159

,
'chat': {
'id': 931365322,
'type': 'private',
'username': 'gcatanese',
....

При парсинге полезной нагрузки Python не забывайте, что разные сообщения имеют немного разный JSON.

  def  get_chat_id (update, context): 
chat_id = -1

при обновлении .сообщение не равно Нет :
# текстовое сообщение
chat_id = update.message.chat.id
elif update.callback_query is not None :
# сообщение обратного вызова
chat_id = update.callback_query.message.chat.id
elif update.poll is not None :
# answer in Poll
chat_id = context.bot_data [update.poll.id]

return chat_id

Проведите беседу, предоставив пользователю предварительно определенные параметры для Выбери из.Это может быть достигнуто с помощью InlineKeyboardMarkup , клавиатуры, которая отображается вдоль сообщения (как вопрос).

Изображение автора

Вот фрагмент Python для создания параметров:

 options = [] 
options.append (InlineKeyboardButton (text = 'Text', callback_data = '1'))
options.append (InlineKeyboardButton (text = 'Файл', callback_data = '2'))
options.append (InlineKeyboardButton (text = 'GoogleDoc', callback_data = '3'))
options.append (InlineKeyboardButton (text = 'Gallery', callback_data = '4') ) reply_markup = InlineKeyboardMarkup ([параметры]) контекст.bot.send_message (chat_id = get_chat_id (update, context), text = 'Что бы вы хотели получить?', reply_markup = reply_markup)

Важно понимать, что ответ будет обработан обработчиком CallbackQueryHandler и входящим Полезная нагрузка JSON отличается от обычного текстового сообщения.

 # ввод из текстового сообщения 
text = update.message.text
# выбор из обратного вызова
choice = update.callback_query.data

Примечание : после того, как будет сделан выбор, Опции исчезнут из чата.

Примечание 2 : определите callback_data , используя постоянное значение, которое будет использоваться для решения, что делать. В отличие от текста на кнопке это значение не должно изменяться, поскольку оно не отображается для пользователя.

 choice = update.callback_query.data  if  choice ==  '1' : 
# Вариант 1: текст
update.callback_query.message.edit_text ('Вы выбрали текст')

Отображение индикатора ввода общая особенность чат-ботов: пользователям сообщают, что сообщение скоро придет, даже если есть небольшая задержка.

 context.bot.send_chat_action (chat_id = get_chat_id (update, context), action = telegram.ChatAction.TYPING, timeout = 1) 
time.sleep (1)

Примечание : при отображении индикатора ввода я обычно использую небольшая задержка для создания ощущения настоящего разговора.

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

При определении глубокой ссылки можно добавить дополнительный параметр:

 https: // t.me / username_bot? start = signup 

По ссылке открывается приложение Telegram, предлагающее начать разговор с ботом. Дополнительный параметр передается CommandHandler , обрабатывающему команду / start .

  def  start_command_handler (update, context): 
param_value = context.args [0]
update.message.reply_text ( 'Значение ' + param_value)

Чат-бот может отправлять файлы (например, PDF, Office) по-разному.

Используйте send_document с полным URL-адресом файла:

 url = 'https: //github.com/gc/TelegramBotDemo/raw/main/test.pdf' 
context.bot.send_document (chat_id = get_chat_id ( update, context), document = url)

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

Другой подход - сначала загрузить файл локально, а затем отправить его тем же методом send_document .

 # получить с Google Диска 
url = 'https: // drive.google.com/file/d/0BZ3dWQ2ZXVOdE1V/view '
r = requests.get (url, allow_redirects = True)
# сохранить локальную копию
open (' file.ppt ',' wb ') .write (r. content) # отправить файл пользователю
context.bot.send_document (chat_id = get_chat_id (update, context), document = open ( 'file.ppt' , 'rb' ), filename = "Presentation.pptx")

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

Замечательная функция - отправка группы медиафайлов, таких как фотографии, видео и аудио.

Изображение автора
 list = [] # определить список файлов 
list.append (InputMediaPhoto (media = 'https: //../mintie.jpg', caption = 'Mint'))
list.append (InputMediaPhoto ( media = 'https: //../pinkie.png', caption = 'Pink'))
list.append (InputMediaPhoto (media = 'https: //../orangie.png', caption = 'Orange') )

context.bot.send_media_group (chat_id = get_chat_id (update, context), media = list)

Примечание : бот может отправлять до 10 медиафайлов одновременно.

Примечание 2 : каждое сообщение учитывается в пределах скорости Telegram (30 сообщений в секунду), поэтому вы можете отправить до 3 сообщений с 10 носителями каждое (всего 30), но в этом случае вы не можете добавить что-либо еще в та же транзакция (даже не простое текстовое сообщение).

Я надеюсь, что эта статья поможет разобраться в некоторых более сложных сценариях и открыть для себя функции, которые могут сделать вашего чат-бота Telegram немного более особенным. Мой совет - всегда сначала обдумывать то, что пользователи ищут (зачем им болтать?), А затем проектировать это так, чтобы их разговор был беспроблемным и приятным: достижение хорошего баланса определяет успех вашего чат-бота.

Посетите репозиторий Github, где вы можете взять фрагменты кода, показанные выше.

Check Also

Н хилл: Наполеон Хилл — Новинки книг 2020 – скачать или читать онлайн

Содержание Наполеон Хилл «Десять законов процветания» Наполеон Хилл «Десять законов процветания» Читать «Закон успеха» — …

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *