Как создать телеграмм бота: Чат-бот в Telegram — как создать чат-бота в Телеграме

Содержание

Как создать телеграм-бота | База знаний Selectel

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

  1. Запрограммировать логику работы Телеграм-бота.
  2. Зарегистрировать нового бота в Telegram.
  3. Связать бота и его логику воедино.

Запрограммировать логику работы Телеграм-бота

Чтобы упростить задачу, мы написали пример такого бота. Его исходный код доступен по ссылке github.com/selectel/cloud-telegram-bot. Он понимает команды:

  • /start с приветственным сообщением;
  • /sticker
    с ответом в виде стикера;
  • /getwebhook чтобы вы могли получить информацию о настройках вашего бота;
  • /setwebhook для настройки вашего бота, но об этом позже.

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

  1. Скачайте исходный код как архив («Clone or download» → «Download ZIP») и распакуйте его.
  2. Внутри должно быть:
    • «setup.py» с минимальным кодом, чтобы Python-окружение приняло содержимое папки за модуль для установки;
    • «requirements.txt» с описанием зависимостей;
    • «bot» — папка с исходным кодом нашего бота.
  3. Выделите все эти файлы и папки, а затем создайте из них новый ZIP-архив, тогда исходный код внутри архива не будет иметь лишних папок (как в случае с архивом, скачанным с github).
  4. Перейдите в панели управления в раздел Облачная ПлатформаФункции и нажмите кнопку Создать функцию.
  5. Выберите среду выполнения и задайте имя, например Bot.
  6. В поле Загрузить выберите Архив.
  7. Загрузите ZIP-файл в качестве Кода функции.
  8. Укажите Путь к файлу как /bot/tele_bot.py.
  9. Укажите Вызываемую функцию как
    main
    .
  10. Получите токен по инструкции и в поле Переменные окружения добавьте его ключ и значение.
  11. Нажмите кнопку Сохранить и развернуть.
  12. Чтобы получить ссылку для вызова функции, перейдите на вкладку Триггеры и нажмите на тумблер HTTP-запрос.

Теперь у нас есть API, реализующее логику ответов бота. Следующим этапом мы зарегистрируем его в Telegram.

Зарегистрировать нового бота в Telegram

Чтобы Telegram знал о существовании нашего бота, его нужно зарегистрировать. Для этого существует только один способ:

  1. Найдите бота @BotFather в Телеграм. Это официальный бот, созданный специально для управления ботами.
  2. Отправьте ему команду:

    /newbot
  3. @BotFather спросит вас, как вы назовёте вашего бота. Следующим сообщением отправьте его название, заканчивающееся на «_bot».

  4. Запишите полученный токен от @BotFather — это ключ для работы с Telegram API.

Теперь у нас API, регистрация бота в Telegram и его токен. Осталось связать это вместе.

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

На этом этапе надо сделать так, чтобы бот знал токен пользователя, а Telegram знал, где его API:

  1. Найдите переменную окружения «TOKEN» в настройках функции. Мы оставили её пустой на первом этапе.
  2. Укажите в этой переменной токен вашего бота, который получили от @BotFather.
  3. Нажмите Сохранить и развернуть.

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

Способ 1. Через бота @SelectelServerless_bot

  1. Найдите бота @SelectelServerless_bot в Телеграме.
  2. Введите команду:

    /setwebhook <Токен от вашего бота> <URL от облачной функции>
  3. Бот ответит тем, что получит из Telegram API. Если всё хорошо, это будет «true».

  4. Чтобы удостовериться в том, что всё корректно, отправьте команду:

    /getwebhook <Токен от вашего бота>
  5. В ответ должна прийти информация о webhook, в том числе указанный вами URL.

Способ 2. Из заготовленной формы

Откройте форму (или скопируйте её к себе в Облачное хранилище). Вставьте токен от вашего бота в первое поле, URL облачной функции во второе и нажмите на кнопку «Set Webhook». Произойдёт обращение к api.telegram.org, и вы увидите результат.

Примечание: может понадобиться наличие VPN.

Итог

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

Создаем Telegram-бота и зарабатываем на нем. Инструкция

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

Создать и настроить бота довольно просто. Для этого совсем не обязательно владеть языками программирования. 

Для начала нужно придумать имя, продумать команды, найти два Telegram-бота в помощь — @Fatherbot и @Manybot. Приступаем.

Шаг 1. Находим в строке поиска мессенджера приложение @FatherBot.

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

Шаг 2. Заходим в беседу с ботом, читаем описание.

Для начала работы нам нужно отправить команду /start.

Эта команда выведет на экран главное меню (список всего того, что умеет @FatherBot).

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

Также можно нажать на подсвеченную синим цветом  команду в выпавшем сообщении с меню.

Шаг 3. Создаем бот.

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

Вводим имя нашего бота.

Шаг 4. Придумываем юзернейм. 

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

Важно: название бота должно оканчиваться на слово «bot» (welcome_bot, information_bot, newsbot).

@FatherBot сообщает нам, что юзернейм свободен и теперь закреплен за нашим ботом.

Теперь у нашего бота есть собственная гиперссылка, через которую пользователи могут находить бот и заходить в чат через браузер и сам мессенджер (http://t.me/StarsFriens_bot).

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

Шаг 5. Переходим к настройкам бота. 

Отправляем в чат @FatherBot команду /mybots и выбираем нужный бот для редактирования (сейчас у нас только один тестовый бот, но впоследствии можно создавать и редактировать неограниченное количество ботов).

Отправляем в чат @FatherBot команду /mybots и 

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

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

На скриншоте видим «скелет» бота. Сейчас у него есть только название, но нет ни описания, ни каких-либо команд (действий, которые могут совершать с ним пользователи). По мере того как вы будете изменять бот, эти поля заполнятся.

Например, выбираем поле «Edit Description» и нажимаем соответствующую кнопку. 

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

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

Клавишу «Back to Bot» мы нажимаем каждый раз после того, как внесли изменение и хотим вернуться к другим настройкам бота.

Кстати, если нажмете клавишу «Back to Bot» и вернетесь к настройкам, то увидите, что «скелет» бота обновился: добавилось описание (Description).

В чем разница между полем Description и About? Description мы видим, когда уже зашли в чат с ботом. Поле About — это описание профиля бота, которое пользователи видят до начала диалога.

Снова нажимаем «Edit Bot», выбираем кнопку «Edit About». Поле About не должно превышать 120 символов.

About изменено. Нам снова предлагают либо вернуться к меню с настройками, либо к списку наших ботов (напоминаем, у нас он пока только один). 

Давайте посмотрим, где находится Description и About на примере нашего бота. Как это увидят пользователи? Мы уже можем ввести в поиске Telegram название нашего бота @StarsFriend_bot

В профиле бота видим поле About, а в самом чате — Description:

Шаг 5.

Добавляем картинку.

Снова выбираем «Edit Bot», затем «Edit Botpic». Присылаем в чат заранее подготовленную картинку.

Нажимаем «Back to Bot», смотрим на «скелет» нашего бота.
Теперь здесь отображаются почти все параметры, кроме команд. Для настройки команд понадобится специальный редактор ботов — @Manybot.

Шаг 6. Добавляем команды через редактор @Manybot. 

Так как @Fatherbot не позволяет создавать команды для новых ботов, мы будем настраивать наш бот через специальные редакторы, например, через @Manybot.

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

Находим бот в поиске приложения Telegram, отправляем в чат команду /start.

Получаем сообщение с меню.

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

Обратите внимание, что @Manybot содержит подробный список инструкций по любым настройкам. Нажмите на кнопку «Инструкции» (или отправьте в чат команду /tutorials) — и получите детальные гиды (на скриншоте отражена лишь часть инструкций). Нажмите кнопку «Помощь» — и снова получите меню доступных действий с вашим ботом (как на скриншоте выше):

Если вам недостаточно той информации, которая есть в меню самого @Manybot, вы можете найти большое количество пошаговых видео и инструкций в интернете. Так и гуглим: «Manybot инструкция».

Итак, нажимаем «Добавить нового бота». В ответ на команду @Manybot предлагает уже знакомый нам алгоритм. Остается только скопировать токен (напомним, мы получили его в самом начале от @FatherBot) и прислать его в сообщении @Manybot.

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

Отправляем сообщение «Я скопировал токен».

Присылаем наш токен из сообщения в чате с @Fatherbot.

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

В чате с @Manybot даем команду /newpost (или нажимаем клавишу меню «Отправить новое сообщение подписчикам»). Выбираем нашего бота в выпавшем сообщении.

Нажимаем на название бота в сообщении, и нас перебрасывает в чат с  нашим ботом. Здесь видим сообщение, которое только что отправил нам @Manybot. Оно содержит меню с настройками. Это пульт управления нашим ботом. Здесь можем перечитать подробные инструкции по каждому пункту. И снова видим удобные клавиши меню на месте клавиатуры:

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

Сначала настроим команды, а затем уже их вид в меню (то, как их будут видеть подписчики).

Выбираем «Создать команду». 

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

Так как тематика нашего тестового бота связана с астрономией и астрологией, в качестве одной из команд мы вставим ссылку на сайт NASA. Эту команду (опцию будущего меню) так и назовем: /site. 

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

Вы можете добавить для подписчиков возможность задавать боту вопросы. Для этого есть специальная кнопка «Добавить вопрос». Нажимаем ее и видим варианты: «Обычный вопрос», «Развернутый ответ», «С вариантами ответа». 

Вы также можете включить «Режим Случайного Сообщения».

Приведем пример еще двух команд: /wallpaper (мы хотим, чтобы пользователи могли скачать тематические обои) и /info (после этой команды пользователь получит информацию о создателях бота).

Для /wallpaper используем режим случайного сообщения и загрузим пять картинок. Нажимаем «Сохранить».

Шаг 7. Настройка меню бота.

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

Выбираем «Настроить гл.меню», «Добавить пункт меню», выбираем уже созданную нами команду, называем ее (финальное название для пользователя, а не формат /команда), сохраняем.

Например, хотим переименовать команду /info в понятное «О нас».

Выбираем «Добавить пункт меню» — /info:

Теперь меню нашего бота выглядит так. Кстати, можно использовать любой язык и эмодзи.

В наш тестовый бот добавили три пункта меню: /info (о нас),  /site (официальный сайт NASA), /coolfact (интересные факты).

Telegram бот для службы поддержки, приёма и обработки заявок

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

Всё это привело нас к мысли, что пора делать в Okdesk ещё один канал регистрации заявок и коммуникации с заявителями. Давайте посмотрим на то, что у нас получилось?

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

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

Создание нового Telegram бота для службы поддержки

Что такое боты в Telegram? Это специальные аккаунты, которые не закреплены за людьми, а отправляемые от них или им сообщения обрабатываются внешней системой (в частности, системой Okdesk). При этом для пользователя общение с ботом выглядит как обычная переписка с другим человеком.

Как создать своего бота? Для этого в Telegram есть самый главный бот — @BotFather. Начните диалог с ним:

Далее введите команду /newbot и следуйте указаниям: бот попросит указать name (отображаемое для других пользователей имя) и username (должно заканчиваться на *bot) нового бота (например: OkdeskDemoBot). После завершения процедуры @BotFather отправит в чат сообщение с ключом доступа для управления созданным ботом:

После создания нового бота и получения ключа доступа (на скриншоте выделен маркером), необходимо присоединить бота к своему аккаунту в Okdesk.

Попробуйте систему автоматизации техподдержки Okdesk бесплатно

Даём бесплатный доступ на 14 дней с полным функционалом!

Возможности Okdesk:

  • Готовые интеграции с e-mail, мессенджерами, 30+ АТС и другими сервисами
  • Автоматическое распределение заявок между специалистами
  • Готовые экспертные отчёты по ключевым показателям бизнеса
  • Учёт затрат, оборудования и объектов обслуживания
  • Мобильное приложение

Подключение Telegram бота к Okdesk

Подключить бота Telegram к аккаунту Okdesk можно в разделе «Настройки → Интеграция с мессенджерами → Telegram-бот для клиентов» (см. п. 1 на скриншоте ниже). Далее в разделе настроек нажмите на кнопку «Задать ключ доступа» («Изменить ключ доступа», если хотите присоединить к Okdesk другого бота). После указания ключа доступа появится кнопка проверки корректности ключа (п. 3 на скриншоте). Нажмите на эту кнопку для того, чтобы проверить подключение к Telegram боту. Если подключение корректно, бот готов к службе!

15 000+ подписчиков. Присоединиться к рассылке

Как работает Telegram бот для техподдержки?

При первичном обращении, бот запросит у пользователя номер телефона. Это необходимо для сопоставления пользователя Telegram и контактного лица в базе Okdesk. Если поиск по номеру телефона не даст результатов, будет создано новое контактное лицо (но во избежании дублей вы сможете объединить созданный контакт с существующим — такая функция доступна в карточке контактного лица).

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

При создании новой заявки, если в настройках типов заявок есть хотя бы одна заявка, для которой установлен параметр «Доступен для выбора клиентом», бот предложит выбрать тип заявки (если пользователь не выберет тип, то заявка будет создана с типом «по умолчанию»):

Если сервисные сотрудники оставляют публичный комментарий (ответ) к заявке, этот комментарий отправляется пользователю в Telegram. Пользователь может ответить на комментарий, и тогда ответ добавится к заявке в Okdesk. Когда сервисные сотрудники переводят заявку в статус «Решена», пользователь получает оповещение в Telegram и может либо возобновить заявку, либо закрыть и оценить её.

Вы можете протестировать работу Okdesk и нашего бота совершенно бесплатно в течение 14 дней. Без обязательств и предоплаты.

Попробуйте Okdesk бесплатно

Бесплатный доступ ко всем возможностям сервиса на 14 дней

Возможности нашего Help Desk:

  • Десятки готовых интеграций: телефония, мессенджеры, сервисы телематики
  • Учёт затрат, оборудования и объектов обслуживания
  • Автоматическое распределение заявок
  • Десятки готовых экспертных отчётов
  • Мобильное приложение для Android и iOS

Команды и оповещения @BotFather в Telegram.

Для создания нового бота необходимо использовать команду /newbot. @BotFather запросит имя бота и имя пользователя бота (логин), а затем сгенерирует токен авторизации для вашего нового бота.

Имя бота отображается в контактных данных и в других местах.

Имя пользователя бота — это логин бота и представляет из себя короткое имя, которое будет использоваться в упоминаниях и ссылках на t.me. Обратите внимание, что в дальнейшем имя пользователя изменить нельзя! Имена пользователей (логины) состоят из 5–32 символов и нечувствительны к регистру, и могут включать только латинские символы, числа и символы подчеркивания. Имя пользователя бота должно заканчиваться на bot, например tetris_bot или TetrisBot.

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

Пересоздание токена авторизации Telegram бота.

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

Команды

@BotFather
  • /mybots — возвращает список ваших ботов с удобными элементами управления для редактирования их настроек.
  • /mygames — делает то же самое для ваших игр
Команды редактирования Telegram бота:
  • /setname — изменить имя вашего бота.
  • /setdescription — изменить описание бота, текст до 512 символов, описывающий бота. Пользователи увидят этот текст в начале разговора с ботом, озаглавленный «What can this bot do?».
  • /setabouttext — изменить информацию о боте, более короткий текст до 120 символов. Пользователи увидят этот текст на странице профиля бота. Когда они делятся вашим ботом с кем-то, этот текст отправляется вместе со ссылкой.
  • /setuserpic — изменить фото профиля бота.
  • /setcommands — изменить список команд, поддерживаемых ботом. Пользователи будут видеть список команд всякий раз, когда они набирают '/' в разговоре с вашим ботом. Каждая команда имеет имя (должно начинаться с косой черты ‘/’, буквенно-цифровое значение плюс подчеркивание, не более 32 символов, без учета регистра), параметры и текстовое описание.
  • /deletebot — команда удаляет бота и освобождает его логин.
Команды изменения настроек Telegram бота.
  • /setinline — переключает встроенный режим запросов для бота.
  • /setinlinegeo — запрашивает данные о местоположении для предоставления встроенных результатов на основе местоположения.
  • /setjoingroups — переключатель, который отвечает за то, можно ли добавлять бота в группы или нет. Любой бот должен уметь обрабатывать личные сообщения, но если создаваемый бот не предназначен для работы в группах, то можно отключить этот режим.
  • /setprivacy — установить, какие сообщения будет получать бот при добавлении в группу. Если режим конфиденциальности отключен, то бот будет получать все сообщения. Мы рекомендуем оставить режим конфиденциальности включенным. Вам нужно будет повторно добавить бота в существующие группы, чтобы это изменение вступило в силу.
Команды управления играми.
  • /newgame — создать новую игру.
  • /listgames — получить список ваших игр.
  • /editgame — редактировать игру.
  • /deletegame — удалить существующую игру.

Обратите внимание, что изменения вступят в силу не сразу, а через несколько минут.

Ограничения и предупреждения о статусе Telegram бота.

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

Telegram будет проверять количество ответов и коэффициент конверсии запросов/ответов для популярных ботов (300 запросов в минуту: это значение может измениться в будущем). Если мы получим аномально низкие показания, вы получите уведомление от @BotFather.

Ответы на предупреждения.

По умолчанию вы будете получать только одно предупреждение на одного бота в час. Каждое предупреждение имеет следующие кнопки:

  • Fixed. Используйте эту кнопку, если обнаружили проблему с вашим ботом и исправили ее. Если нажать на кнопку Fixed, то отправку предупреждений в обычном режиме возобновится, для того чтобы увидеть, сработало ли исправление в течение 5–10 минут, вместо того, чтобы ждать час.
  • Support. Используйте эту кнопку, чтобы открыть чат с @BotSupport, если не видите проблем с ботом или считаете, что проблема на стороне Telegram.
  • Mute for 8h/1w. Используйте кнопку, если нет возможности исправить бота в данный момент. Это отключит все предупреждения для рассматриваемого бота за указанный период времени. Мы не рекомендуем использовать эту опцию, поскольку пользователи могут перейти на более стабильный бот. Вы можете включить оповещения в настройках своего бота через @Botfather.

Отслеживаемые проблемы Telegram бота.

В настоящее время Telegram будет уведомлять о следующих проблемах:

  1. Too few private messages are sent compared to previous weeks: {value}.

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

  2. Too few replies to incoming private messages. Conversion rate: {value}.

    Бот не отвечает на все сообщения, которые ему отправляются (коэффициент конверсии запроса/ответа для бота был слишком низким по крайней мере в течение двух из последних трех 5-минутных периодов). Чтобы обеспечить хороший пользовательский опыт, пожалуйста, отвечайте на все сообщения, которые отправляются вашему боту.

  3. Too few answers to inline queries. Conversion rate: {value}.

    Бот не отвечает на все встроенные запросы, которые ему посылаются, рассчитанные таким же образом, как и выше. Отвечайте на обновления inline_query, вызывая answerInlineQuery.

  4. Too few answers to callback queries. Conversion rate: {value} или Too few answers to callback game queries. Conversion rate: {value}.

    Бот не отвечает на все запросы обратного вызова, которые ему посылаются (с играми или без них), рассчитанные таким же образом, как и выше. Отвечайте на сообщения callback_query, вызывая answerCallbackQuery.

Обратите внимание, что функция оповещения о состоянии все еще тестируется и будет улучшена в будущем.

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

В последнее время Telegram у всех на слуху. Нужно отдать должное отделу маркетинга этого приложения, шумиху подняли на славу. Одной из основных «фишек» Telegram является его якобы защищённость — по словам Павла Дурова вся переписка между пользователями шифруется. Более того, ни одна спец.служба мира не будет иметь доступ к вашим сообщениям. Но в данной статье речь не об этом. Сегодня хотелось бы поговорить о не менее крутой фишке в Telegram, а именно о ботах. Помимо того, что в сети уже полно информации о различного рода Telegram ботах (github бот, например), мессенджер открыл своё API для разработчиков, и теперь каждый может создать своего собственного бота с блэкджеком и плюшками.

В статье я приведу пример написания онлайн бота с использованием Python и Django фреймворка. То есть мы «запилим» полноценное веб-приложение, которое будет крутиться на удалённом хосте и принимать команды от пользователей. Весь исходный текст доступен в моём github репозитории.

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

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

Для начала нам необходимо зарегистрировать в Telegram нашего будущего бота. Это делается следующим образом:

  • Необходимо установить приложение Telegram на телефон или компьютер. Скачать приложение можно тут
  • Добавляем к себе в контакт-лист бота с именем BotFather
  • Запускаем процедуру «общения» с ботом нажатием кнопки Start. Далее перед нами предстанет список команд точно как на скриншоте.
  • Для того, чтобы создать нового бота необходимо выполнить команду /newbot и следовать инструкциям. Обратите внимание, что username для бота должен всегда содержать в конце слово bot. Например, DjangoBot или Django_bot.

  • Для нашего бота я выбрал имя PythonPlanetBot, так как его основная функция заключается в парсинге RSS feed сайта Python Planet и выдача информации о последних постах пользователю

После создания бота, обратите внимание на строку с текстом:

Use this token to access the HTTP API:

За которой следует т.н. token по которому мы будем манипулировать нашим ботом. Помимо функции создания telegram бота, BotFather также имеет ряд других возможностей:

  • Присвоить боту описание
  • Установить аватар
  • Поменять token

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

Приступаем к кодированию

Как я ранее уже упоминал, мы будем писать веб-приложение на Django. Но стоит отметить, что это делать необязательно. Можно обойтись и обычным Python скриптом, правда в этом случае необходимо будет периодически опрашивать Telegram на предмет новых запросов от пользователей бота (используя метод getUpdates) и увеличивая offset для получения самых последних данных без повторений.  В Telegram существует два взаимоисключающих метода получения команд/сообщений для вашего бота.

  • Использование вызова API метода getUpdates
  • Установка Webhook

Установка Webhook заключается в передаче боту специального URL адреса на который будет поступать POST запрос каждый раз, когда кто-то начнёт посылать сообщения боту. Именно этот вариант мы и будем использовать для взаимодействия между ботом и его пользователем. Для того, чтобы задать URL, необходимо использовать API метод setWebhook. Отмечу, что URL должен начинаться с https, то есть иметь защищённое SSL соединение с валидным сертификатом. Telegram разрешает использовать самоподписанный сертификат, правда для этого необходимо в методе setWebhook передавать также публичный ключ в PEM формате (ASCII base64). Либо же можно получить валидный бесплатный SSL сертификат от Let’s Encrypt.

Подробнее о getUpdates и setWebhook можно почитать соответственно здесь и тут.

Итак, вернёмся к python библиотеке для работы с Telegram — telepot. На текущий момент самой последней её версий является 6.7. Устанавливаем её в виртуальное окружение python virtualenv:

pip install telepot

Самый простой вариант взаимодействия с Telegram ботом на Python выглядит следующим образом:

import telepot
token = '123456'
TelegramBot = telepot.Bot(token)
print TelegramBot.getMe()

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

{u'username': u'PythonPlanetBot', u'first_name': u'Python Planet Bot', u'id': 199266571}

Поздравляю! Мы вызывали самый простой API запрос getMe, который возвращает информацию о боте: username, id, first_name.

Добавим нашего бота к себе в контакт-лист и пошлём ему первую стандартную команду /start

Выполняем код:

TelegramBot.getUpdates()
[{u'message': {u'date': 1459927254, u'text': u'/start', u'from': {u'username': u'adilkhash', u'first_name': u'Adil', u'id': 31337}, u'message_id': 1, u'chat': {u'username': u'adilkhash', u'first_name': u'Adil', u'type': u'private', u'id': 7350}}, u'update_id': 649179764}]

Процесс общения с telegram ботом происходит по HTTPS; для передачи данных используется JSON. Метод getUpdates возвращает список/массив из объектов типа Update. Внутри Update находится объект Message. Для стандартного взаимодействия с ботом нас фактически интересует именно объект Message, у которого мы считываем атрибут text, хранящий в себе текст, переданный боту и объект chat, в котором лежит информация о пользователе, инициировавшем общение с нашим Telegram ботом. Также имеется параметр update_id, который служит в качестве offset параметра при вызове метода getUpdates. То есть update_id+1 вернёт все сообщения, поступившие после последнего update_id, при этом все предыдущие сообщения будут удалены.

TelegramBot.getUpdates(649179764+1)
[{u'message': {u'date': 1459928527, u'text': u'hello bro', u'from': {u'username': u'adilkhash', u'first_name': u'Adil', u'id': 31337}, u'message_id': 13, u'chat': {u'username': u'adilkhash', u'first_name': u'Adil', u'type': u'private', u'id': 7350}}, u'update_id': 649179765}]

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

Простая функция парсинга RSS фида Planet Python выглядит вот так:

# -*- coding: utf8 -*-
from xml.etree import cElementTree

import requests


def parse_planetpy_rss():
    """Parses first 10 items from http://planetpython.org/rss20.xml
    """
    response = requests.get('http://planetpython.org/rss20.xml')
    parsed_xml = cElementTree.fromstring(response.content)
    items = []

    for node in parsed_xml.iter():
        if node.tag == 'item':
            item = {}
            for item_node in list(node):
                if item_node.tag == 'title':
                    item['title'] = item_node.text
                if item_node.tag == 'link':
                    item['link'] = item_node.text

            items.append(item)

    return items[:10]

Здесь я использую python библиотеку requests для работы с HTTP в самом простейшем варианте без обработки ошибок. Django «вьюшка» выглядит следующим образом:

TOKEN = '<Our_Bot_Token>'
TelegramBot = telepot.Bot(TOKEN)

def _display_help():
    return render_to_string('help.md')


def _display_planetpy_feed():
    return render_to_string('feed.md', {'items': parse_planetpy_rss()})


class CommandReceiveView(View):
    def post(self, request, bot_token):
        if bot_token != TOKEN:
            return HttpResponseForbidden('Invalid token')

        commands = {
            '/start': _display_help,
            'help': _display_help,
            'feed': _display_planetpy_feed,
        }

        try:
            payload = json.loads(request.body.decode('utf-8'))
        except ValueError:
            return HttpResponseBadRequest('Invalid request body')
        else:
            chat_id = payload['message']['chat']['id']
            cmd = payload['message'].get('text')  # command

            func = commands.get(cmd.split()[0].lower())
            if func:
                TelegramBot.sendMessage(chat_id, func(), parse_mode='Markdown')
            else:
                TelegramBot.sendMessage(chat_id, 'I do not understand you, Sir!')

        return JsonResponse({}, status=200)

    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(CommandReceiveView, self).dispatch(request, *args, **kwargs)

CommandReceiveView ждёт POST запрос на себя, парсит его и отвечает исходя из заданной команды. Полноценное Django приложение можно найти по этой ссылке. Стоит отметить в коде использование ещё одного API вызова — sendMessage. Этот метод отправляет сообщение заданному пользователю, используя при этом chat_id и сам текст сообщения. Chat_id — это уникальный идентификатор чата между пользователем и ботом (его идентификатор есть в ответе на запрос getUpdates). У Telegram ботов есть одно ограничение, они не могут посылать сообщения пользователям, которые предварительно не инициировали общение с ним. По-видимому это сделано дабы избежать массового создания спам-ботов.

Я предполагаю, что вы уже клонировали мой репозиторий, настроили окружение и установили все необходимые зависимости: Django, requests, telepot. Если же вы не знаете как это сделать, то совсем скоро я напишу цикл статей о разработке веб-приложений на Python, включая разбор экосистемы: разработка, настройка, деплой. Если вам это интересно, то отпишитесь, пожалуйста, в комментариях к этой статье. Хочется получить обратную связь

Итак, веб-приложение на Django запущено. Как же начать тестировать бота? А всё очень просто — необходимо симулировать действия Telegram сервиса. Для этого нам понадобится HTTP клиент и тело запроса. В качестве HTTP клиента я часто использую Chrome плагин под названием Postman, а тело запроса мы возьмём напрямую из данных, полученных с помощью API вызова getUpdates.

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

http://127.0.0.1:8000/planet/bot/BOT_TOKEN/

где BOT_TOKEN — это токен нашего бота. Смотрим скриншот:

 

А давайте-ка отправим команду feed для получения списка новостей из Planet Python:

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

Следующим шагом является деплой нашего Django приложения на удалённый хост и последующий вызов метода setWebhook для передачи URL на который будет посылаться POST запрос от сервиса Telegram каждый раз при поступлении команд боту от пользователей. Об этом мы поговорим в следующей заметке.

Глава 2 Добавляем боту поддержку команд и фильтры сообщений, класс Updater

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

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

Класс Updater

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

В свою очередь Dispetcher содержит в себе созданные вами обработчики, т.е. объекты класса Handler.

Handlers — обработчики

С помощью обработчиков вы добавляете в Dispetcher реакции бота на различные события. На момент написания книги в telegram.bot добавлены следующие типы обработчиков:

  • MessageHandler — Обработчик сообщений
  • CommandHandler — Обработчик команд
  • CallbackQueryHandler — Обработчик данных отправляемых из Inline клавиатур
  • ErrorHandler — Обработчик ошибок при запросе обновлений от бота

Добавляем первую команду боту, обработчик команд

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

Начнём мы с простых команд, т.е. научим нашего бота здороваться по команде /hi.

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправка приветственного сообщения
  bot$sendMessage(update$message$chat_id,
                  text = paste0("Моё почтение, ", user_name, "!"),
                  parse_mode = "Markdown")

}

# создаём обработчик
hi_hendler <- CommandHandler('hi', say_hello)

# добаляем обработчик в диспетчер
updater <- updater + hi_hendler

# запускаем бота
updater$start_polling()

Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather.

Метод start_polling() класса Updater, который используется в конце кода, запускает бесконечный цикл запроса и обработки обновлений от бота.

Теперь откроем телеграм, и напишем нашему боту первую команду /hi.

Теперь наш бот понимает команду /hi, и умеет с нами здороваться.

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

  1. Создаём экземпляр класса Updater;
  2. Создаём методы, т.е. функции которые будет выполнять наш бот. В примере кода это функция say_hello(). Функции, которые вами будут использоваться как методы бота должны иметь два обязательных аргумента — bot и update, и один необязательный — args. Аргумент bot, это и есть ваш бот, с его помощью вы можете отвечать на сообщения, отправлять сообщения, или использовать любые другие доступные боту методы. Аргумент update это то, что бот получил от пользователя, по сути, то что в первой главе мы получали методом getUpdates(). Аргумент args позволяет вам обрабатывать дополнительные данные отправленные пользователем вместе с командой, к этой теме мы ещё вернёмся немного позже;
  3. Создаём обработчики, т.е. связываем какие-то действия пользователя с созданными на прошлом шаге методами. По сути обработчик это триггер, событие которое вызывает какую-то функцию бота. В нашем примере таким триггером является отправка команды /hi, и реализуется командой hi_hendler <- CommandHandler('hi', say_hello). Первый аргумент функции CommandHandler() позволяет вам задать команду, в нашем случае hi, на которую будет реагировать бот. Второй аргумент позволяет указать метод бота, мы будем вызывать метод say_hello, который будет выполняться если пользователь вызвал указанную в первом аргументе команду;
  4. Далее добавляем созданный обработчик в диспетчер нашего экземпляра класса Updater. Добавлять обработчики можно несколькими способами, в примере выше я использовал простейший, с помощью знака +, т.е. updater <- updater + hi_hendler. То же самое можно сделать с помощью метода add_handler(), который относится к классу Dispatcher, найти этот метод можно так: updater$dispatcher$add_handler();
  5. Запускаем бота с помощью команды start_polling().

Обработчик текстовых сообщений и фильтры

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

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

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

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
## команда приветвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправляем приветсвенное сообщение
  bot$sendMessage(update$message$chat_id,
                  text = paste0("Моё почтение, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# создаём фильтры
MessageFilters$hi <- BaseFilter(function(message) {

  # проверяем, встречается ли в тексте сообщения слова: привет, здравствуй, салют, хай, бонжур
  grepl(x           = message$text,
        pattern     = 'привет|здравствуй|салют|хай|бонжур',
        ignore.case = TRUE)
  }
)

# создаём обработчик
hi_hendler <- CommandHandler('hi', say_hello) # обработчик команды hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# добаляем обработчики в диспетчер
updater <- updater +
             hi_hendler +
             hi_txt_hnd

# запускаем бота
updater$start_polling()

Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather.

Теперь попробуем отправить боту несколько сообщений, в которых будут встречаться перечисленные ранее слова приветствия:

Итак, в первую очередь мы научили бота не просто здороваться, а отвечать на приветствие. Сделали мы это с помощью аргумента reply_to_message_id, который доступен в методе sendMessage(), в который необходимо передать id сообщения на которое требуется ответить. Получить id сообщения можно вот так: update$message$message_id.

Но главное, что мы сделали — добавили боту фильтр с помощью функции BaseFilter():

# создаём фильтры
MessageFilters$hi <- BaseFilter(

  # анонимная фильтрующая функция
  function(message) {

    # проверяем, встречается ли в тексте сообщения слова приветствия
    grepl(x           = message$text,
          pattern     = 'привет|здравствуй|салют|хай|бонжур',
          ignore.case = TRUE)
  }

)

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

В функцию BaseFilter() вам необходимо передать фильтрующую функцию. По сути, фильтр — это просто функция, которая получает экземпляр сообщения и возвращает TRUE или FALSE. В нашем примере, мы написали простейшую функцию, которая с помощью базовой функции grepl() проверяет текст сообщения, и если он соответствует регулярному выражению привет|здравствуй|салют|хай|бонжур возвращает TRUE.

Далее мы создаём обработчик сообщений hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Первый аргумент функции MessageHandler() — метод, который будет вызывать обработчик, а второй аргумент — это фильтр по которому он будет вызываться. В нашем случае это созданный нами фильтр MessageFilters$hi.

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

updater <- updater +
             hi_hendler +
             hi_txt_hnd

Как я уже писал выше, в пакете telegram.bot и объекте MessageFilters уже есть набор встроенных фильтров, которые вы можете использовать:

  • all — Все сообщения
  • text — Текстовые сообщения
  • command — Команды, т.е. сообщения которые начинаются на /
  • reply — Сообщения, которые являются ответом на другое сообщение
  • audio — Сообщения в которых содержится аудио файл
  • document — Сообщения с отправленным документом
  • photo — Сообщения с отправленными изображениями
  • sticker — Сообщения с отправленным стикером
  • video — Сообщения с видео
  • voice — Голосовые сообщения
  • contact — Сообщения в которых содержится контант телеграм пользователя
  • location — Сообщения с геолокацией
  • venue — Пересылаемые сообщения
  • game — Игры

Если вы хотите совместить некоторые фильтры в одном обработчике просто используйте знак | — в качестве логического ИЛИ, и знак & в качестве логического И. Например, если вы хотите что бы бот вызывал один и тот же метод когда он получает видео, изображение или документ используйте следующий пример создания обработчика сообщений:

handler <- MessageHandler(callback,
  MessageFilters$video | MessageFilters$photo | MessageFilters$document
)

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

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

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

Приведённый ниже бот использует API производственного календаря isdayoff.ru.

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
## команда приветвия
check_date <- function(bot, update, args) {

  # входящие данные
  day     <- args[1]  # дата
  country <- args[2]  # страна

  # проверка введённых параметров
  if ( !grepl('\\d{4}-\\d{2}-\\d{2}', day) ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id,
                    text = paste0(day, " - некорреткная дата, введите дату в формате ГГГГ-ММ-ДД"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # переводим в формат POSIXtl
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # страна для проверки
  ## проверяем задана ли страна
  ## если не задана устанавливаем ru
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id,
                    text = paste0(country, " - некорретктный код страны, возможнные значения: ru, by, kz, ua, us. Запрошены данные по России."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # запрос данных из API
  # компоновка HTTP запроса
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # получаем ответ
  res <- readLines(url)

  # интрепретация ответа
  out <- switch(res,
                "0"   = "Рабочий день",
                "1"   = "Нерабочий день",
                "2"   = "Сокращённый рабочий день",
                "4"   = "covid-19",
                "100" = "Ошибка в дате",
                "101" = "Данные не найдены",
                "199" = "Ошибка сервиса")

  # отправляем сообщение
  bot$sendMessage(update$message$chat_id,
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# создаём обработчик
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# добаляем обработчик в диспетчер
updater <- updater + date_hendler

# запускаем бота
updater$start_polling()

Запустите приведённый выше пример кода, предварительно заменив ‘ТОКЕН ВАШЕГО БОТА’ на реальный токен, который вы получили при создании бота через BotFather.

Мы создали бота, который в арсенале имеет всего один метод check_date, данный метод вызывается одноимённой командой.

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

Что бы создаваемый нами метод принимал дополнительные параметры вместе с командой, используйте аргумент pass_args = TRUE в функции CommandHandler(), и при создании метода, помимо обязательных аргументов bot, update создайте опциональный — args. Созданный таким образом метод будет принимать параметры, которые вы передаёте боту после названия команды. Параметры необходимо между собой разделять пробелом, в метод они поступят в виде текстового вектора.

Давайте запустим, и протестируем нашего бота.

Запускаем бота в фоновом режиме

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

Для этого следуйте по описанному ниже алгоритму:

  1. Сохраните код бота в файл с расширением R. При работе в RStudio это делается через меню File, командой Save As….
  2. Добавьте путь к папке bin, которая в свою очередь находится в папке в которую вы установили язык R в переменную Path, инструкция тут.
  3. Создайте обычный текстовый файл, в котором пропишите 1 строку: R CMD BATCH C:\Users\Alsey\Documents\my_bot.R. Вместо *C:_bot.R* пропишите путь к своему скрипту бота. При этом важно, что бы в пути не встречалась кириллица и пробелы, т.к. это может вызвать проблемы при запуске бота. Сохраните его, и замените его расширение с txt на bat.
  4. Откройте планировщик заданий Windows, есть множество способов это сделать, например откройте любую папку и в адресс введите %windir%\system32\taskschd.msc /s. Другие способы запуска можно найти тут.
  5. В верхнем правом меню планировщика нажмите “Создать задачу….”
  6. На вкладке “Общие” задайте произвольное имя вашей задаче, и переключатель перевидите в состояние “Выполнять для всех пользователей.”
  7. Перейдите на вкладку “Действия,” нажмите “Создать.” В поле “Программа или сценарий” нажмите “Обзор,” найдите созданный на втором шаге bat файл, и нажмите ОК.
  8. Жмём ОК, при необходимости вводим пароль от вашей учётной записи операционной системы.
  9. Находим в планировщике созданную задачу, выделяем и в нижнем правом углу жмём кнопку “Выполнить.”

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

Как добавить бота в группу

Для того, что бы использовать бота в публичных или закрытых группах, изначально проверьте соответвующую настройку в BotFather. По умолчанию эта настройка должна быть включена. Находится она тут: /mybots -> @bot_username -> Bot Settings -> Allow Groups?. Если настройка включена то вы увидите следующее сообщение:

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

Как добавить описание команд в интерфейс бота

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

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

Делается это через BotFather -> @bot_username -> Edit Bot -> Edit Commands. Далее просто передаёте название команды и через тире их описание:

command1 - Description
command2 - Another description

Заключение

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

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

Подписываетесь на мой telegram и youtube каналы.

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

Тесты

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

Задания

  1. Создайте бота, который будет по команде /sum и переданное в качестве дополнительных параметров произвольное количество перечисленных через пробел чисел, возвращать их сумму.

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

Создание телеграм-бота с веб-интерфейсом при помощи Python и Replit

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

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

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

Необходимые приготовления

Для получения максимальной пользы от этого руководства читателю нужно:

  • знать язык программирования Python
  • иметь аккаунт в Телеграм и установить клиентскую часть на свой компьютер
  • иметь аккаунт в Replit или создать его прямо сейчас.

Также было бы полезно, если бы вы были знакомы с базой данных Replit, но это не критично.

Регистрация бота

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

Для этого сначала войдите в ваш аккаунт и в поиске наберите @bot. Обязательно выберите подтвержденный аккаунт (у которого справа будет голубая галочка), в противном случае мы можем провести беседу с кем-то совсем другим.

BotFather

Для активации BotFather нажмите на кнопку Start:

Для начала рабочего процесса создания нового бота мы должны отправить в BotFather команду /newbot.

Бот у нас спросит следующие данные:

  • имя бота, которое будет отображаться в верхней части чата нового бота, например, «Replit Quick-start Tutorial».
  • имя пользователя, которое будет использоваться для уникальной ссылки на этого бота, например, «@replit_tutorialbot».

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

Токен

Как только мы ответим на все вопросы, BotFather отправит нам наш токен аутентификации, который будет выглядеть примерно так:

110201543:AAHdqTcvCh2vGWJxfSeofSAs0K5PALDsaw

Обратите внимание, что вся строка (до двоеточия и после) является токеном.

Создание интерфейса бота

Теперь мы можем приступить к написанию той части программы, которая обрабатывает запросы из Telegram. Создадим новую repl-среду, а в качестве языка программирования выберем Python.

Наш бот должен взаимодействовать с Telegram. Для этого нам понадобится доступ к Telegram REST API. Есть много способов сделать это, но в рамках данной статьи мы будем использовать удобную библиотеку, обернутую обернута вокруг API.

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

Создание переменной среды

Это гарантирует, что наш токен доступен как переменная среды и что к нему не смогут получить доступ люди, имеющие доступ к нашей среде repl (в бесплатной версии она открыта для всех, — прим. переводчика).

Создание скелета бота

Теперь, когда все настроено, мы можем приступить к программированию! Начнем с нашего файла main.py:

import os

from telegram import Update #upm package(python-telegram-bot)
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext  #upm package(python-telegram-bot)


def help_command(update: Update, context: CallbackContext) -> None:
    htext = '''
Welcome
Send a message to store it.
Send /fetch to retrieve the most recent message'''
    update.message.reply_text(htext)


def main():
    updater = Updater(os.getenv("TOKEN"))

    dispatcher = updater.dispatcher
    dispatcher.add_handler(CommandHandler("start", help_command))
    dispatcher.add_handler(CommandHandler("help", help_command))

    updater.start_polling()

    updater.idle()


if __name__ == '__main__':
    main() 

Сначала мы импортируем модуль os, чтобы получить доступ к токену как переменной окружения.

Затем мы импортируем некоторые классы из библиотеки Telegram.

Комментарии, начинающиеся с #upm, не являются обязательными. Они используются Replit для загрузки правильного пакета. В общем случае это не нужно, но здесь необходимо, потому что подобных библиотек Telegram очень много.

Функция help_command запускается всякий раз, когда пользователь отправляет нам команду /start или /help. Команда /start также выполняется автоматически, когда новый пользователь запускает ваш бот (как мы ранее запускали BotFather). Бот будет знать, как использовать эту функцию, потому что мы сообщим ему об этом позже в теле функции main.

В функции main мы инициализируем экземпляр класса updater, который использует наш токен.

updater = Updater(os.getenv("TOKEN"))

Updater — это класс, который будет постоянно проверять Telegram на наличие новых сообщений в нашем боте.

Когда updater получает новое сообщение, он передает его в класс dispatcher. Тот проверяет, есть ли у нас подходящий обработчик для данного сообщения. Как уже упоминалось выше, нужно задать обработчик для команд /start и /help. Мы cделаем это при помощи функции add_handler, например:

dispatcher.add_handler(CommandHandler("start", help_command))

и

dispatcher.add_handler(CommandHandler("help", help_command))

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

Затем нам нужно сказать классу updater, чтобы он начал проверку новых сообщений. Мы это сделаем при помощи следующей строки.

updater.start_polling()

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

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

Английский для программистов

Наш телеграм канал с тестами по английскому языку для программистов. Английский это часть карьеры программиста. Поэтому полезно заняться им уже сейчас

Подробнее ×

Функционал для логирования

Согласно тексту справки, бот должен уметь делать две вещи:

  1. Если вы отправляете сообщение боту, он должен где-то его сохранить.
  2. При отправке боту команды /fetch он должен отправить вам последнее сообщение.

Для этого мы будем использовать встроенную в Replit базу данных ключ-значение. Начнем с импорта API:

from replit import db

Модуль db — это объект, который ведет себя как словарь, но сохраняет свое содержимое между запусками. Он также сериализует свои ключи в виде строк.

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

def latest_key():
    ks = db.keys()
    if len(ks):
        return max(map(int, ks))
    else:
        return -1 

Функция latest_key получает все ключи из нашей базы данных (модуль db). Если в ней есть ключи, они преобразуются в целые числа и возвращается максимальное из них. Если ключей нет, то возвращается -1.

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

def log(update: Update, context: CallbackContext) -> None:
    db[str(latest_key() + 1)] = update.message.text 

Этот обработчик получает последний ключ из базы данных, увеличивает его на единицу и создает новую пару ключ — сообщение.

Однако это не может быть выполнено, пока мы не зарегистрируем обработчик. Поэтому добавьте следующую строку после других строк dispatcher.add_handler (...):

dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, log))

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

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

def fetch(update: Update, context: CallbackContext) -> None:
    update.message.reply_text(db.get(str(latest_key()), 'No Messages yet.'))

Мы можем зарегистрировать его вместе с обработчиками остальных команд. Добавьте данную строку после уже существующих строк dispatcher.add_handler (...):

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

Создаем веб-интерфейс

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

from math import ceil
from flask import render_template
from flask import Flask
app = Flask(__name__)

@app.route('/')
@app.route('/<int:page>')
def home(page=None):
    ks = sorted(map(int, db.keys()))
    pages = ceil(len(ks) / 10)
    if page is None: #Default to latest page
        page = pages

    if page < pages:
        next_page = page + 1
    else:
        next_page = None
    if page > 1:
        prev_page = page - 1
    else:
        prev_page = None

    messages = tuple(db[str(key)] for key in ks[(page-1)*10:page*10])

    return render_template('home.html', messages=messages, next_page=next_page, page=page, prev_page=prev_page)

Этот код создает небольшое Flask-приложение. Импорт модуля Flask обеспечивает среда программирования Replit. В этом уроке мы сделаем только одну страницу.

Мы сообщаем Flask, каким образом должна быть доступна страница при помощи специальных декораторов. Декоратор @app.route ('/') говорит, что когда пользователь обращается к https://example.com, его будет обслуживать этот обработчик. В этом случае переменная page будет иметь значение по умолчанию None.

Декоратор @app.route('/<int:page>')  говорит, что когда пользователь обращается к чему-то вроде https://example.com/4, он откроет страницу 4 записанных сообщений. В этом случае переменной page будет присвоено значение 4.

Но пока это работать не будет, потому что шаблон home.html еще не существует. Давайте создадим его прямо сейчас в папке с названием templates (т.е. templates/home.html):

<!doctype html>
<h2>Messages - Page {{ page }}</h2>
<ul>
 {% for msg in messages %}
 <li>{{ msg | escape }}</li>
 {% endfor %}
</ul>

{% if prev_page %}<a href='/{{ prev_page }}'>Previous Page</a>{% endif %}
{% if prev_page and next_page %}|{% endif%}
{% if next_page %}<a href='/{{ next_page }}'>Next Page</a>{% endif %}

Этот шаблон будет выводить страницу записанных сообщений и ссылки на следующую или предыдущую страницу. Он требует наличия переменной page и массива messages, который будет отображаться в виде списка. Шаблон также принимает переменные «prev_page» и «next_page», которые мы используем для создания ссылок на предыдущую и следующую страницу, если они существуют, конечно. Все они присутствуют в нашей функции маршрутизации, когда мы запускаем render_template.

Как нам рассчитать максимальное количество страниц?

pages = ceil(len(ks) / 10)

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

if page is None:
    page = pages

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

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

Собираем все воедино

Если мы запустим нашу программу сейчас, веб-приложение Flask еще не будет работать. Flask должен прослушивать запросы аналогично библиотеке Telegram. Чтобы запустить сервер Flask, мы вполне можем в конце нашей программы использовать app.run() .

Проблема в том, что эта строка кода при нормальных обстоятельствах никогда не будет достигнута, потому что у нас есть строка updater.idle(), блокирующая наш код до нее. Чтобы решить эту проблему, мы можем заменить эту строку строкой, которая запускает наш сервер Flask на первом уровне. Строка updater.idle() у нас присутствовала лишь для того, чтобы предотвратить преждевременное завершение программы. Теперь то же самое будет делать сервер Flask. Итак, давайте произведем замену:

#updater.idle()
app.run(host='0.0.0.0', port=8080)

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

Сделайте все это сами

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

Что дальше?

Попробуйте использовать команду /setcommands в BotFather, чтобы добавить быстрое меню для команд в вашем боте. Здесь описаны все команды по работе с этим ботом.

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

username = update.message.from_user.username

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

Английский для программистов

Наш телеграм канал с тестами по английскому языку для программистов. Английский это часть карьеры программиста. Поэтому полезно заняться им уже сейчас

Скачать ×

Создание бота с помощью Telegram Bot API | Сатиш Манохар Талим

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

Преамбула

Telegram — это приложение для обмена сообщениями, которое очень быстрое, простое, безопасно и бесплатно.

Впервые я установил приложение Telegram на свой телефон Android. Я также установил их родное приложение на рабочий стол Windows 7 Professional.

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

Задача

Создать простого бота (называемого SMTFirstBot ) с использованием их открытого API.

Что такое бот?

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

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

Для этого есть… бот.

Просто поговорите с @BotFather и выполните несколько простых шагов.

Он открыл отдельное окно в моем родном приложении Telegram.

Далее я набрал:

 Вы: /newbot 
BotFather: Хорошо, новый бот. Как мы собираемся называть это? Пожалуйста, выберите имя для вашего бота. Он должен заканчиваться на «бот». Вот так, например: TetrisBot или tetris_bot.
Вы: SMTFirstBot
BotFather: Готово! Поздравляю с новым ботом.Вы найдете его на telegram.me/SMTFirstBot. Теперь вы можете добавить описание, раздел about и изображение профиля для своего бота, смотрите /help для списка команд. Кстати, когда вы закончите создавать своего крутого бота, отправьте запрос в нашу службу поддержки ботов, если вам нужно лучшее имя пользователя для него. Просто убедитесь, что бот полностью работоспособен, прежде чем делать это. Используйте этот токен для доступа к HTTP API:
2764xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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

Изменение описания SMTFirstBot

 Вы: /setdescription 
BotFather: Выберите бота, чтобы изменить описание.
Вы: @SMTFirstBot
BotFather:ОК. Пришлите мне новое описание бота. Люди увидят это описание, когда откроют чат с вашим ботом в блоке под названием «Что может делать этот бот?».
Вы: Это простой и мой первый БОТ.
BotFather: Успех! Описание обновлено.

Изменение раздела «О программе» SMTFirstBot

 Вы: /setabouttext 
BotFather: выберите бота, чтобы изменить раздел «О программе».
Вы: @SMTFirstBot
BotFather: Хорошо. Пришлите мне новый текст «О программе». Люди увидят этот текст на странице профиля бота, и он будет отправлен вместе со ссылкой на вашего бота, когда они поделятся им с кем-то.
Вы: Мой первый Telegram-бот.
BotFather: Успех! Обновлен раздел «О нас».

Изменение фотографии профиля SMTFirstBot

 Вы: /setuserpic 
BotFather: выберите бота, чтобы изменить фотографию профиля.
Вы: @SMTFirstBot
BotFather: Хорошо. Пришлите мне новую фотографию профиля для бота.
Вы: [ Фото ]
BotFather: Успехов! Фото профиля обновлено.

Изменение конфиденциальности SMTFirstBot

 Вы: /setprivacy 
BotFather: Выберите бота для изменения настроек групповых сообщений.
Вы: @SMTFirstBot
BotFather: «Включить» — ваш бот будет получать только сообщения, которые либо начинаются с символа «/», либо упоминают бота по имени пользователя.
«Отключить» — ваш бот будет получать все сообщения, которые люди отправляют в группы.
Текущий статус: ВКЛЮЧЕН
Вы: Отключить
BotFather: Успех! Новый статус: ОТКЛЮЧЕН.

Авторизация вашего бота

Каждому боту при создании присваивается уникальный токен аутентификации. Токен выглядит примерно так: 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11, но они просто используют <токен> в своем руководстве.

Разговор с вашим ботом

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

Выполнение запросов

Все запросы к Telegram Bot API должны обслуживаться через HTTPS и должны быть представлены в следующей форме: https://api.telegram.org/bot<токен>/ИМЯ_МЕТОДА. Например, так:

 https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe 

Они поддерживают методы GET и POST HTTP. Они также поддерживают четыре способа передачи параметров в запросах Bot API:

  • строка запроса URL
  • application/x-www-form-urlencoded
  • application/json (кроме загрузки файлов)
  • multipart/form-data (используйте для загрузки файлов)

Ответ содержит объект JSON, который всегда имеет логическое поле «ok» и может иметь необязательное строковое поле «description» с удобочитаемым описанием результата.Если «ok» равно true, запрос был выполнен успешно, и результат запроса можно найти в поле «result». В случае неудачного запроса «ok» равно false, а ошибка объясняется в «описании». Поле Integer error_code также возвращается, но его содержимое может быть изменено в будущем.

  • Все методы Bot API нечувствительны к регистру.
  • Все запросы должны выполняться с использованием кодировки UTF-8.

Вы можете просмотреть список имен методов в официальной документации API.

метод getMe

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

 https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe 

Ответ, который я получил:

 {"ok":true,"result":{"id":276401636," first_name":"SMTFirst","username":"SMTFirstBot"}} 

метод getUpdates

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

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

 https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getUpdates 

Ответ, который я получил:

 {"ok":true,"result":[{"update_id":839499903, 
"сообщение": {"message_id":12,"от":{"id":246367260,"first_name":"Сатиш","last_name":"Талим","имя пользователя":"IndianGuru"},"чат ":{"id":246367260,"first_name":"Satish","last_name":"Talim","username":"IndianGuru","type":"private"},"date":1473

1,"text ":"Hello SMTFirstBot"}}]}

Как видите, мой chat_id: 246367260

метод sendMessage

Используйте метод sendMessage для отправки текстовых сообщений от бота пользователю, использующему его/ее chat_id.

 https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/sendMessage?chat_id=246367260&text="Привет от SMTFirstBot" 

Ответ, который я получил:

90true36, «ok»: «:{«message_id»:13,»от»:{«id»:276401636,»first_name»:»SMTFirst»,»username»:»SMTFirstBot»},»chat»:{«id»:246367260,»first_name «:»Сатиш»,»last_name»:»Талим»,»имя пользователя»:»IndianGuru»,»тип»:»личное»},»дата»:1473915564,»текст»:»\»Привет от SMTFirstBot\»» }}

Вот код Go , чтобы получить chat_id, а затем отправить сообщение на этот chat_id из MyFirstBot.

Программа myfirstbot.go

myfirstbot.go

Вот и все. Радоваться, веселиться.

Как создать бота Telegram с помощью 10 строк кода | by mbvissers.eth

Использование NodeJS и Telegram API

Фото Кристиана Видигера на Unsplash

Telegram — это приложение для обмена сообщениями, такое как WhatsApp или Facebook messenger. Он имеет больше функций, таких как боты, которые не так просто создать в других приложениях для обмена сообщениями. Это может быть отличной платформой для определенных сообществ.

Эти боты могут быть созданы с помощью JavaScript в Node и могут иметь широкий спектр функций, от создания опросов до отслеживания рейдов Pokémon Go. Сегодня мы собираемся научиться создавать несколько основных ботов Telegram.

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

Регистрация бота

Вы можете отправить BotFather сообщение «/newbot», и бот BotFather проведет вас через простой процесс.Вы получите токен HTTP API, который сможете сохранить в безопасном месте. Это будет использоваться для подключения бота к API.

Чтобы создать нового бота, нам сначала нужно инициализировать NPM или Yarn и установить пакет node-telegram-bot-api. Мы можем сделать это, выполнив обе эти команды в терминале:

 npm init -y 
npm i node-telegram-bot-api

Затем мы можем создать наш index.js , в котором мы будем кодировать нашего бота Telegram . Мы можем запустить проект, используя индекс узла .js в терминале.

Наш базовый бот, состоящий всего из десяти строк кода, сначала инициализирует самого бота, импортируя соответствующий пакет и настраивая бота с помощью ключа API. Функция bot.onText будет читать все отправленные ей сообщения, начинающиеся с /print , и повторять найденный текст после команды.

Наша команда печати в действии

Вы всегда можете изменить нужную команду, так как она просто использует обычную строку REGEX. Вы также можете ответить на любое сообщение, которое следует за данным REGEX, с помощью бота .on('сообщение') . Подробнее об API бота можно прочитать в документации Telegram.

Еще одна известная функция — настройка опроса. В Telegram это очень легко сделать с помощью функции bot.sendPoll() , которая принимает chatId , строку и массив опций в качестве параметров.

Опрос в действии

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

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

Спасибо за внимание и хорошего дня.

Подробнее у М. Виссерса:

Часть 1. Как создать Telegram Bot на Python менее чем за 10 минут

В этом коротком руководстве я покажу вам, как создать собственного бота Telegram на Python с нуля.

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

Шаг 1. Настройте профиль своего бота

Чтобы создать нового бота, начните диалог с BotFather (@BotFather).
BotFather поможет нам в создании нового бота.

  • Ищите @botfather в Telegram.

  • Начните разговор, нажав кнопку «Старт».

  • Создайте бота, выполнив команду /newbot

  • Введите отображаемое имя и имя пользователя для бота.

  • BotFather отправит вам сообщение с токеном

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ — Надежно храните токен доступа бота. Любой, у кого есть ваш токен, может манипулировать этим ботом.

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

Откройте терминал и сначала создайте новый каталог.

  mkdir эхо-бот/
cd эхо-бот/
  

Мы будем использовать виртуальную среду pipenv. Убедитесь, что в вашей системе установлен pipenv.

Pipenv — это менеджер зависимостей для проектов Python.

Мы будем использовать пакет python-telegram-bot для взаимодействия с Telegram API. Установите пакет с помощью следующей команды.

  pipenv установить python-telegram-bot
  

Создайте новый файл bot.py и вставьте в него следующий код.

  #!/usr/bin/env Python
# -*- кодировка: utf-8 -*-
# Эта программа является общественным достоянием под лицензией CC0.

"""
Простой бот для ответа на сообщения Telegram.

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

Использование:
Базовый пример Echobot, повторяет сообщения.
Нажмите Ctrl-C в командной строке или отправьте сигнал процессу, чтобы остановить
бот."""

журнал импорта

из telegram.ext импортировать Updater, CommandHandler, MessageHandler, фильтры

# Включить ведение журнала
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                    уровень = ведение журнала.ИНФО)

logger = logging.getLogger(__name__)


# Определите несколько обработчиков команд. Обычно они принимают два аргумента update и
# контекст. Обработчики ошибок также получают поднятый объект TelegramError по ошибке.
def start (обновление, контекст):
    """Отправить сообщение при вводе команды /start."""
    update.message.reply_text('Привет!')


def help(обновление, контекст):
    """Отправить сообщение при вводе команды /help."""
    update.message.reply_text('Помогите!')


def эхо (обновление, контекст):
    """Эхо сообщения пользователя."""
    update.message.reply_text(обновление.message.text)


ошибка определения (обновление, контекст):
    """Журнал ошибок, вызванных обновлениями."""
    logger.warning('Обновление "%s" вызвало ошибку "%s"', update, context.error)


деф основной():
    """Запустить бота."""
    # Создайте средство обновления и передайте ему токен вашего бота.# Обязательно установите use_context=True, чтобы использовать новые обратные вызовы на основе контекста
    # Пост версии 12 в этом уже не будет необходимости
    updater = Updater("TOKEN", use_context=True)

    # Заставить диспетчер зарегистрировать обработчики
    дп = updater.dispatcher

    # по разным командам - ​​ответ в Telegram
    dp.add_handler(CommandHandler("старт", старт))
    dp.add_handler(CommandHandler("помощь", помощь))

    # в некомандном т.е. сообщении - эхо сообщения в Telegram
    dp.add_handler (MessageHandler (Фильтры.текст, эхо))

    # регистрируем все ошибки
    dp.add_error_handler (ошибка)

    # Запускаем бота
    updater.start_polling()

    # Запускаем бота, пока не нажмем Ctrl-C или процесс не получит SIGINT,
    # SIGTERM или SIGABRT. Это следует использовать в большинстве случаев, так как
    # start_polling() не блокирует и изящно остановит бота.
    updater.idle()


если __name__ == '__main__':
    главный()
  

Замените «TOKEN» в строке 56 на токен, полученный ранее от BotFather.

Этот код использует метод опроса для проверки сообщений и будет отвечать на каждое полученное сообщение одним и тем же сообщением.Подробнее о том, как работает python-telegram-bot, можно прочитать здесь — Кодирование вашего первого бота

Запустить бота с помощью

  pipenv запустить python bot.py
  

Вуаля! Готово 😄

Бьюсь об заклад, это заняло бы у вас менее 10 минут, чтобы начать работу с вашим первым ботом.

Увидеть 🤖 в действии

Поиграй с ботом здесь — EchoBot

Надеюсь, вам понравилась статья. Есть идеи по созданию ботов, которыми можно поделиться? Комментарий ниже!

Проверьте других моих ботов в действии:

  • BookQuoteBot 📚: прочитайте лучшие цитаты из известных книг.
  • SplitwizeBot: использует API Splitwise для перечисления, создания и расчета расходов в Telegram.

Часть 2. БЕСПЛАТНОЕ развертывание бота Telegram на Heroku

Как создать телеграмм бота в GOLANG | Автор: Реза Фаттахи

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

В этой статье мы узнаем, как создать телеграмм-бота на golang.

  • Учетная запись Telegram : Вам нужна учетная запись Telegram для создания бота с помощью botfather (описано позже).
  • модуль телего : Telego — это новая библиотека для создания приложений для телеграмм в golang.

Чтобы установить telegot, вам необходимо установить его в свою $GOPATH с помощью команды go get . Просто введите в своем терминале следующее, чтобы установить его:

 go get -u github.com/SakoDroid/telego 

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

Сначала вам нужно создать нового бота с помощью bofather.Шаги ниже покажут вам, как это сделать:

  1. Запустите бота botfather.
  2. Отправьте команду /newbot botfather.
  3. Выберите уникальное имя для своего бота.
  4. Если все в порядке, вы получите сообщение от botfather, как на картинке ниже. Он содержит токен , который мы будем использовать позже, поэтому запишите токен где-нибудь.

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

Чтобы написать код для бота на golang, мы будем использовать библиотеку telego , как упоминалось ранее.

Мы рассмотрим этот раздел шаг за шагом:

шаг 1: импорт библиотек . Просто импортируйте следующие библиотеки:

 package main 

import (
bt "github.com/SakoDroid/telego"
cfg "github.com/SakoDroid/telego/configs"
objs "github.com/SakoDroid/telego/objects"
)

Шаг 2: Создание конфигов бота. Конфиги бота — это структура, в которой есть несколько полей для настройки действий бота. Эти конфигурации находятся в пакете configs , который импортируется как cfg .Этот пакет имеет некоторые значения по умолчанию, если вы не хотите возиться с конфигами. В конфигурациях бота есть поле с именем UpdateConfigs , в котором есть конфигурации, связанные с запросом и получением обновлений с сервера API. Теперь давайте посмотрим на код:

 package mainimport ( 
bt "github.com/SakoDroid/telego"
cfg "github.com/SakoDroid/telego/configs"
objs "github.com/SakoDroid/telego/objects" "
)//Этот токен вы получаете от бота-отца
const token string = "5078468473:AAHLCQfMnJTIFM25rFlbU2k5432kYD46dhs"//Экземпляр бота
var bot *bt.Botfunc main() { //Обновить конфиги
up := cfg.DefaultUpdateConfigs()

//Конфиги бота
cf := cfg.BotConfigs{
BotAPI: cfg.DefaultBotAPI,
APIKey: token, UpdateConfigs: up,
Webhook: false,
LogFileAddress: cfg.DefaultLogFile
}

}

О полях BoConfigs:

1. APIKey: Это токен, который вы получили от botfather при создании бота.

2. BotAPI: Это адрес сервера API бота.Если вы не используете локальный сервер API, используйте константу cfg.DefaultBotApi для этого поля.

3. UpdateConfigs: Это настройки, связанные с обновлением, такие как частота обновления (по умолчанию: 300 миллисекунд). Вы можете использовать метод cfg.DefaultUpdateConfigs() для этого поля.

3. Веб-перехватчик: Передайте значение true, если хотите использовать веб-перехватчик для получения обновлений. (В настоящее время Telego не поддерживает веб-перехватчик).

4. LogFileAddress: Логи бота будут сохраняться в этом файле.

Шаг 3: Создание экземпляра бота. Теперь, когда мы создали конфиги, пришло время создать бота. Просто передайте созданные вами конфиги методу NewBot пакета telego (импортируется как bt ). После того, как вы создали бота. вам нужно вызвать Run() , чтобы бот запустился и начал получать обновления с сервера API.

 пакет mainimport ( 
"fmt"

bt "github.com/SakoDroid/telego"
cfg "github.com/SakoDroid/telego/configs"
objs "github.com/SakoDroid/telego/objects"
)

const token string = "5078468473:AAHLCQfMnJTIFM25rFlbU2k5432kYD46dhs"//Экземпляр бота.
var main bot *btfunc. ) { up := cfg.DefaultUpdateConfigs()

cf := cfg.BotConfigs{
BotAPI: cfg.DefaultBotAPI,
APIKey: токен, UpdateConfigs: up,
Webhook: false,
LogFileAddress: cfg.DefaultLogFile
}

var err error

//Создание бота с использованием созданных конфигов
бота, err=bt.NewBot(&cf)

if err == nil {

//Запускаем бота.
err = bot.Run()

if err == nil{
start()
}else {
fmt.Println(err)
}
} else {
fmt.Println(err)
}

3

} func start(){
//Описано в следующих разделах
}

Шаг 4: Получение обновлений и взаимодействие с клиентами. Telego предлагает два способа обработки полученных обновлений с сервера API:

  1. Обработчики
  2. Go-каналы
  3. Обработчики: Обработчики могут использоваться для текстовых сообщений и запросов обратного вызова (тип встроенных кнопок клавиатуры).Вы указываете шаблон регулярного выражения, типы чата и функцию. Каждый раз, когда приходит текстовое сообщение от указанных типов чата, функция будет вызываться с переданным в нее обновлением. Типы чата могут быть «приватный», «групповой», «супергрупповой», «канал» и «все». Вы можете указать несколько типов чата. Давайте добавим обработчик для текстового сообщения «/ start» и ответа «Привет, я телеграмм-бот!» :
 пакет mainimport ( 
"fmt"

bt "github.com/SakoDroid/telego"
cfg "github.com/SakoDroid/telego/configs"
objs "github.com/SakoDroid/telego/objects"
)

const token string = "5078468473:AAHLCQfMnJTIFM25rFlbU2k5432kYD46dhs"//Экземпляр бота.
var bot *bt.Botfunc main() { up := cfg.DefaultUpdate0s() c f 90 = cfg.BotConfigs{
BotAPI: cfg.DefaultBotAPI,
APIKey: token, UpdateConfigs: up,
Webhook: false,
LogFileAddress: cfg.DefaultLogFile
}

var err error

// Создание бота
бот, err = bt.NewBot(&cf)

если err == nil {
err = бот.Run()
if err == nil{
start()
}else {
fmt.Println(err)
}
} else {
fmt.Println(err)
}

}

func start(){
bot.AddHandler("/start", func(u *objs.Update) {

//Отправляет сообщение в чат, из которого было получено сообщение. Сообщение будет ответом на полученное сообщение.
_,err := bot.SendMessage(u.Message.Chat.Id,"привет, я телеграмм бот!","",u.Message.MessageId,false,false)
if err != nil{
fmt.Println( err)
}

}, "private", "group")
}

Так как мы передали «private» и «group» методу AddHandler , этот обработчик будет работать, только если получено сообщение от приватный чат или групповой чат.

2. Каналы Go: В Telego вы можете зарегистрировать каналы для определенных чатов и типов обновлений. Тип обновления — это файл, который содержит обновление. Он может содержать сообщение, edited_message, inline_query и т.д. Вы можете зарегистрировать канал, который будет обновляться, когда обновление содержит указанное поле. Вы также можете указать чат, то есть канал будет обновляться, когда он из этого чата. Эти два параметра можно комбинировать вместе для создания каналов, которые будут посвящены определенному типу обновлений в указанном чате.

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

 пакет mainimport ( 
"fmt"

bt "github.com/SakoDroid/telego"
cfg "github.com/SakoDroid/telego/configs"
objs "github.com/SakoDroid/telego/objects" "
)

const token string = "5078468473:AAHLCQfMnJTIFM25rFlbU2k5432kYD46dhs"//Экземпляр бота.
var bot *bt.Botfunc main() { up := cfg.DefaultUpdateConfigs()

cf := cfg.BotConfigs{
BotAPI: cfg.DefaultBotAPI,
APIKey: токен, UpdateConfigs: up,
Webhook: false,
LogFileAddress : cfg.DefaultLogFile
}

var err error

//Создание бота с использованием созданных конфигов
бота, err = bt.NewBot(&cf)

if err == nil {

err() = bot.Run

if err == nil{
start()
}else {
fmt.Println(err)
}
} else {
fmt.Println(err)
}

}

func start(){ //Зарегистрировать канал
messageChannel, _ := bot.AdvancedMode().RegisterChannel("", "message")

for {

//Ждать update
up := <- *messageChannel

//Распечатать текст
fmt.Println(up.Message.Text)
}
}

Этот код будет получать обновления через messageChannel и печатать текст.

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

У Telego есть множество способов отправки обратно текста, фото, видео, наклеек и т. д.Все они начинаются с Send , например SendMessage для отправки текстового сообщения или SendPhoto для отправки фотографии.

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

  1. Используя идентификатор файла, который уже хранится на серверах телеграмм.
  2. Использование URL-адреса HTTP.
  3. Использование файла на вашем компьютере.

MediaSender охватывает все эти три способа. Он имеет два метода: SendByFileIdOrUrl и SendByFile.

SendByFileIdOrUrl примет строку, которая является либо идентификатором файла, либо URL-адресом. SendByFile берет файл и загружает его на серверы телеграмм.

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

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

Теперь давайте создадим код, который будет отправлять два изображения каждый раз, когда получено текстовое сообщение «pic». Один из них — URL-адрес HTTP, а другой — файл, хранящийся на компьютере, на котором работает бот. В этом случае мы будем использовать обработчики (остальные части кода показаны выше и здесь удалены):

 func start(){ 
bot.AddHandler("pic", func(u *objs.Update) {

// ChatId этого чата
chatId := u.Message.Chat.Id

//Получено сообщение, если. Мы будем использовать его идентификатор, чтобы ответить на него
messageId := u.Message.MessageId //Создать медиа отправителя для отправки URL
mediaSender1 := bot.SendPhoto(chatId,messageId,"это заголовок","") //Отправить URL
_,err := mediaSender1.SendByFileIdOrUrl("http://example.com/funny_cat.jpg",false,false)
if err2 != nil{
fmt.Println(err)
} / /Создать медиа-отправитель для отправки файла
mediaSender2 := bot.SendPhoto(chatId,messageId,"это подпись","") //Открываем файл.ошибка игнорируется для упрощения файла кода
,_ := os.Open("funny_cat.jpg")//Отправить файл
_,err = mediaSender2.SendByFile(file,false,false) if err != nil{
fmt.Println(err)
}

}, "private")
}

Вот и все, вы только что отправили две фотографии!

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

Telegram предлагает два типа клавиатур:

  1. Пользовательские клавиатуры: эта клавиатура будет отображаться для пользователей вместо буквенной клавиатуры.(Вы можете переключаться между ними)
  2. Встроенные клавиатуры: Эта клавиатура будет отображаться под сообщением, с которым она была отправлена.

У Telego есть инструмент для создания обеих клавиатур, и им очень легко пользоваться. Для создания пользовательской клавиатуры вам нужно вызвать метод CreateKeyboard , а для создания встроенной клавиатуры вы можете вызвать метод CreateInlineKeyboard . Эти методы вернут указатель клавиатуры, который имеет несколько методов для добавления к ним кнопок. После того, как вы завершили клавиатуру, вы можете отправить их пользователю (пользователям) вместе с сообщением.Для их отправки просто передайте аргумент клавиатуры для клавиатуры методов Отправить продвинутого бота.

Мы рассмотрим их оба с примерами кодов.

Пользовательские клавиатуры

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

 func start(){ 
bot.AddHandler("/start", func(u *objs.Update) {

//Создаем пользовательскую клавиатуру
kb := bot.CreateKeyboard(false, false, false, "type...")

//Добавляем к ней кнопки.Первый аргумент — это текст кнопки, а второй — номер строки, в которую будет добавлена ​​кнопка. kb.AddButton("button1", 1) kb.AddButton("button2", 1)kb.AddButton("button3", 2)

//Передать клавиатуру методу отправки
_, err := bot.AdvancedMode( ).ASendMessage(u.Message.Chat.Id, "и вам привет, отправьте мне адрес", "", u.Message.MessageId, false,false, nil, false, false, kb)

if err != nil { fmt.Println(err) } }, "private","group")
}

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

Встроенные клавиатуры

Встроенные клавиатуры имеют несколько типов кнопок. У Telego есть методы добавления всех этих кнопок. Методы полностью задокументированы в исходном коде. Теперь давайте создадим встроенную клавиатуру:

 func start(){ bot.AddHandler("/start", func(u *objs.Update) { // Создает встроенную клавиатуру 
kb := bot.CreateInlineKeyboard() // Добавляет кнопка URL-адреса, при нажатии этой кнопки URL-адрес будет открыт.
kb.AddURLButton("url", "https://google.com", 1) //Добавляет кнопку, которая будет отправлять боту запрос обратного вызова, содержащий данные, которые мы передаем этой функции, при ее нажатии.
kb.AddCallbackButton("обратный вызов без обработчика", "данные обратного вызова 1", 2) //Добавляет кнопку, которая будет отправлять боту запрос обратного вызова, содержащий данные, которые мы даем этой функции, при ее нажатии. Отличие этого метода от последнего заключается в том, что этот метод добавляет обработчик обратного вызова этой кнопки.
kb.AddCallbackButtonHandler("вызов с обработчиком", "данные обратного вызова 2", 3, func(u *objs.Update) { _, err3 := bot.AdvancedMode().AAnswerCallbackQuery(u.CallbackQuery.Id, "обратный вызов получен ", true, "", 0) if err3 != nil { fmt.Println(err3) } }) // Передаем клавиатуру методу отправки
_, err := bot.AdvancedMode().ASendMessage(u.Message .Chat.Id, "и вам привет, отправьте мне адрес", "", u.Message.MessageId, false,false, nil, false, false, kb) if err != nil { fmt.Println(err) } }, "private","group")
}

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

Создать Telegram Bot — Code Capsules

В этом руководстве используется Python. Вы можете найти версию NodeJS здесь.

В предыдущем руководстве мы создали и разместили API в Code Capsules.В этом руководстве мы создадим клиент для этого API в виде бота Telegram. Это позволит нам получать данные о температуре, погоде и обменном курсе на ходу, отправляя сообщения нашему боту в приложении Telegram.

Мы также узнаем, как разместить этого бота в Code Capsules, чтобы его могли использовать другие. Попутно мы изучим некоторые ключевые концепции безопасного и эффективного размещения ботов.

Начнем!

Требования

Для создания Telegram-бота нам понадобится:

О ботах Telegram

Боты Telegram отображаются как контакты в интерфейсе Telegram.Пользователи взаимодействуют с ботами Telegram, отправляя им сообщения с командами — это слова, которым предшествует косая черта, например. /погода или /валюта . Команды, отправленные на учетную запись бота в Telegram, будут переданы в бэкэнд-код бота (в нашем случае это будет код, который мы размещаем на Code Capsules).

Например, когда мы отправим команду /weather нашему боту позже в этой статье, бот ответит данными о погоде из нашего личного API.

Давайте создадим Telegram-бота.

Регистрация учетной записи бота и общение с BotFather

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

Если у вас есть учетная запись Telegram, вы можете зарегистрировать нового бота, отправив сообщение BotFather, боту, которым управляет сама Telegram. Найдите «BotFather» и начните чат. В интерфейсе чата выполните следующие действия:

  1. Нажать «старт».
  2. Тип /newbot .
  3. Выберите имя для своего бота.
  4. Выберите имя пользователя для своего бота (должно заканчиваться на «bot»).

После выбора имени пользователя BotFather отправит в ответ токен авторизации . Это строка, которая позволяет вашему боту отправлять запросы к Telegram Bot API, аналогично токенам авторизации, которые мы использовали для получения данных о погоде и обменном курсе в личном руководстве по API. Обязательно сохраните этот токен в безопасном и уединенном месте.

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

Планирование и настройка

Мы собираемся реализовать две команды для нашего бота.

  • Когда мы отправим команду /weather , наш бот ответит данными о погоде из созданного нами API.
  • Когда мы отправим команду /currency , наш бот ответит обменными курсами из долларов США в канадские доллары, евро и ZAR.

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

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

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

  • Linux/MacOSX : источник env/bin/активировать
  • Windows : env\Scripts\активировать.летучая мышь

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

Для взаимодействия с Telegram Bot API нам необходимо установить библиотеку python-telegram-bot, оболочку Python для Telegram Bot API. Мы также будем использовать библиотеку Python запросов для получения данных из API погоды и курса валют. Чтобы установить эти требования, введите в своем терминале следующее:

  pip устанавливает запросы python-telegram-bot
  

Получение данных из API

Теперь мы можем начать программировать.Создайте файл с именем bot.py в том же каталоге, где мы активировали виртуальную среду. В этом файле введите следующий код, заменив YOUR-URL-HERE URL-адресом, указывающим на API погоды и обменного курса, размещенный в Code Capsules.

  запросы на импорт

url = 'ВАШ-URL-ЗДЕСЬ/ПОЛУЧИТЬ'
data = request.get(url) # запрашивает данные из API
data = data.json() # преобразует возвращаемые данные в json

# Получить значения из API
curr_temp = данные['curr_temp']
cad_rate = данные['USD_rates']['CAD']
eur_rate = данные['usd_rates']['EUR']
zar_rate = данные['usd_rates']['ZAR']


защита return_weather():
    print('Здравствуйте.Текущая температура в Кейптауне: '+str(curr_temp)+" по Цельсию.")


деф return_rates():
    print("Здравствуйте. На сегодняшний день курсы конвертации долларов США следующие: USD->CAD = "+str(cad_rate)+
    ", USD->EUR = "+str(eur_rate)+", USD->ZAR = "+str(zar_rate))


return_weather()

return_rates()
  

Здесь мы запрашиваем данные о валюте и погоде из API и анализируем температуру и курсы конвертации. Затем мы распечатываем данные, используя return_weather() и return_rates() .

Попробуйте! Запустите программу, чтобы убедиться, что все работает, затем продолжите.

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

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

  из telegram.ext import Updater, CommandHandler
  

Из библиотеки python-telegram-bot импортируем два класса: Updater и CommandHandler . Мы скоро поговорим об этих классах.

Нам больше не нужно печатать наши данные — вместо этого мы вернем строку нашему боту, чтобы бот мог отобразить ее в Telegram.Замените def return_weather() и def return_rates() следующим:

  по определению return_weather():
    вернуться 'Здравствуйте. Текущая температура в Кейптауне: '+str(curr_temp)+" по Цельсию."


деф return_rates():
    return "Здравствуйте. На сегодняшний день курсы конвертации долларов США следующие: USD->CAD = "+str(cad_rate)+", USD->EUR = "+str(eur_rate)+", USD->ZAR = "+str( зар_рейт)
  

Теперь замените вызовы функций return_weather() и return_rates() кодом ниже:

  по умолчанию main():
    ТОКЕН = "ВАШ-БОТ-ТОКЕН-ЗДЕСЬ"
    updater = Updater (токен = ТОКЕН, use_context = True)
    диспетчер = обновитель.диспетчер

    weather_handler = CommandHandler("погода", погода)
    currency_handler = CommandHandler("валюта", валюта)
    start_handler = CommandHandler("старт", старт)

    диспетчер .add_handler (обработчик погоды)
    диспетчер.добавить_обработчик(currency_handler)
    диспетчер .add_handler (start_handler)

    updater.start_polling()

если __name__ == '__main__':
    главный()
  

В верхней части нашего нового основного метода , который будет вызываться при запуске этого файла, мы создаем экземпляр updater , экземпляр класса Updater библиотеки Telegram.Этот объект будет извлекать команды, отправленные нашему боту, и передавать их экземпляру класса Dispatcher . Мы назначили этот экземпляр диспетчера переменной диспетчера для дальнейшего использования.

Затем мы создаем три разных класса CommandHandler , по одному для каждой команды, которую можно отправить нашему боту: /start , /weather и /currency . В каждый экземпляр мы передаем два аргумента: текст команды (без предшествующих /) и вызываемую функцию.Например, когда пользователь вводит команду /weather , будет вызвана функция weather() .

Давайте определим эту функцию и две другие. Чуть выше def main() введите следующие три определения функций.

  по определению погоды (обновление, контекст):
    context.bot.send_message(chat_id=update.efficient_chat.id, text=return_weather())

деф валюта (обновление, контекст):
    context.bot.send_message(chat_id=update.efficient_chat.id, text=return_rates())

def start (обновление, контекст):
    контекст.bot.send_message(chat_id=update.efficient_chat.id, text="Привет! Я отвечаю на /weather и /currency. Попробуйте!")
  

Каждая из этих функций вызывает функцию python-telegram-bot send_message() с идентификатором текущего чата и соответствующим текстом, либо возвращаемым из одной из наших других функций, либо указанным в виде строки. Аргументы update и context предоставляются диспетчером автоматически.

В нашей функции main() мы используем диспетчеризацию .add_handler , чтобы добавить все три обработчика в наш диспетчер.

Наконец, updater.start_polling() начнет опрос для получения обновлений от Telegram. Это означает, что наш код будет регулярно спрашивать серверы Telegram, были ли ему отправлены какие-либо команды. При получении команды будет вызван соответствующий обработчик. В следующем разделе мы обсудим подводные камни опроса и рассмотрим альтернативу.

Файл кода bot.py теперь должен выглядеть так, как показано ниже.Еще раз обязательно замените YOUR-URL-HERE URL-адресом API, который вы создали в руководстве по API.

  из telegram.ext import Updater, CommandHandler
запросы на импорт


url = 'ВАШ-URL-ЗДЕСЬ/ПОЛУЧИТЬ'
data = request.get(url) # запрашивает данные из API
data = data.json() # преобразует возвращаемые данные в json

# Получить значения из API
curr_temp = данные['curr_temp']
cad_rate = данные['USD_rates']['CAD']
eur_rate = данные['usd_rates']['EUR']
zar_rate = данные['usd_rates']['ZAR']


защита return_weather():
    возвращение'Здравствуйте.Текущая температура в Кейптауне: '+str(curr_temp)+" по Цельсию."

деф return_rates():
    return "Здравствуйте. На сегодняшний день курсы конвертации долларов США следующие: USD->CAD = "+str(cad_rate)+ ", USD->EUR = "+str(eur_rate)+", USD->ZAR = "+str( зар_рейт)

Def погода (обновление, контекст):
    context.bot.send_message(chat_id=update.efficient_chat.id, text=return_weather())

деф валюта (обновление, контекст):
    context.bot.send_message(chat_id=update.efficient_chat.id, text=return_rates())

def start (обновление, контекст):
    контекст.bot.send_message(chat_id=update.efficient_chat.id, text='Привет! Я отвечаю на /weather и /currency. Попробуйте это!')

деф основной():
    ТОКЕН = "ВАШ-БОТ-ТОКЕН-ЗДЕСЬ"
    updater = Updater (токен = ТОКЕН, use_context = True)
    диспетчер = updater.dispatcher

    Weather_handler = CommandHandler('погода', погода)
    currency_handler = CommandHandler('валюта',валюта)
    start_handler = CommandHandler('старт',старт)

    диспетчер .add_handler (обработчик погоды)
    диспетчер.добавить_обработчик(currency_handler)
    диспетчер.add_handler (начальный_обработчик)

    updater.start_polling()

если __name__ == '__main__':
    главный()
  

Ниже приведен разговор с ботом, созданным с помощью этой программы. Запустите bot.py и попробуйте сами.

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

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

Опрос против веб-перехватчиков

Наш файл bot.py может получать команды, отправленные ему в Telegram, двумя способами. В настоящее время код постоянно опрашивает Telegram, независимо от того, используется ли бот. Если бы мы разместили эту текущую версию на Code Capsules, мы бы потратили впустую пропускную способность, поскольку подавляющее большинство опросов ничего не дали бы.

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

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

Создание веб-перехватчика

Чтобы настроить веб-перехватчик, замените строку updater.start_polling() в основной функции кодом ниже:

  ПОРТ = int(os.environ.get('ПОРТ', '443'))
    HOOK_URL = 'ВАШ-КОДЕКАПСУЛ-URL-ЗДЕСЬ' + '/' + ТОКЕН
    обновление.start_webhook(listen='0.0.0.0', port=PORT, url_path=TOKEN, webhook_url=HOOK_URL)
    updater.idle()
  

Здесь мы запускаем веб-перехватчик, который будет прослушивать наш URL-адрес Code Capsules через TCP-порт 443 и путь к нашему токену. Таким образом, Telegram будет ретранслировать команды, отправленные нашему боту, на следующий URL:

.
  https://YOUR-CODECAPSULES-SUBDOMAIN.codecapsules.io:443/TOKEN
  

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

Подготовка к развертыванию

Прежде чем отправить наш код на GitHub и развернуть его на Code Capsules, нам нужно внести одно небольшое изменение в код и создать несколько файлов.

Создание переменной среды ключа API

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

Заменить эту строку

  ТОКЕН = "ВАШ-БОТ-ТОКЕН-ЗДЕСЬ"
  

с ниже

  ТОКЕН = os.getenv('BOTAPIKEY')
  

os.getenv('BOTAPIKEY') будет искать переменную среды с именем «BOTAPIKEY». Когда мы размещаем нашего бота в Code Capsules, мы устанавливаем для этой переменной среды ключ, который мы получили от BotFather.

Теперь мы должны создать несколько файлов, прежде чем мы сможем отправить наш код на GitHub и развернуть его на Code Capsules.

Создание файла Procfile и требования.txt

Code Capsules требует пару файлов для развертывания нашего приложения: Procfile и requirements.txt . Первый сообщает Code Capsules, как запускать наше приложение, а второй сообщает ему, какие библиотеки ему нужно установить.

Для создания Procfile :

  1. Перейдите в каталог, содержащий файл bot.py , и войдите в виртуальную среду.
  2. Создайте файл с именем Procfile (без расширения файла).
  3. Откройте Procfile , введите web: python3 bot.py и сохраните файл.

В том же каталоге откройте терминал и активируйте виртуальную среду. Затем введите pip3 freeze > requirements.txt , чтобы создать список требований для нашего сервера Code Capsules.

Теперь мы можем отправить наш код на GitHub. Создайте репозиторий GitHub и отправьте в репозиторий файлы requirements.txt , Procfile и bot.py .

Развертывание бота для кодирования капсул

Со всеми файлами, отправленными на GitHub, давайте развернем бота в Code Capsules:

  1. Войдите в Code Capsules и при необходимости создайте команду и пространство.
  2. Связать кодовые капсулы с ранее созданным репозиторием GitHub.
  3. Введите место для кодовых капсул.
  4. Создайте новую капсулу, выбрав тип капсулы «Backend».
  5. Выберите репозиторий GitHub, содержащий бота — оставьте поле «Подпуть репо» пустым и нажмите «Далее».
  6. Оставьте поле «Выполнить команду» пустым и нажмите «Создать капсулу».

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

  1. Перейдите к своей капсуле.
  2. Перейдите на вкладку «Конфигурация».
  3. Добавьте переменную среды с именем «BOTAPIKEY» и присвойте ей ключ API вашего бота в качестве значения. Обязательно нажмите кнопку «Обновить капсулу» после добавления переменной.

Теперь давайте добавим нашему веб-перехватчику правильный домен.

  1. Перейдите на вкладку «Обзор».
  2. Скопируйте домен, найденный в разделе «Домены».
  3. Откройте файл bot.py и найдите строку HOOK_URL = 'YOUR-CODECAPSULES-URL-HERE' + '/' + TOKEN .
  4. Замените «YOUR-CODECAPSULES_URL» только что скопированным доменом.
  5. Зафиксируйте и отправьте эти изменения на GitHub.

После внесения этих изменений Capsule перестроится.Как только это будет сделано, бот готов. Попробуйте!

Дополнительное чтение

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

Если вам интересно узнать больше о том, что вы можете делать с ботами Telegram, ознакомьтесь с вводной информацией для разработчиков ботов Telegram. Если у вас есть какие-то идеи, но вам требуется более глубокое понимание библиотеки python-telegram-bot , просмотрите их репозиторий GitHub.

Подробное описание веб-перехватчиков можно найти в этом сообщении блога.

Была ли эта страница полезной? Эта страница была полезна Эту страницу можно улучшить

Спасибо за ваш отзыв!

Спасибо за ваш отзыв! Мы сделаем все возможное, чтобы улучшить.

TradingBot series — создайте Telegram-канал для своего бота | Мэтт Госден

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

Telegram — это кроссплатформенный сервис обмена сообщениями с шифрованием и хорошим API.Это позволяет вам настроить канал для вашего бота, который вы можете использовать для общения с ним, или он может публиковать сообщения об обновлениях для вас.

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

Публикация сообщения при запуске сделки.

Предоставление последних позиций по запросу.

Предоставление последних показателей и состояния по запросу.

Изменение того, какие активы торгуются в реальном времени, а какие — на бумаге.

Возможно также размещение сделок вручную

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

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

Затем мы создадим бота-слушателя, который будет отвечать на команды, которые мы даем боту через Telegram.

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

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

Это даст вам бота Telegram и токены

Python имеет хорошую библиотеку API Telegram, которую легко использовать.

В виртуальной среде:

 pip install python-telegram-bot 

В коде проекта создайте новый модуль или файл для хранения кода Telegram.

 import telegramTOKEN = 'token_from_botfather_for_your_bot'CHAT_IDS = ['your_chat_id', ] 

Получение CHAT_IDS для себя или соавтора — непростая задача, но в этом руководстве показано, как это сделать с помощью метода getUpdates. Может быть, есть более простой способ.

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

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

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

 # telegram_bot.pyimport Telegramtoken = 'your_bot_token' 
chat_ids = ['your_chat_id',] def post_message (сообщение):
"" "
Сообщения сообщения о телеграмме Bot Chats
: PARAM ул. message: Строковое сообщение
:return : None
"""
try:
bot = telegram.Bot(token=TOKEN)
для id в CHAT_IDS:
sage_send.send
кроме:
... ошибка обработки ...
return

Всякий раз, когда какой-либо из наших торговых ботов получает торговый сигнал, который мы хотим отправить боту Telegram в режиме реального времени, мы импортируем и используем метод post_message:

 from telegram_bot import post_message...post_message('I нашел отличный трейд!подробнее... бла-бла') 

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

Как Telegram обрабатывает команды

  1. Вы отправляете команду своему боту Telegram с помощью команды в приложении Telegram, такой как /help или /trade buy XBT 3.0
  2. Ваш модуль слушателя Python (используя библиотека телеграмм python) видит, что эта команда была отправлена ​​​​через API, анализирует ее и затем реагирует соответствующим образом.

Создание прослушивателя

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

 #telegram_listener.pyfrom telegram.ext import Updater, CommandHandler, MessageHandler, FiltersCHAT_IDS = [ ... ]... 
[функции для выполнения действий добавлены сюда или импортированы]
...def main(): # Создайте объект обновления, используя токен вашего бота help", help)) # в /trade вызываем торговую функцию, но только для пользователей CHAT_ID
dp.add_handler(CommandHandler("trade", trade,
filter=Filters.chat(CHAT_IDS))) # логировать ошибки
dp.add_error_handler(error) # Запустить бота
updater.start_polling()
updater.idle()if __name__ = = '__main__':
main()

Вы можете добавить несколько add_handler для работы с разными командами.

Параметр filter=Filters.chat() позволяет защитить вашего бота, чтобы он отвечал только тем людям, чей CHAT_ID находится в списке.

Простая функция справки

Это пример функции справки , которая вызывается обработчиком, когда пользователь публикует /help в боте Telegram. Это просто возвращает экран справки, объясняющий, что делают разные команды.

 #telegram_listener.py 
...def help(bot, update):
"""Отправить сообщение при вводе команды /help."

update.message.reply_text(
'Попробуйте эти команды:\n' +
'/ticker [пара] - получить последний тикер\n' +
'/balance [валюта] - получить последний баланс\n' +
'/orderbook [пара] [глубина] - получить стакан\n' +
'/limit [купить/продать] [пара] [количество] [цена] - торговать\n' +
'/stop [купить/продать] [ пара] [количество] [цена] - торговля\n' +
'/market [покупка/продажа] [пара] [количество] - торговля\n' +
'/orders [пара] - показать открытые ордера\n' +
'/cancel-all [pair] - отменить все ордера\n' +
'/cancel [order_id] - отменить один ордер\n' +
'/tradehistory - показать несколько последних закрытых сделок\n' +
'/address [валюта] - получить адрес\n' +
'/новый адрес [валюта] - создать новый адрес'
)...

Простая функция отображения баланса

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

 #telegram_listener.py 
...import krakenex
from pykrakenapi import KrakenAPI# Инициализировать kraken api как api
api = krakenex.API( ... )
k = KrakenAPI(api)def balance(bot, update):
"""Получить баланс"""
попытка:
ответ = API.api_get_all_balances()
message = ""
для баланса в ответе["результат"]["балансы"]:
if balance.get("доступно"):
message = message + f'\n{balance.get(" валюта")}:'
+ f'{float(balance.get("доступно"))}'
update.message.reply_text(message)
кроме:
... ошибка обработки...

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

  • /indicators показать последние значения индикатора
  • /performance symbol показать последнюю статистику производительности для рынка
  • /orders список открытых ордеров на бирже
  • /trades список последних сделок
  • /торговый символ количество цена добавить сделку

Отладка

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

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

Для прослушивания команд Telegram должен быть запущен модуль telegram_listener . Чтобы проверить это, запустите python telegram_listener.py из командной строки. Попробуйте своего бота Telegram и убедитесь, что он работает правильно.

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

Торговый бот и бот для прослушивания Telegram обычно развертываются вместе на небольшой виртуальной машине, чтобы она всегда была в рабочем состоянии.Обычно бывает достаточно виртуальной машины за 5 или 10 долларов в месяц.

DigitalOcean прост в использовании и выгоден. Ниже находится промо-ссылка, которая дает скидку.

Создать контактную точку Telegram — Учебники по Grafana

Видео-лекция

Описание

Мы также можем добавить Telegram в качестве контактной точки для оповещения.

Для этого установите приложение Telegram на свой телефон или ПК.Сначала будет проще настроить это на вашем ПК.

Вам понадобится BOT API Token и Chat ID .

Откройте Telegram и создайте нового бота , выполнив поиск @BotFather и набрав /newbot

.

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

Вам будет предоставлен токен HTTP API, который является вашим токеном BOT API для использования в Grafana.Он будет иметь вид XXXXXXXXX: YYYYYYYYYYYYYYYYYYYYYYYYYYYY

.

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

Затем выберите параметр View Group Info для группы, щелкните имя пользователя-бота в списке участников и нажмите кнопку SEND MESSAGE .

Затем отправьте любое сообщение пользователю.

Затем в браузере перейдите по ссылке https://апи.telegram.org/bot XXX:YYY /getUpdates (замените XXX:YYY токеном BOT API , который вы только что получили от Telegram)

В ответе JSON вы должны увидеть узел с сообщением типа type=group. Этот узел также будет иметь идентификатор. Скопируйте этот идентификатор в поле Chat ID в Grafana.

Теперь вы можете протестировать новую точку контакта Telegram в Grafana с помощью кнопки Test .

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

Получить идентификатор чата Telegram

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

Поиск и устранение неисправностей

Если URL-адрес getUpdates не возвращает узел, содержащий группу чата с идентификатором, попробуйте отправить другое сообщение с другим текстом.

Вы также можете попробовать,

  • удаление вашего бота из группы,
  • , а затем повторно добавить своего бота в группу,
  • выбрав его из списка участников группы,
  • отправить ему новое сообщение,
  • , затем снова попробуйте URL-адрес getUpdates .

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

Например, Если id чата = -123456789, иногда при быстром копировании и вставке можно забыть символ — и скопировать просто 123456789

.

Добавить комментарий

Ваш адрес email не будет опубликован.