Как запустить бота в телеграмме: ⭐️ Как добавить бота в Telegram — инструкция 2020

Как запустить бота в телеграмме: ⭐️ Как добавить бота в Telegram — инструкция 2020

Содержание

⭐️ Как добавить бота в Telegram — инструкция 2020

как добавить бота в телеграм картинка

как добавить бота в телеграм картинка

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

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

Рекомендуем нашу статью о самостоятельном создании Телеграм-ботов.

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

Свои собственные боты есть у «Сбербанка», «Почты России», «OneTwoTrip», «Связного», «Медузы» и многих других.

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

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

Специально для жителей РФ: рекомендуем бота TeleBot, который раздает надежные, быстрые и бесплатные MTProxy для обхода блокировки Telegram.

Содержание:

Как начать работу с ботом

Для обычных пользователей роботы работают через диалоги прямо в Телеграм. Нужного можно найти через строку поиска. Лучше всего использовать для этого имя, оно всегда начинается с «@» и заканчивается на «…bot», например, @PollBot — помощник для создания голосований.

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

Рекомендуем к обязательному прочтению нашу огромную подборку лучших ботов для Телеграм.

картинка: добавить бота в Телеграм

картинка: добавить бота в Телеграм

Чтобы активировать помощника, нужно начать с ним диалог нажатием кнопки «Start». В дальнейшем большинство функций будут доступны именно через окно беседы. Но есть, например, @gif (для поиска гифок) или @vkmusic_bot (для поиска музыки) — их можно вызывать в диалоге с вашим собеседником, для чего нужно напечатать символ «@».

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

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

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

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

  • /start — начало работы с ботом;
  • /help — помощь по функциям и работе бота;
  • /settings — настройки, если они предусмотрены.

 

Что делать, если бот не работает

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

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

Как ещё можно использовать ботов

Это хороший инструмент для администраторов каналов и групп.

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

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

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

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

Узнайте о том, как добавить админа в Телеграм-канал.

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


Как подключить бота в Телеграм

Подключаем бота в Телеграм: цели и действия

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

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

Именно об этом мы и поговорим в нашем сегодняшнем материале.

Зачем подключать бота в Телеграм?

Зачем подключать бота в Телеграм

Давайте для начала определимся, что это такое? Бот – это программа (строчки кода), написанная программистом в целях выполнения определенных задач.

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

Расширение возможностей

возможности ботов Телеграм безграничны

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

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

Все процессы делают роботы на полном автомате

автоматизация всех процессов

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

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

Они бесплатные

боты делают все бесплатно

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

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

Как подключить на ПК?

Давайте попробуем подключить какого-нибудь бота. Для примера возьмем довольно интересного кандидата под названием Shmalala Bot. Это чат-бот, способный поднять настроение всему чату, он будет рассказывать интересные истории и многое другое.

Ниже приведена инструкция, просто следуйте ей:

  1. Найдите в поиске @shmalala_bot и начните с ним диалог. начало диалога с ботом @shmalala_bot
  2. Теперь для того, чтобы программа начала работать, бота необходимо добавить в какой-нибудь чат. добавим бота @shmalala_bot в любой чат
  3. Найдите нужный чат и нажмите кнопку «Добавить нового участника». В нужном чате добавляем своего участника
  4. Теперь выберите бота из списка контактов (если что воспользуйтесь поиском).
    выбираем бота из списка контактов
  5. Выберите и нажмите «Invite».

Готово! Теперь робот должен работать. Он будет периодически отправлять сообщения в чат.

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

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

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

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

  1. Для начала надо обратиться к отцу ботов. Ищем в поиске @BotFather и начинаем с ним диалог. Ищем в поиске бота @BotFather и начинаем разговор с ним
  2. Пишем команду «/newbot». пишем команду - /newbot для создания нового бота
  3. Далее следуем инструкции (придумываем имя и username).
  4. После проделанных действий BotFather отправит нам сообщение с токеном. Токен необходимо будет сохранить. получение от BotFather сообщения с токеном
  5. Теперь ищем в поиске наш конструктор @ManyBot и начинаем с ним диалог. конструктор @ManyBot и начало диалога с этим ботом
  6. Пишем команду «/addbot». /addbot - команда для добавления нового бота
  7. Затем он попросит токен, который нам дал BotFather. Даем ему токен. запрос токена и отправка его
  8. Далее пишем описание, если необходимо.
  9. Теперь находим нашего нового бота в поиске и начинаем с ним диалог.
    находим нашего нового бота через поиск и начинаем диалог
  10. Далее пишем команду «/autoposting».вводим команду - /autoposting для создания нужного функционала
  11. Выбираем пункт меню «RSS».
  12. И вставляем ссылку на наш сайт, откуда будут репоститься новости.

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

Как подключить на смартфоне?

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

Итак, для начала давайте попробуем снова подключить нашу Shmalala Bot.

  1. Заходим в приложение Телеграм и нажимаем на поиск.
  2. Ищем @Shmalala_bot и начинаем с ней диалог. @Shmalala_bot в приложении Телеграм
  3. Теперь ее необходимо добавить в чат. Добавляем Shmalala через приложение андроид
  4. Заходим в нужный чат и жмем по названию. Добавляем в нужном чате по названию бота
  5. В появившемся меню выбираем «Add member».
  6. Находим нашего робота и добавляем его в число участников.

находим робота Шмалала и добавляем его - add member

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

Настройка автопостера в Телеграм

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

  1. В мессенджере нажимаем на поиск, ищем @BotFather и начинаем с ним диалог. Настройка бота автопостера от БотФазера - начало
  2. Далее пишем команду «/newbot». пишем команду /newbot для создания нового бота
  3. И следуем инструкции, придумывая имя и username.
  4. Затем отец ботов присылает нам сообщение с токеном. Сохраняем токен. получем сообщение от БотФазера с токеном
  5. Теперь в поиске ищем @ManyBot и начинаем с ним диалог. Находим бота @ManyBot и начинаем с ним разговор
  6. Пишем команду «/addbot» или выбираем пункт меню «Добавить нового бота». пишем команду /addbot для добавления бота
  7. Затем вставляем сюда тот токен, который нам дал BotFather. в сообщении указываем токен, полученный от БотФазера
  8. После пишем описание (если необходимо).
  9. Теперь ищем нашего только что созданного робота и начинаем с ним диалог. Находим в поиске нашего нового бота и договариваемся с ним
  10. Пишем команду «/autoposting». команда /autoposting для автопостинга нового бота
  11. Выбираем «RSS».
  12. Вставляем ссылку на страницу, с которой будут копироваться новости.

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

Готово! Как видите, процесс настройки на ПК и на мобильной версии мало чем отличается. Самое большое отличие – это интерфейс.

Советы и рекомендации

советы по настройке и подключению бота Телеграм

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

  1. Что делать если программа молчит? В таком случае причина может быть разной: бот может попросту не работать из-за ошибки в программном коде (здесь вы ничего поделать не сможете), сервер может долго отвечать (необходимо подождать) или же вы вводите неверную команду (введите «/help» и бот должен прислать сообщение с возможными командами).
  2. При использовании популярных роботов, всегда проверяйте правильность написания username, так как сегодня есть боты-клоны, которые выглядят точно также, а работают некорректно.
  3. При создании бота в BotFather username всегда должен заканчиваться на «bot». Это отличает аккаунты роботов от аккаунтов людей.

Итог

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

Оцените текст:

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

Автор публикации

Комментарии: 95Публикации: 268Регистрация: 15-05-2014

Боты и роботы в Телеграмм

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

robot-anton (1)

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

Зачем нужны Боты Телеграмм и как ими пользоваться ?

Telegram Bots — это функция присущая только мессенджеру Телеграмм. Давайте рассмотрим какие еще боты есть в телеграмме и как их добавить в свой список контактов.

  • @quizbot Робот, устраивающий викторины. Для старта наберите бот старт
  • @BenderBot Робот с расширенным набором плагинов. Для помощи наберите !help
  • @clippy Робот, созадающий стикеры из изображений. Для помощи наберите help
  • @cbr_bot Робот который показывает курс валюты

Как добавить бота в Телеграмм:

  1. Заходим в TM (Telegram Messenger) и открываем поиск, вводим имя нужного бота
  2. Как добавить бота в Телеграмм

  3. Теперь пишем команду нашему боту:robot-anton-telegram

Робот Антон — @telerobot может отвечать на следующие команды :

  • Telegram Bot 0.13.0
  • locale [ios|android|windows|wp|osx] [ru|ua|be|uz|az|tr|tt] — Отправляет файл локализации
  • погода [город] — Погода в указанном городе
  • курс [валюта] — Текущие курсы валют и сырья по ЦБ РФ
  • пикабу — Случайный пост из горячего пикабу
  • гадай — Посмотреть в хрустальный шар
  • новость [категория] — Случайная новость. Чтобы просмотреть список категорий, наберите новости список
  • хаха — Рассказать несмешной анекдот
  • баш — Случайная цитата с bash.im

Как создавать своего бота в Telegram Messenger?

Не для кого не является секретом что Telegram Открыл платформу для свободного создания ботов. По сути это приложение которое функционирует на ваше стороне, и осуществляет запросы к Telegram API. Причем API довольное простое — бот обращается на определенный URL с параметрами, а Telegram отвечает JSON объектом. более подробная инструкция по созданию ботов описана на Хабре. Вы можете ознакомиться с инструкцией по ссылке.

Как добавить бота в Телеграмме

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

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

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

Зачем нужны боты

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

Как добавить бота в ТелеграмКак добавить бота в Телеграм

Боты в Телеграме.

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

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

Как работать с ними

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

Чат-бота допустимо:

  • добавлять в беседы;
  • настраивать или обучать;
  • дополнять информацией.

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

Как добавить бота в Телеграм

Чтобы добавить бота в канал Telegram, необходимо сделать три шага:

  1. Через интегрированный поисковик найти группу или канал, поставив вначале значок @.
  2. Направить приглашение чат-роботу на подключение.
  3. Убедиться, что помощник появился в списке контактов.

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

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

Поиск

Найти робота можно при помощи @StoreBot или в каталоге ботов на различных сайтах.

Получение информации о боте

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

Добавление в группу

Если надо предоставить возможность участникам какой-либо группы взаимодейст-вовать с ботом, то понадобится для начала добавить бота в группу. Для этого переходят к настройкам самой группы и выбирают «Add member». Далее через поиск находят определенного бота и добавляют его к чату.

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

Способы добавления бота в ТелеграмСпособы добавления бота в Телеграм

Создание своего бота в Телеграме.

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

Как выглядит процесс пошагово:

  1. Загрузить и инсталлировать «телегу» на телефон или ПК.
  2. Задать команду «Manybot» через поисковик.
  3. Кликнуть кнопку «Start», затем согласиться на добавление бота.
  4. Ознакомиться с инструкцией во всплывающем сообщении, выполнить действия согласно ей.
  5. Зайти в «BotFather».
  6. Начать переписку с хелпером через кнопку «Отправить сообщение».
  7. Ознакомиться с командами для помощника, нажав на «Старт».
  8. Ответить с помощью «new bot».
  9. Ввести имя помощника на латинской раскладке с окончанием –bot.
  10. Сохранить API во вкладке «Manybot».
  11. Загрузить информацию о функциях либо пропустить эту ступень.
  12. Дождаться уведомления о том, что помощник создан.

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

Обратите внимание! Создавать новые чаты лучше на ПК, чтобы было удобнее использовать дополнительные файлы.

Если бот не работает

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

Другие способы использования ботов

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

Как работать с ботом в ТелеграмеКак работать с ботом в Телеграме

Использование бота в Телеграм.

Они могут сделать:

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

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

Доступными будут такие функции:

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

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

Выводы

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

Детальная инструкция видна на видео:

Документация Telegram: Боты

Боты — специальные аккаунты в Telegram, созданные для того, чтобы автоматически обрабатывать и отправлять сообщения. Пользователи могут взаимодействовать с ботами при помощи сообщений, отправляемых через обычные или групповые чаты. Логика бота контролируется при помощи HTTPS запросов к нашему API для ботов.

Общие сведения

Что могут делать боты?

Вот несколько примеров использования ботов:

  • Интеграция с другими сервисами. Например, бот может отправлять комментарии или управлять «умным домом». Или, например, отправлять вам уведомления при совершении каком-то действия или события (Примеры: GitHub Bot, Image Bot).
  • Утилиты и инструменты. Бот может отображать погоду, переводить тексты или предупреждать о предстоящих событиях по вашему запросу (Например: бот опросов).
  • Одно- и многопользовательские игры. Бот может поиграть с вами в шашки или шахматы, проводить викторины и так далее. (Пример: Trivia bot).
  • Социальные сервисы. Бот может находить вам собеседника, основываясь на ваших общих интересах и увлечениях. (Пример: HotOrBot).
  • Все, что вам захочется. Бота можно запрограммировать для чего угодно. Разве что посуду они помыть не смогут.

Как работают боты?

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

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

Примечание

Рекомендуем также ознакомиться с подробным описанием Bot API.

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

Для этого есть… Бот. Просто напишите пользователю @BotFather и следуйте его инструкциям. Как только вы создали бота и получили свой ключ (токен) авторизации, переходите в раздел документации Bot API, чтобы начать настраивать вашего бота.

Чем бот отличается от обычного аккаунта?

  • У роботов нет статусов «онлайн» и «был в сети», вместо этого отображается надпись «бот».
  • Для ботов выделено ограниченное место на серверах — все сообщения будут удалены по прошествии определённого срока после обработки.
  • Боты не могут сами начать общение с пользователем. Пользователь должен либо добавить робота в группу, либо первым начать с ним диалог. Для этого можно использовать ссылки вида t.me/<bot_username> или поиск по имени пользователя.
  • Имя пользователя у робота должно заканчиваться на «bot» (например, @controllerbot).
  • При добавлении в конференцию, по умолчанию робот не получает всех сообщений (см. режим приватности).
  • Роботы никогда не спят, не едят и не жалуются (если только вы не запрограммируете их на обратное).

Суперспособности

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

Инлайн-режим

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

Подробнее о встроенном режиме в блоге »

Игры

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

Под капотом у игр — HTML5, поэтому вы можете создавать игры любой сложности. На данный момент командой Telegram созданы несколько демо-игр:

Подробнее об играх в Telegram »

Клавиатуры

Одна из самых необычных возможностей Bot API — кастомизированные клавиатуры. При передаче сервером ответа есть возможность передать команду на отображение специальной клавиатуры с предустановленными вариантами ответа (см. ReplyKeyboardMarkup). Клиент Telegram, получив сообщение, отобразит пользователю вашу клавиатуру. Нажатие на клавишу сразу же отправит на сервер соответствующую команду. Таким образом можно значительно упростить взаимодействие робота с пользователем. На данный момент для отображения на клавише могут использоваться эмодзи и текст. Вот несколько примеров таких клавиатур:

За более подробной информацией обращайтесь к описанию метода sendMessage.

Команды

Команды представляют собой более гибкий способ общения с ботом. Рекомендуется следующий синтаксис:

/команда [необязательный] [аргумент]

Команда должна начинаться с символа косой черты «/» и не может быть длиннее 32 символов. Команды могут состоять из букв латинского алфавита, цифр и подчёркивания. Несколько примеров:

/get_messages_stats
/set_timer 10min Alarm!
/get_timezone London, UK

Сообщения, начинающиеся с косой черты, будут всегда доставляться боту (точно также, как и при ответе на его сообщения и на &commat;упоминания бота в чате). Приложения Telegram будут:

  • Предлагать список поддерживаемых команд с их описанием, когда пользователь введёт символ косой черты «/» (чтобы этот пункт работал, вам необходимо задать описание команд у @BotFather). Нажатие на описание приведёт к отправке этой команды.
  • Показывать кнопку (/) в поле ввода текста во всех чатах с ботами. Нажатие на эту кнопку отобразит список доступных команд.
  • Подсвечивать /команды в сообщениях. При нажатии на такую подсвеченную команду, она будет сразу же отправлена боту.

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

/start@TriviaBot
/start@ApocalypseBot

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

Глобальные команды

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

  • /start — начинает общение с пользователем (например, отправляет приветственное сообщение). В эту команду также можно передавать дополнительные аргументы (см. внешнее связывание).
  • /help — отображает сообщение с помощью по командам. Оно может представлять собой короткое сообщение о вашем боте и список доступных команд.
  • /settings — (по возможности) возвращает список возможных настроек и команды для их изменения.

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

Режим приватности

Ботов часто добавляют в группы, чтобы получать различную информацию — новости, уведомления и т.д. Однако, при добавлении бота вы наверняка спрашивали себя: «А что если этот маленький засранец пересылает всю групповую переписку куда-то “налево”?» Именно поэтому у роботов есть режимы приватности.

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

  • Сообщения, начинающиеся с символа косой черты «/» (см. раздел Команды)
  • Сообщения, содержащие @упоминание бота
  • Ответы на сообщения бота
  • Служебные сообщения (о добавлении пользователя, смены изображения группы и т.д.)

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

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

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

Внешнее связывание

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

У каждого робота есть ссылка, при помощи которой можно начать с ним диалог — https://t.me/<имя бота>. К этой ссылке можно добавить параметры *start или startgroup со значением длиной до 64 символов. Пример:

https://t.me/triviabot?startgroup=test

Допустимо использование символов A-Z, a-z, 0-9, _ и -. Мы рекомендуем использовать base64url для кодирования параметров.

Переход по ссылке с параметром start начнет чат с ботом, при этом в поле ввода текста будет отображаться кнопка СТАРТ. При переходе по ссылке с параметром startgroup пользователю будет предложено добавить бота в одну из доступных групп. Как только пользователь подтвердит своё действие (нажмёт на кнопку СТАРТ или выберет группу), бот получит сообщение следующего формата:

/start PAYLOAD

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

Пример реализации внешнего связывания

Предположим, сайт example.com хочет отправлять пользователю уведомления с помощью Telegram-бота. Ниже приведено описание последовательности действий для реализации отправки уведомлений пользователю с ID 123.

  1. Создайте бота с любым именем, например, @ExampleComBot
  2. Настройте вебхук для входящих сообщений
  3. Сгенерируйте ключ достаточной длины, напр. $memcache_key = 'TESTKEY'
  4. Запишите значение 123 с ключом $memcache_key в Memcache на 3600 секунд (один час)
  5. Отправьте пользователю ссылку https://t.me/ExampleComBot?start=TESTKEY
  6. Настройте обработчик веб-хуков так, чтобы он запрашивал в Memcached значение входящего параметра каждый раз, когда приходит сообщение, начинающееся со /start. Если ключ существует, записываем chat_id, переданный в веб-хук, в telegram_chat_id для пользователя 123. Удаляем ключ из Memcache.
  7. Теперь, если мы хотим отправить сообщение пользователю 123, сначала проверяем telegram_chat_id. Если оно существует, используем метод sendMessage, чтобы отправить пользователю сообщение.

BotFather

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

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

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

Имя (name) будет отображаться в контактах и чатах.

Username — короткое имя на латинице, которое используется для упоминаний бота и в ссылках на профиль в telegram.me. Username должен состоять из букв латинского алфавита, подчёркиваний и цифр и быть длиной от 5 до 32 символов. Также имя пользователя обязательно должно заканчиваться на «bot», например: «tetris_bot» или «TetrisBot».

Ключ (токен) это набор символов вида 110201543:AAHdqTcvCh2vGWJxfSeofSAs0K5PALDsaw, который нужен, чтобы получать и отправлять сообщения с помощью Bot API.

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

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

Настройки

  • /setname — Изменить имя робота.
  • /setdescription — Изменить описание робота, представляющее собой короткий текст с описанием бота. Пользователи увидят его в самом начале, под заголовком «Что умеет этот робот?».
  • /setabouttext — Изменить информацию о боте, ещё более короткий текст, отображающийся в профиле бота. Ещё, если кто-то поделится вашим ботом, то вместе со ссылкой на него отправится этот текст.
  • /setuserpic — Изменить аватарку бота. Картинки — всегда хорошо.
  • /setcommands — Изменить список команд бота. Каждая команда состоит из собственно командного слова, начинающегося с символа косой черты («/») и короткого описания. Пользователи увидят список команд при вводе символа «/».
  • /setjoingroups — Определяет, можно ли добавлять вашего бота в группы.
  • /setprivacy — Определяет, все ли сообщения видит ваш бот в группах. В выключенном состоянии роботу будут отправляться все сообщения.
  • /deletebot — Удалить бота и его имя пользователя.
Совет

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

Как создавать ботов в Telegram / Хабр

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

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

Рассмотрим API на примере создания тривиального бота:

1. Регистрация


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

Пишем ему /start и получаем список всех его команд.
Первая и главная — /newbot — отправляем ему и бот просит придумать имя нашему новому боту. Единственное ограничение на имя — оно должно оканчиваться на «bot». В случае успеха BotFather возвращает токен бота и ссылку для быстрого добавления бота в контакты, иначе придется поломать голову над именем.

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

Не забудьте проверить полученный токен с помощью ссылки api.telegram.org/bot<TOKEN>/getMe, говорят, не всегда работает с первого раза.

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


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

Telegram позволяет не делать выгрузку сообщений вручную, а поставить webHook, и тогда они сами будут присылать каждое сообщение. Для Python, чтобы не заморачиваться с cgi и потоками, удобно использовать какой-нибудь реактор, поэтому я для реализации выбрал tornado.web. (для GAE удобно использовать связку Python2+Flask)

Каркас бота:

URL = "https://api.telegram.org/bot%s/" % BOT_TOKEN
MyURL = "https://example.com/hook"

api = requests.Session()
application = tornado.web.Application([
    (r"/", Handler),
])

if __name__ == '__main__':
    signal.signal(signal.SIGTERM, signal_term_handler)
    try:
        set_hook = api.get(URL + "setWebhook?url=%s" % MyURL)
        if set_hook.status_code != 200:
            logging.error("Can't set hook: %s. Quit." % set_hook.text)
            exit(1)
        application.listen(8888)
        tornado.ioloop.IOLoop.current().start()
    except KeyboardInterrupt:
        signal_term_handler(signal.SIGTERM, None)

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

Приложение торнадо для обработки запросов принимает класс tornado.web.RequestHandler, в котором и будет логика бота.

class Handler(tornado.web.RequestHandler):
        def post(self):
            try:
                logging.debug("Got request: %s" % self.request.body)
                update = tornado.escape.json_decode(self.request.body)
                message = update['message']
                text = message.get('text')
                if text:
                    logging.info("MESSAGE\t%s\t%s" % (message['chat']['id'], text))

                    if text[0] == '/':
                        command, *arguments = text.split(" ", 1)
                        response = CMD.get(command, not_found)(arguments, message)
                        logging.info("REPLY\t%s\t%s" % (message['chat']['id'], response))
                        send_reply(response)
            except Exception as e:
                logging.warning(str(e))

Здесь CMD — словарь доступных команд, а send_reply — функция отправки ответа, которая на вход принимает уже сформированный объект Message.

Собственно, её код довольно прост:

def send_reply(response):
    if 'text' in response:
        api.post(URL + "sendMessage", data=response)

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

3. Команды


Перво-наперво, необходимо соблюсти соглашение Telegram и научить бота двум командам: /start и /help:
def help_message(arguments, message):
    response = {'chat_id': message['chat']['id']}
    result = ["Hey, %s!" % message["from"].get("first_name"),
              "\rI can accept only these commands:"]
    for command in CMD:
        result.append(command)
    response['text'] = "\n\t".join(result)
    return response

Структура message[‘from’] — это объект типа User, она предоставляет боту информацию как id пользователя, так и его имя. Для ответов же полезнее использовать message[‘chat’][‘id’] — в случае личного общения там будет User, а в случае чата — id чата. В противном случае можно получить ситуацию, когда пользователь пишет в чат, а бот отвечает в личку.

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

После этого можно добавить какую-нибудь свою команду, например, /base64:

def base64_decode(arguments, message):
    response = {'chat_id': message['chat']['id']}
    try:
        response['text'] = b64decode(" ".join(arguments).encode("utf8"))
    except:
        response['text'] = "Can't decode it"
    finally:
        return response

Для пользователей мобильного Telegram, будет полезно сказать @BotFather, какие команды принимает наш бот:
I: /setcommands
BotFather : Choose a bot to change the list of commands.
I: @******_bot
BotFather: OK. Send me a list of commands for your bot. Please use this format:

command1 — Description
command2 — Another description
I:
whoisyourdaddy — Information about author
base64 — Base64 decode
BotFather: Success! Command list updated. /help

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

4. Свобода


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

UPD: Как верно подсказали, такое пройдет только при личном общении. В чатах боту доставляются только сообщения, начинающиеся с команды (/<command>) (https://core.telegram.org/bots#privacy-mode)

  • All messages that start with a slash ‘/’ (see Commands above)
  • Messages that mention the bot by username
  • Replies to the bot’s own messages
  • Service messages (people added or removed from the group, etc.)

Чтобы бот получал все сообщения в группах пишем @BotFather команду /setprivacy и выключаем приватность.

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

if text[0] == '/':
    ...
else:
    response = CMD["<speech>"](message)
    logging.info("REPLY\t%s\t%s" % (message['chat']['id'], response))
    send_reply(response)

А потом в список команд добавляем псевдо-речь:
RESPONSES = {
    "Hello": ["Hi there!", "Hi!", "Welcome!", "Hello, {name}!"],
    "Hi there": ["Hello!", "Hello, {name}!", "Hi!", "Welcome!"],
    "Hi!": ["Hi there!", "Hello, {name}!", "Welcome!", "Hello!"],
    "Welcome": ["Hi there!", "Hi!", "Hello!", "Hello, {name}!",],
}
def human_response(message):
    leven = fuzzywuzzy.process.extract(message.get("text", ""), RESPONSES.keys(), limit=1)[0]
    response = {'chat_id': message['chat']['id']}
    if leven[1] < 75:
        response['text'] = "I can not understand you"
    else:
        response['text'] = random.choice(RESPONSES.get(leven[0])).format_map(
            {'name': message["from"].get("first_name", "")}
        )
    return response

Здесь эмпирическая константа 75 относительно неплохо отражает вероятность того, что пользователь всё-таки хотел сказать. А format_map — удобна для одинакового описания строк как требующих подстановки, так и без нее. Теперь бот будет отвечать на приветствия и иногда даже обращаться по имени.

5. Не текст.


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

Для примера расширим словарь RESPONSES:

RESPONSES["What time is it?"] = ["<at_sticker>", "{date} UTC"]

И будем отлавливать текст :
if response['text'] == "<at_sticker>":
        response['sticker'] = "BQADAgADeAcAAlOx9wOjY2jpAAHq9DUC"
        del response['text']

Видно, что теперь структура Message уже не содержит текст, поэтому необходимо модифицировать send_reply:
def send_reply(response):
    if 'sticker' in response:
        api.post(URL + "sendSticker", data=response)
    elif 'text' in response:
        api.post(URL + "sendMessage", data=response)

И все, теперь бот будет время от времени присылать стикер вместо времени:

6. Возможности


Благодаря удобству API и быстрому старту боты Telegram могут стать хорошей платформой для автоматизации своих действий, настройки уведомлений, создания викторин и task-based соревнований (CTF, DozoR и прочие).

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

7. Ограничения


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

К счастью, Telegram также умеет работать и по ручному обновлению, поэтому не меняя кода можно создать еще одну службу Puller, которая будет выкачивать их и слать на локальный адрес:

while True:
            r = requests.get(URL + "?offset=%s" % (last + 1))
            if r.status_code == 200:
                for message in r.json()["result"]:
                    last = int(message["update_id"])
                    requests.post("http://localhost:8888/",
                                  data=json.dumps(message),
                                  headers={'Content-type': 'application/json',
                                           'Accept': 'text/plain'}
                     )
            else:
                logging.warning("FAIL " + r.text)
            time.sleep(3)

P.S. По пункту 7 нашел удобное решение — размещение бота не у себя, а на heroku, благо все имена вида *.herokuapp.com защищены их собственным сертификатом.

UPD: Telegram улучшили Бот Апи, из-за чего, теперь не обязательно иметь отдельную функцию для отправки сообщений при установленном вебхуке, а в ответ на POST запрос можно отвечать тем же сформированным JSON с ответным сообщением, где одно из полей устанавливается как ч ‘method’: ‘sendMessage’ (или любой другой метод, используемый ботом).

Создание и хостинг телеграм бота. От А до Я / Хабр

Привет, хабрчане! Какой бы заезженной не была тема создания телеграм бота на python3, я не нашёл инструкций, где показан путь от первой строчки кода до деплоинга бота (по крайней мере все методы, что я видел, немного устарели). В этой статье я хочу показать процесс создания бота от написания BotFather-у до деплоинга бота на Heroku.

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

P.S. Пишите если нужна статья по созданию более сложного бота, т.е. с вебхуками, БД с настройками юзеров и т.д.


Для начала стоит определиться, что же будет делать наш бот. Я решил написать банального простого бота, кторый будет парсить и выдавать нам заголовки с Хабра.
И так, начнём же.

BotFather


Для начала нам надо зарегистрировать нашего бота в Telegram. Для этого:

В поиске вбиваем @BotFather и переходим в диалог с Отцом Ботов.

Пишем /newbot. Указываем имя бота (то, что отображается в диалогах). Указываем его логин, по которому его можно булет найти.

P.S. Оно должно заканчиваться на Bot/bot

Вот. Нам дали API ключ и ссылку на бота. Желательно сохранить API ключ и перейти в диалог с ботом, чтобы потом не копаться в переписке с BotFather

Дальше добавим ему пару команд: пропишем /setcommands и одним сообщением, т.к. /setcommands не добавляет команды, а задаёт их с нуля, пошлём ему команды.

all - спарсить заголовки с вкладки "ВСЁ ПОДРЯД"
top - спарсить заголовки с вкладки "ЛУЧШЕЕ"

На этом работа с BotFather закончилась, перейдём к следующей части.

Установка и настройка pipenv. Первый запуск.


Для начала создадим файл, в котором будет основной код бота bot.py. Если бот большой, то сразу создавайте файлы, куда вы вынесете функции, классы и т.д, иначе читаемость кода стремится к нулю. Я добавлю parser.py

Установим pipenv, если его конечно ещё нет.

Для Windows:

pip install pipenv

Для Linux:
sudo pip3 install pipenv

Установим pipenv в папку проекта.
pipenv install

Установим интересующие нас библиотеки. Я буду работать с PyTelegramBotAPI. Также для парсинга добавим BeautifulSoup4.
pipenv install PyTelegramBotAPI
pipenv install beautifulsoup4

Начинаем писать код!

Открываем bot.py, импортируем библиотеки и создаём главные переменные.

import telebot
import parser

#main variables
TOKEN = "555555555:AAAAaaaAaaA1a1aA1AAAAAAaaAAaa4AA"
bot = telebot.TeleBot(TOKEN)

Запустим бота. Посмотри наличие ошибок.Как запустить?Для Windows:
python bot.py

Для Linux:
python3 bot.py


Если ошибок не появилось, то продолжим.

Хэндлеры. Отвечаем на команды и сообщения


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

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

Начнём с самого простого: ответим на команды /start и /go

@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    bot.send_message(message.chat.id, 'Привет, когда я вырасту, я буду парсить заголовки с Хабра')
bot.polling()

Сейчас разберёмся что это и как это работает. Передаём в message_handler параметр commands равный массиву со строками — командами, на которые он будет отвечать описанным ниже образом. (На все эти команды он ответит одинаково). Далее используем send_message, в него записываем id чата (его можно достать из message.chat.id), в который отправить сообщение и, собственно, само сообщение. Нельзя забыть написать bot.polling() в конце кода, иначе бот сразу же выключиться. Почему так мы узнаем позже.

Теперь можно запустить бота и написать ему /start или /go и он ответит.

P.S. Сообщение может быть не только строкой, а, в принципе, чем угодно.

P.S.S. Что за message?Это json объект, хранящий информацию об отправителе, чате, и самом сообщении.
{
  'content_type': 'text',
  'message_id': 5,
  'from_user':
    {
      'id': 333960329,
      'first_name': 'Nybkox',
      'username': 'nybkox',
      'last_name': None
    },
  'date': 1520186598,
  'chat':
    {
      'type': 'private',
      'last_name': None,
      'first_name': 'Nybkox',
      'username': 'nybkox',
      'id': 333960329,
      'title': None,
      'all_members_are_administrators': None
    },
    'forward_from_chat': None,
    'forward_from': None,
    'forward_date': None,
    'reply_to_message': None,
    'edit_date': None,
    'text': '/start',
    'entities': [<telebot.types.MessageEntity object at 0x7f3061f42710>],
    'audio': None,
    'document': None,
    'photo': None,
    'sticker': None,
    'video': None,
    'voice': None,
    'caption': None,
    'contact': None,
    'location': None,
    'venue': None,
    'new_chat_member': None,
    'left_chat_member': None,
    'new_chat_title': None,
    'new_chat_photo': None,
    'delete_chat_photo': None,
    'group_chat_created': None,
    'supergroup_chat_created': None,
    'channel_chat_created': None,
    'migrate_to_chat_id': None,
    'migrate_from_chat_id': None,
    'pinned_message': None
}


Основы взаимодействия. Ответ на текстовые сообщения.

Теперь обработаем текстовые сообщения бота. Самое важное что нам нужно знать это то, что текст сообщения храниться в message.text и то, что, чтобы обрабатывать текст в message_handler нужно передавать content_types=[‘text’].

Добавим вот такой код.

@bot.message_handler(content_types=['text'])
def text_handler(message):
    text = message.text.lower()
    chat_id = message.chat.id
    if text == "привет":
        bot.send_message(chat_id, 'Привет, я бот - парсер хабра.')
    elif text == "как дела?":
        bot.send_message(chat_id, 'Хорошо, а у тебя?')
    else:
        bot.send_message(chat_id, 'Простите, я вам не понял :(')

Тут мы довабили пару переменных: вынесли текст сообщения (в нижнем регистре, чтобы не было лишних проблем с теми кто пишет капсом, заборчиком и т.д.) в переменную text, вынесли message.chat.id в отдельную переменную, чтобы каждый раз не обращаться к message. Также мы построили небольшое ветвление, для ответа на определённые сообщения, а также ответ на случай непонятного боту сообщения.Итоговый код
import bs4
import parser

#main variables
TOKEN = "555555555:AAAAaaaAaaA1a1aA1AAAAAAaaAAaa4AA"
bot = telebot.TeleBot(TOKEN)

#handlers
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    bot.send_message(message.chat.id, 'Привет, когда я вырасту, я буду парсить заголовки с хабра')

@bot.message_handler(content_types=['text'])
def text_handler(message):
    text = message.text.lower()
    chat_id = message.chat.id
    if text == "привет":
        bot.send_message(chat_id, 'Привет, я бот - парсер хабра.')
    elif text == "как дела?":
        bot.send_message(chat_id, 'Хорошо, а у тебя?')
    else:
        bot.send_message(chat_id, 'Простите, я вас не понял :(')

bot.polling()


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

Для ответа на картинки, стикеры, документы, аудио и т.д. нужно всего лишь поменять content_types=[‘text’].

Рассмотрим пример с картинкой, добавив этот код.

@bot.message_handler(content_types=['photo'])
def text_handler(message):
    chat_id = message.chat.id
    bot.send_message(chat_id, 'Красиво.')

Все типы контента:

text, audio, document, photo, sticker, video, video_note, voice, location, contact, new_chat_members, left_chat_member, new_chat_title, new_chat_photo, delete_chat_photo, group_chat_created, supergroup_chat_created, channel_chat_created, migrate_to_chat_id, migrate_from_chat_id, pinned_message

Строим цепочку ответов.

Пришло время закончить с элементарными действиями и начать что-то серьёзное. Попробуем построить цепочку ответов. Для этого нам понадобиться register_next_step_handler(). Создадим простой пример, на котором и разберёмся как работает register_next_step_handler().
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    chat_id = message.chat.id
    text = message.text
    msg = bot.send_message(chat_id, 'Сколько вам лет?')
    bot.register_next_step_handler(msg, askAge)

def askAge(message):
    chat_id = message.chat.id
    text = message.text
    if not text.isdigit():
        msg = bot.send_message(chat_id, 'Возраст должен быть числом, введите ещё раз.')
        bot.register_next_step_handler(msg, askAge) #askSource
        return
    msg = bot.send_message(chat_id, 'Спасибо, я запомнил что вам ' + text + ' лет.')

И так, в первой функции добавился bot.register_next_step_handler(msg, askAge), в него мы передаём сообщение, которые хотим послать, и следующий щаг, к которому перейти после ответа пользователя.

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

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


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

@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    global isRunning
    if not isRunning:
        chat_id = message.chat.id
        text = message.text
        msg = bot.send_message(chat_id, 'Сколько вам лет?')
        bot.register_next_step_handler(msg, askAge) #askSource
        isRunning = True

def askAge(message):
    chat_id = message.chat.id
    text = message.text
    if not text.isdigit():
        msg = bot.send_message(chat_id, 'Возраст должен быть числом, введите ещё раз.')
        bot.register_next_step_handler(msg, askAge) #askSource
        return
    msg = bot.send_message(chat_id, 'Спасибо, я запомнил что вам ' + text + ' лет.')
    isRunning = False

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

Для начала нужен сам парсер. Обратим внимание на то, что во вкладках «Лучшее» и «Всё подряд» есть дополнительные фильтры: сутки, неделя, месяц и ≥10, ≥25, ≥50, ≥100 соответственно.
Парсер конечно можно написать и в 1 функцию, но я разобью на 2, так будет проще читать код.Парсер.
import urllib.request
from bs4 import BeautifulSoup

def getTitlesFromAll(amount, rating='all'):
    output = ''
    for i in range(1, amount+1):
        try:
            if rating == 'all':
                html = urllib.request.urlopen('https://habrahabr.ru/all/page'+ str(i) +'/').read()
            else:
                html = urllib.request.urlopen('https://habrahabr.ru/all/'+ rating +'/page'+ str(i) +'/').read()
        except urllib.error.HTTPError:
            print('Error 404 Not Found')
            break
        soup = BeautifulSoup(html, 'html.parser')
        title = soup.find_all('a', class_ = 'post__title_link')
        for i in title:
            i = i.get_text()
            output += ('- "'+i+'",\n')
    return output

def getTitlesFromTop(amount, age='daily'):
    output = ''
    for i in range(1, amount+1):
        try:
            html = urllib.request.urlopen('https://habrahabr.ru/top/'+ age +'/page'+ str(i) +'/').read()
        except urllib.error.HTTPError:
            print('Error 404 Not Found')
            break
        soup = BeautifulSoup(html, 'html.parser')
        title = soup.find_all('a', class_ = 'post__title_link')
        for i in title:
            i = i.get_text()
            output += ('- "'+i+'",\n')
    return output


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

Итоговый код:

bot.py
import telebot
import bs4
from Task import Task
import parser

#main variables
TOKEN = '509706011:AAF7ghlYpqS5n7uF8kN0VGDCaaHnxfZxofg'
bot = telebot.TeleBot(TOKEN)
task = Task()

#handlers
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    if not task.isRunning:
        chat_id = message.chat.id
        msg = bot.send_message(chat_id, 'Откуда парсить?')
        bot.register_next_step_handler(msg, askSource)
        task.isRunning = True

def askSource(message):
    chat_id = message.chat.id
    text = message.text.lower()
    if text in task.names[0]:
        task.mySource = 'top'
        msg = bot.send_message(chat_id, 'За какой временной промежуток?')
        bot.register_next_step_handler(msg, askAge)
    elif text in task.names[1]:
        task.mySource = 'all'
        msg = bot.send_message(chat_id, 'Какой минимальный порог рейтинга?')
        bot.register_next_step_handler(msg, askRating)
    else:
        msg = bot.send_message(chat_id, 'Такого раздела нет. Введите раздел корректно.')
        bot.register_next_step_handler(msg, askSource)
        return

def askAge(message):
    chat_id = message.chat.id
    text = message.text.lower()
    filters = task.filters[0]
    if text not in filters:
        msg = bot.send_message(chat_id, 'Такого временного промежутка нет. Введите порог корректно.')
        bot.register_next_step_handler(msg, askAge)
        return
    task.myFilter = task.filters_code_names[0][filters.index(text)]
    msg = bot.send_message(chat_id, 'Сколько страниц парсить?')
    bot.register_next_step_handler(msg, askAmount)

def askRating(message):
    chat_id = message.chat.id
    text = message.text.lower()
    filters = task.filters[1]
    if text not in filters:
        msg = bot.send_message(chat_id, 'Такого порога нет. Введите порог корректно.')
        bot.register_next_step_handler(msg, askRating)
        return
    task.myFilter = task.filters_code_names[1][filters.index(text)]
    msg = bot.send_message(chat_id, 'Сколько страниц парсить?')
    bot.register_next_step_handler(msg, askAmount)

def askAmount(message):
    chat_id = message.chat.id
    text = message.text.lower()
    if not text.isdigit():
        msg = bot.send_message(chat_id, 'Количество страниц должно быть числом. Введите корректно.')
        bot.register_next_step_handler(msg, askAmount)
        return
    if int(text) < 1 or int(text) > 11:
        msg = bot.send_message(chat_id, 'Количество страниц должно быть >0 и <11. Введите корректно.')
        bot.register_next_step_handler(msg, askAmount)
        return
    task.isRunning = False
    output = ''
    if task.mySource == 'top':
        output = parser.getTitlesFromTop(int(text), task.myFilter)
    else:
        output = parser.getTitlesFromAll(int(text), task.myFilter)
    msg = bot.send_message(chat_id, output)

bot.polling(none_stop=True)

Тут добавился none_stop=True) к bot.polling, из-за этого бот не будет падать при каждой ошибке.
Task.py
class Task():
    isRunning = False
    names = [
        ['лучшие', 'лучшее', 'топ'],
        ['всё', 'всё подряд', 'all']
    ]
    filters = [
        ['сутки', 'неделя', 'месяц'],
        ['без порога', '10', '25', '50', '100']
    ]
    filters_code_names = [
        ['daily', 'weekly', 'monthly'],
        ['all', 'top10', 'top25', 'top50', 'top100']
    ]
    mySource = ''
    myFilter = ''
    def __init__(self):
        return

parser.py
import urllib.request
from bs4 import BeautifulSoup

def getTitlesFromAll(amount, rating='all'):
    output = ''
    for i in range(1, amount+1):
        try:
            if rating == 'all':
                html = urllib.request.urlopen('https://habrahabr.ru/all/page'+ str(i) +'/').read()
            else:
                html = urllib.request.urlopen('https://habrahabr.ru/all/'+ rating +'/page'+ str(i) +'/').read()
        except urllib.error.HTTPError:
            print('Error 404 Not Found')
            break
        soup = BeautifulSoup(html, 'html.parser')
        title = soup.find_all('a', class_ = 'post__title_link')
        for i in title:
            i = i.get_text()
            output += ('- "'+i+'",\n')
    return output

def getTitlesFromTop(amount, age='daily'):
    output = ''
    for i in range(1, amount+1):
        try:
            html = urllib.request.urlopen('https://habrahabr.ru/top/'+ age +'/page'+ str(i) +'/').read()
        except urllib.error.HTTPError:
            print('Error 404 Not Found')
            break
        soup = BeautifulSoup(html, 'html.parser')
        title = soup.find_all('a', class_ = 'post__title_link')
        for i in title:
            i = i.get_text()
            output += ('- "'+i+'",\n')
    return output


Теория. Методы взаимодействия с ботом.

Мы используем long polling для получения данных о сообщениях от бота.

bot.polling(none_stop=True)

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

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

Маркапы. Добавляем клавиатуры для быстрого ответа.


Наконец основной код дописан. Теперь можно передохнуть и написать маркапы. Я думаю вы неоднократно видели их, но всё же, приложу скриншот. [SCREENSHOT]

Я выведу маркапы в отдельный файл — markups.py.

В написании маркапов нет ничего сложного. Нужно лишь создать маркап, указать пару параметров, создать пару кнопок и добавить их в маркап, далее просто указываем reply_markup=markup в send_message.

Примерmarkups.py
from telebot import types
source_markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
source_markup_btn1 = types.KeyboardButton('Лучшие')
source_markup_btn2 = types.KeyboardButton('Всё подряд')
source_markup.add(source_markup_btn1, source_markup_btn2)

В параметры маркапа указываем ширину строки и изменение размеров кнопок, иначе они огромны.Можно конечно заполнять отдельно каждую строк.
markup = types.ReplyKeyboardMarkup()
itembtna = types.KeyboardButton('a')
itembtnv = types.KeyboardButton('v')
itembtnc = types.KeyboardButton('c')
itembtnd = types.KeyboardButton('d')
itembtne = types.KeyboardButton('e')
markup.row(itembtna, itembtnv)
markup.row(itembtnc, itembtnd, itembtne)


bot.py
def start_handler(message):
    if not task.isRunning:
        chat_id = message.chat.id
        msg = bot.send_message(chat_id, 'Откуда парсить?', reply_markup=m.source_markup)
        bot.register_next_step_handler(msg, askSource)
        task.isRunning = True


Применим полученные знания к нашему боту.Итоговый кодmarkups.py
from telebot import types

start_markup = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True)
start_markup_btn1 = types.KeyboardButton('/start')
start_markup.add(start_markup_btn1)

source_markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
source_markup_btn1 = types.KeyboardButton('Лучшие')
source_markup_btn2 = types.KeyboardButton('Всё подряд')
source_markup.add(source_markup_btn1, source_markup_btn2)

age_markup = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True)
age_markup_btn1 =  types.KeyboardButton('Сутки')
age_markup_btn2 =  types.KeyboardButton('неделя')
age_markup_btn3 =  types.KeyboardButton('Месяц')
age_markup.add(age_markup_btn1, age_markup_btn2, age_markup_btn3)

rating_markup = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True)
rating_markup_btn1 =  types.KeyboardButton('Без порога')
rating_markup_btn2 =  types.KeyboardButton('10')
rating_markup_btn3 =  types.KeyboardButton('25')
rating_markup_btn4 =  types.KeyboardButton('50')
rating_markup_btn5 =  types.KeyboardButton('100')
rating_markup.row(rating_markup_btn1, rating_markup_btn2)
rating_markup.row(rating_markup_btn3, rating_markup_btn4, rating_markup_btn5)

amount_markup = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True)
amount_markup_btn1 =  types.KeyboardButton('1')
amount_markup_btn2 =  types.KeyboardButton('3')
amount_markup_btn3 =  types.KeyboardButton('5')
amount_markup.add(amount_markup_btn1, amount_markup_btn2, amount_markup_btn3)

bot.py
import telebot
import bs4
from Task import Task
import parser
import markups as m

#main variables
TOKEN = '509706011:AAF7aaaaaaaaaaaaaaaaaaaAAAaaAAaAaAAAaa'
bot = telebot.TeleBot(TOKEN)
task = Task()

#handlers
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
    if not task.isRunning:
        chat_id = message.chat.id
        msg = bot.send_message(chat_id, 'Откуда парсить?', reply_markup=m.source_markup)
        bot.register_next_step_handler(msg, askSource)
        task.isRunning = True

def askSource(message):
    chat_id = message.chat.id
    text = message.text.lower()
    if text in task.names[0]:
        task.mySource = 'top'
        msg = bot.send_message(chat_id, 'За какой временной промежуток?', reply_markup=m.age_markup)
        bot.register_next_step_handler(msg, askAge)
    elif text in task.names[1]:
        task.mySource = 'all'
        msg = bot.send_message(chat_id, 'Какой минимальный порог рейтинга?', reply_markup=m.rating_markup)
        bot.register_next_step_handler(msg, askRating)
    else:
        msg = bot.send_message(chat_id, 'Такого раздела нет. Введите раздел корректно.')
        bot.register_next_step_handler(msg, askSource)
        return

def askAge(message):
    chat_id = message.chat.id
    text = message.text.lower()
    filters = task.filters[0]
    if text not in filters:
        msg = bot.send_message(chat_id, 'Такого временного промежутка нет. Введите порог корректно.')
        bot.register_next_step_handler(msg, askAge)
        return
    task.myFilter = task.filters_code_names[0][filters.index(text)]
    msg = bot.send_message(chat_id, 'Сколько страниц парсить?', reply_markup=m.amount_markup)
    bot.register_next_step_handler(msg, askAmount)

def askRating(message):
    chat_id = message.chat.id
    text = message.text.lower()
    filters = task.filters[1]
    if text not in filters:
        msg = bot.send_message(chat_id, 'Такого порога нет. Введите порог корректно.')
        bot.register_next_step_handler(msg, askRating)
        return
    task.myFilter = task.filters_code_names[1][filters.index(text)]
    msg = bot.send_message(chat_id, 'Сколько страниц парсить?', reply_markup=m.amount_markup)
    bot.register_next_step_handler(msg, askAmount)

def askAmount(message):
    chat_id = message.chat.id
    text = message.text.lower()
    if not text.isdigit():
        msg = bot.send_message(chat_id, 'Количество страниц должно быть числом. Введите корректно.')
        bot.register_next_step_handler(msg, askAmount)
        return
    if int(text) < 1 or int(text) > 5:
        msg = bot.send_message(chat_id, 'Количество страниц должно быть >0 и <6. Введите корректно.')
        bot.register_next_step_handler(msg, askAmount)
        return
    task.isRunning = False
    print(task.mySource + " | " + task.myFilter + ' | ' + text) #
    output = ''
    if task.mySource == 'top':
        output = parser.getTitlesFromTop(int(text), task.myFilter)
    else:
        output = parser.getTitlesFromAll(int(text), task.myFilter)
    msg = bot.send_message(chat_id, output, reply_markup=m.start_markup)

bot.polling(none_stop=True)

Ура! С кодом впринципе разобрались. Теперь самое важное — деплоинг бота не хероку.

Деплоим бота на Heroku.


Для начала надо зарегистрироваться на Хероку и на Гитхабе.

Теперь создаём репозиторий на гитхабе. (нажмите плюсик слева от вашего аватара)
Сейчас нам нужен Procfile (Procfile.windows для windows). Создаём его и записываем в него bot: python3 bot.py

Теперь удаляем TOKEN из bot.py, здесь он не нужен, ведь мы будем загружать этот файл на гитхаб. Через тот же терминале, что использовали для запуска бота, заливаем файлы на гитхаб. (Предворительно удалите папку __pycache__).

echo "# HabrParser_Bot" >> README.md
git init
git add .
git add *
git commit -m "Initial Commit" -a
git remote add origin origin https://github.com/name/botname.git #Указываем свою ссылку
git push -u origin master

Гит просит логин и пароль, спокойно вводим и преступаем к деплоингу бота на хероку. Пишем всё в том же терминале.

Теперь возвращаем TOKEN в bot.py, здесь он нужен, ведь мы будем загружать этот файл на хероку.

heroku login #Вводим email и пароль
heroku create --region eu habrparserbot #Не забываемпоменять имя приложения
#P.S. в имени могут быть только буквы в нижнем регитсре, цифры  и тире.
heroku addons:create heroku-redis:hobby-dev -a habrparserbot #И снова меняем имя!
heroku buildpacks:set heroku/python
git push heroku master
heroku ps:scale bot=1 # запускаем бота
heroku logs --tail #включаем логи

Чтобы выключить бота
heroku ps:stop bot

И, не забываем перед залитием на гитхаб и удалить TOKEN из нашего bot.py. Ведь нам не нужно, чтобы кто-то им пользовался. Можно конечно воспользоваться .gitignore и вынести токены в отдельный фай.
Поздравляю!

Работа окончена, бот работает удалённо.

Ссылки


Конечный код бота на гитхабе
API для управления ботом
Про деплоинг
Про pipenv
Большой гайд, возможно кому-то пригодится

Заключение


Если кому-то было интересно, то цель написания статьи выполнена. Если кому-то хочется увидеть статью про более сложного бота (с вебхуками, подключенной БД с настройками пользователей и т.д.) — пишите.UPDATES
UPD1
  • Добавлены якори в содержание.
  • Изменён алгоритм залития кода на гитхаб и хероку.
  • Убрана версия PyTelegramBotAPI, т.к. теперь хероку работает нормально с новыми версиями.

Как создать ботов в Telegram / Хабр

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

Прежде всего, бот для Telegram — это по-прежнему приложение, запущенное на стороне и осуществляющее запрос к Telegram Bot API. Причем API довольное простое — бот использует на определенный URL-адрес, а Telegram отвечает JSON объектом.

Рассмотрим API на примере создания тривиального бота:

1. Регистрация


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

Пишем ему / start и получаем список всех его команд.
Первая и главная — / newbot — отправляем ему и бот просит придумать имя нашему новому боту. Единственное ограничение на имя — оно должно оканчиваться на «бот».В случае успеха BotFather возвращает токен бота и ссылку для быстрого добавления бота в контакты, иначе придется поломать голову именем над.

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

Не забудьте проверить полученный токен с помощью ссылок api.telegram.org/bot / getMe, говорят, не всегда работает с первого раза.

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


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

Telegram позволяет не делать выгрузку сообщений вручную, а поставить webHook, и тогда они сами будут присылать каждое сообщение. Для Python, чтобы не заморачиваться с cgi и потоками, удобно использовать какой-нибудь реактор, поэтому я для реализации выбрал tornado.web. (для GAE удобно использовать связку Python2 + Flask)

Каркас бота:

  URL = "https://api.telegram.org/bot%s/"% BOT_TOKEN
MyURL = "https://example.com/hook"

api = requests.Session ()
приложение = торнадо.веб приложение([
    (r "/", Обработчик),
])

если __name__ == '__main__':
    signal.signal (сигнал.SIGTERM, signal_term_handler)
    пытаться:
        set_hook = api.get (URL + "setWebhook? url =% s"% MyURL)
        если set_hook.status_code! = 200:
            logging.error ("Не удается установить ловушку:% s. Выйти."% set_hook.text)
            выход (1)
        application.listen (8888)
        tornado.ioloop.IOLoop.current (). start ()
    кроме KeyboardInterrupt:
        signal_term_handler (сигнал.SIGTERM, Нет)
  

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

Приложение торнадо для обработки запросов принимает класс tornado.web.RequestHandler, в котором и будет логика бота.

  Обработчик класса (tornado.web.RequestHandler):
        def post (self):
            пытаться:
                logging.debug ("Получил запрос:% s"% self.request.body)
                update = tornado.escape.json_decode (self.request.body)
                message = update ['сообщение']
                текст = message.get ('текст')
                если текст:
                    Ведение журнала.info ("СООБЩЕНИЕ \ t% s \ t% s"% (сообщение ['чат'] ['идентификатор'], текст))

                    если текст [0] == '/':
                        команда, * arguments = text.split ("", 1)
                        response = CMD.get (команда, not_found) (аргументы, сообщение)
                        logging.info ("ОТВЕТИТЕ \ t% s \ t% s"% (сообщение ['чат'] ['идентификатор'], ответ))
                        send_reply (ответ)
            кроме исключения как e:
                logging.warning (str (e))
  

Здесь CMD — словарь доступных команд, а send_reply — функция отправки ответа, которая на вход принимает уже сформированный объект Сообщение.

Собственно, её код довольно прост:

  def send_reply (response):
    если текст в ответе:
        api.post (URL + "sendMessage", данные = ответ)
  

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

3. Команды


Перво-наперво, необходимо соблюсти соглашение Telegram и научить бота бота командам: / start и / help:
  def help_message (arguments, message):
    response = {'chat_id': сообщение ['chat'] ['id']}
    result = ["Привет,% s!" % Сообщение от"].get ("first_name"),
              "\ rЯ могу принять только эти команды:"]
    для команды в CMD:
        result.append (команда)
    response ['text'] = "\ n \ t" .join (результат)
    ответ на ответ
  

Структура сообщение [‘from’] — это объект типа Пользователь, она предоставляет боту информацию как id пользователя, так и его имя. Для ответов же полезнее использовать сообщение [‘chat’] [‘id’] — в случае личного общения там будет Пользователь, а в случае чата — id чата. В противном случае можно получить ситуацию, когда пользователь пишет в чат, а бот отвечает в личку.

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

После этого можно добавить какую-нибудь свою команду, например, / base64:

  def base64_decode (arguments, message):
    response = {'chat_id': сообщение ['chat'] ['id']}
    пытаться:
        ответ ['текст'] = b64decode ("" .join (аргументы) .encode ("utf8"))
    Кроме:
        response ['text'] = "Не могу его расшифровать"
    Ну наконец то:
        ответ на ответ
  

Для пользователей мобильного Telegram, будет полезно сказать @BotFather, какие команды принимает наш бот:
I: / setcommands
BotFather: выберите бота, чтобы изменить список команд.
Я: @ ****** _ бот
BotFather: Хорошо. Отправьте мне список команд для вашего бота. Используйте этот формат:

команда1 — Описание
command2 — Другое описание
Я:
whoisyourdaddy — Информация об авторе
base64 — декодирование Base64
BotFather: Успех! Список команд обновлен. / help

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

4.Свобода


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

UPD: Как верно подсказали, такое пройдет только при личном общении. В чатах боту доставляются только сообщения, начинающиеся с команды (/ ) (https://core.telegram.org/bots#privacy-mode)

  • Все сообщения, начинающиеся с косой черты ‘/’ (см. Команды выше)
  • Сообщения с упоминанием бота под ником
  • Ответы на собственные сообщения бота
  • Служебные сообщения (люди, добавленные или удаленные из группы и т. Д.)

Чтобы бот получал все сообщения в группах пишем @BotFather команду / setprivacy и выключаем приватность.

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

  if text [0] == '/':
    ...
еще:
    response = CMD ["<речь>"] (сообщение)
    logging.info ("ОТВЕТИТЕ \ t% s \ t% s"% (сообщение ['чат'] ['идентификатор'], ответ))
    send_reply (ответ)
  

А потом в список команд добавляем псевдо-речь:
  ОТВЕТОВ = {
    «Привет»: [«Привет!», «Привет!», «Добро пожаловать!», «Привет, {имя}!»],
    «Привет»: [«Привет!», «Привет, {name}!», «Привет!», «Добро пожаловать!»],
    «Привет!»: [«Привет!», «Привет, {name}!», «Добро пожаловать!», «Привет!»],
    «Добро пожаловать»: [«Привет!», «Привет!», «Привет!», «Привет, {имя}!»,],
}
def human_response (сообщение):
    leven = fuzzywuzzy.process.extract (message.get ("текст", ""), RESPONSES.keys (), limit = 1) [0]
    response = {'chat_id': сообщение ['chat'] ['id']}
    если leven [1] <75:
        response ['text'] = "Я вас не понимаю"
    еще:
        ответ ['текст'] = random.choice (RESPONSES.get (leven [0])). format_map (
            {'имя': сообщение ["от"]. get ("first_name", "")}
        )
    ответ на ответ
  

Здесь эмпирическая константа 75 относительно неплохо отражает вероятность того, что пользователь всё-таки хотел сказать.А format_map - удобна для одинакового описания строк как требующих подстановки, так и без нее. Теперь бот будет отвечать на приветствия и иногда даже обращаться по имени.

5. Не текст.


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

Для примера расширим словарь ОТВЕТОВ:

  ОТВЕТОВ ["Который час?"] = ["", "{date} UTC"]
  

И будем отлавливать текст:
  если ответ ['text'] == "":
        ответ ['стикер'] = "BQADAgADeAcAAlOx9wOjY2jpAAHq9DUC"
        del response ['текст']
  

Видно, что теперь структура Сообщение уже не содержит текст, поэтому необходимо модифицировать send_reply:
  def send_reply (response):
    если в ответ «стикер»:
        api.сообщение (URL + sendSticker, данные = ответ)
    elif 'text' в ответ:
        api.post (URL + "sendMessage", данные = ответ)
  

И все, теперь бот будет время от времени присылать стикер вместо времени:

6. Возможности


Благодаря удобству API и быстрому старту боты Telegram может стать хорошей платформой для работы своих действий, настройки уведомлений, создания викторин и соревнований на основе задач (CTF, DozoR и прочие).

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

7. Ограничения


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

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

  while True:
            r = запросы.get (URL + "? offset =% s"% (last + 1))
            если r.status_code == 200:
                для сообщения в r.json () ["результат"]:
                    last = int (сообщение ["update_id"])
                    request.post ("http: // localhost: 8888 /",
                                  data = json.dumps (сообщение),
                                  заголовки = {'Content-type': 'application / json',
                                           'Принять': 'текст / обычный'}
                     )
            еще:
                Ведение журнала.предупреждение ("FAIL" + r.text)
            время сна (3)
  

П.С. По 7 нашел удобное решение - размещение бота не у себя, а на героку, благо все имена вида * .herokuapp.com защищены их собственным сертификатом.

UPD: Telegram улучшил Боти, из-за чего, теперь не обязательно иметь отдельную функцию для отправки сообщений при установленном вебхуке, а в ответ на запрос POST можно отвечать тем же сформированным JSON с ответным сообщением, где одно из полей устанавливается как ч 'method': 'sendMessage' (или любой другой метод, использованный ботом).

.

Документация Telegram: Боты

Боты - специальные аккаунты в Telegram, созданные для того, чтобы автоматически обрабатывать и отправлять сообщения. Пользователи могут взаимодействовать с ботами при помощи сообщений, отправляемых через обычные или групповые чаты. Логика бота контролируется при помощи HTTPS-запросов к нашему API для ботов.

Общие сведения

Что могут делать боты?

Вот несколько примеров использования ботов:

  • Интеграция с другими сервисами. Например, бот может отправлять комментарии или управлять «умным домом». Или, например, отправить вам уведомление при совершении какого-то действия или события (Примеры: GitHub Bot, Image Bot).
  • Утилиты и инструменты. Бот может отображать погоду, переводить тексты или предупреждать запрос о предстоящих событиях по вашему (Например: бот опросов).
  • Одно- и многопользовательские игры. Бот может поиграть с вами в шашки или шахматы, проводить викторины и так далее.(Пример: викторина-бот).
  • Социальные сервисы. Бот может находить вам собеседника, запустить на ваших общих интересах и увлечениях. (Пример: HotOrBot).
  • Все, что вам захочется. Бота можно запрограммировать для чего угодно. Разве что посуду они помыть не мило.

Как работают боты?

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

Самое интересное в роботах это то, что для их создания вам не нужно изучать низкоуровневые методы работы с MTProto и шифрованием - общение с роботом организовано при помощи обычного интерфейса HTTPS с упрощёнными методами Telegram API. Мы назвали его Bot API.

Примечание

Рекомендуем также ознакомиться с подробным описанием Bot API.

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

Для этого есть ... Бот. Просто напишите пользователю @BotFather и следуйте его инструкциям.Как только вы создали бота и получили свой ключ (токен) авторизации, переходите в раздел документации Bot API, чтобы начать настройку вашего бота.

Чем бот отличается от обычного аккаунта?

  • У роботов нет статусаов «онлайн» и «был в сети», вместо этого отображается надпись «бот».
  • Для ботов выделено ограниченное место на серверах - все сообщения будут удалены по прошествии установленного срока после обработки.
  • Боты не могут сами начать общение с пользователя.Пользователь должен либо добавить робота в группу, либо первым начать с ним диалог. Для этого можно использовать ссылки вида t.me/ или поиск по имени пользователя.
  • Имя пользователя у робота должно заканчиваться на «бота» (например, @controllerbot).
  • При добавлении в конференцию, по умолчанию робот не получает всех сообщений (см. Режим приватности).
  • Роботы никогда не спят, не едят и не жалуются (если только вы не запрограммируете их на обратное).

Суперспособности

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

Инлайн-режим

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

Подробнее о встроенном режиме в блоге »

Игры

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

Под капотом у игр - HTML5, поэтому вы можете создать игры любой сложности.На данный момент командой Telegram создано несколько демо-игр:

Подробнее об играх в Telegram »

Клавиатуры

Одна из самых необычных возможностей Bot API - кастомизированные клавиатуры . При передаче данных ответа есть возможность передать команду на программном интерфейсе клавиатуры с предустановленным сервером ответа (см. ReplyKeyboardMarkup). Клиент Telegram, получив сообщение, отобразит пользователю вашу клавиатуру. Нажатие на услуги сразу же отправит на сервер соответствующую команду.Таким образом можно значительно упростить взаимодействие робота с пользователем. На момент для показа на клавише данный проект эмодзи и текст. Вот несколько примеров таких клавиатур:

За более подробной информацией обращайтесь к описанию метода sendMessage.

Команды

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

  / команда [необязательный] аргумент]  

Команда должна начинаться с символа косой черты «/» и не может быть длиннее 32 символа.Команды могут состоять из букв латинского алфавита, цифр и подчёркивания. Несколько примеров:

  / get_messages_stats
/ set_timer 10мин будильник!
/ get_timezone Лондон, Великобритания  

Сообщения, начинающиеся с косой черты, будут всегда доставляться боту (точно также, как и при ответе на его сообщения и на & commat; упоминания бота в чате). Приложения Telegram будут:

  • Предлагать список поддерживаемых команд с их описанием, когда пользователь введет символ косой черты «/» (чтобы этот пункт работал, вам необходимо задать описание команд у @BotFather).Нажатие на описание приведёт к отправке этой команды.
  • Показывать кнопку (/) в поле ввода текста во всех чатах с ботами. Нажатие на эту кнопку выставит список доступных команд.
  • Подсвечивать / команды в сообщениях. При нажатии на такую ​​подсвеченную команду, она будет сразу же отправлена ​​боту.

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

  / старт @ TriviaBot
/ start @ ApocalypseBot  

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

Глобальные команды

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

  • / start - начинает общение с пользователем (например, отправляет приветственное сообщение). В эту команду также можно предоставить дополнительные аргументы (см. Внешнее связывание).
  • / help - отображает сообщение с помощью по команде.Оно может представлять собой короткое сообщение о вашем боте и список доступных команд.
  • / settings - (по возможности) возвращает список методов и команды для их изменений.

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

Режим приватности

Ботов часто добавлять в группы, чтобы получать различную информацию - новости, уведомления и т.д. Однако, при добавлении бота вы наверняка спрашивали себя: «А что если этот маленький засранец пересылает всю групповую переписку куда-то« налево »?» Именно поэтому у роботов есть режимы приватности .

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

  • Сообщения, начинающиеся с символами косой черты "/" (см. Раздел Команды)
  • Сообщения, содержащее @ упоминание бота
  • Ответы на сообщения бота
  • Служебные сообщения (о добавлении пользователя, смены изображения группы и т.д.)

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

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

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

Внешнее связывание

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

У каждого робота есть ссылка, при помощи которой можно начать с ним диалог - https: // t.мне / <имя бота> . К этой ссылке можно добавить параметры * start или startgroup длиной до 64 символов. Пример:

  https://t.me/triviabot?startgroup=test  

Допустимо использование символов A – Z , a – z , 0–9 , _ и . Мы рекомендуем использовать base64url для кодирования параметров.

Переход по ссылке с параметром start начинает чат с ботом, при этом в поле ввода текста будет кнопка СТАРТ.При переходе по ссылке с параметром startgroup пользователю будет предложено добавить бота в одну из доступных групп. Как только пользователь подтвердит свое действие (нажмёт на кнопку СТАРТ или выберет группу), бот получит сообщение следующего формата:

  / начало PAYLOAD  

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

Пример реализации внешнего связывания

Предположим, сайт пример.com хочет отправить пользователю уведомления с помощью Telegram-бота. Ниже приведено описание действий для реализации отправки уведомлений пользователю с ID 123 .

  1. Создайте бота с любым именем, например, @ExampleComBot
  2. Настройте вебхук для входящих сообщений
  3. Сгенерируйте ключ достаточной длины, напр. $ memcache_key = 'ТЕСТКЛЮЧ'
  4. Запишите значение 123 с ключом $ memcache_key в Memcache на 3600 секунд (один час)
  5. Отправьте пользователю ссылку https: // t.я / ExampleComBot? start = ТЕСТКЛЮЧ
  6. Настройте обработчик веб-хуков так, чтобы он запрашивал в Memcached значение входящего каждый раз, когда приходит сообщение, начинающееся со / start . Если ключ существует, записываем chat_id, переданный на веб-хук, в telegram_chat_id для пользователя 123 . Удаляем ключ из Memcache.
  7. Теперь, если мы хотим отправить сообщение пользователю 123 , сначала проверяем telegram_chat_id .Если оно существует, используйте метод sendMessage, чтобы отправить пользователю сообщение.

BotFather

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

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

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

Имя (имя) будет в контактах и ​​чатах.

Имя пользователя - короткое имя на латинице, которое используется для упоминаний бота и в ссылках на профиль в telegram.me. Имя пользователя должен состоять из букв латинского алфавита, подчёркиваний и цифр и быть длиной от 5 до 32 символов. Также имя пользователя обязательно должно заканчиваться на «бот», например: «tetris_bot» или «TetrisBot».

Ключ (токен) это набор символов вида 110201543: AAHdqTcvCh2vGWJxfSeofSAs0K5PALDsaw , который нужен, чтобы получать и отправлять сообщения с помощью Bot API.

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

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

Настройки

  • / setname - Изменить имя робота.
  • / setdescription - Изменить description Робота, представляющая собой короткий текст с описанием бота. Пользователи увидят его в самом начале, под заголовком «Что умеет этот робот?».
  • / setabouttext - Изменить информацию о боте, ещё более короткий текст, отображаемый в профиле бота.Ещё, если кто-то поделится вашим ботом, то вместе со ссылкой на него отправится этот текст.
  • / setuserpic - Изменить аватарку бота. Картинки - всегда хорошо.
  • / setcommands - Изменить список команд бота. Каждая команда состоит из собственно командного слова, начинающегося с символом косой черты («/») и короткого описания. Пользователи увидят список команд при вводе символа «/».
  • / setjoingroups - Определение, можно ли добавок вашего бота в группы.
  • / setprivacy - Определяет, все ли сообщения видит ваш бот в группах. В выключенном состоянии роботу будут отправляться все сообщения.
  • / deletebot - Удалить бота и его имя пользователя.
Совет

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

.

Пишем telegram-бота на python с помощью библиотеки telebot часть 1 / Хабр

Лирическое отступление


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

Установка и настройка


Для начала давайте скачаем сам питон. Сделать это можно на официальном сайте. Не забудьте поставить галочку добавить в PATH во время установки! После установки python'a нам понадобится хороший редактор кода.На помощь приходит компания JetBrains со своим бесплатным PyCharm. Мы уже близко, осталось скачать библиотеку telebot. Для этого заходим в командную строку и пишем:
  pip install pytelegrambotapi  

Если всё прошло успешно, мы продолжаем!

VPN


Думаю все знают о блокировке телеграммы в России и единственным решением как всегда остаётся vpn. Лично я рекомендую Windscribe, т.к. вам дают 2 гб. трафик совершенно бесплатно!

Отец бота


В поиске телеграммы находим Bot Farher'a и создаем свое бота с помощью команды / newbot.Затем вводим имя и юзернейм. Обратите внимание, что юзернейм должен оканчиваться на бота!

Как вы видите выдали специальный API токен, с помощью которого вы управляете своим ботом (в моём случае это: 776550937: AAELEr0c3H6dM-9QnlDD-0Q0Fcd65pPyAiM ). Свой токен Вы можете запомнить, но я рекомендую его записать.

Код


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

Тут рекомендую поставить всё как у меня (название, конечно можно изменить).После создания проекта, давайте создадим файл, в котором будет наш код. Кликните правой кнопкой по вашему проекту, затем New → Python File. Отлично, начнем писать код. Импортируем библиотеку telebot, с помощью:

  import telebot  

Теперь нужно создать переменную бот. Я привык писать бота.
  bot = telebot.TeleBot ('ваш токен')  

Напишем декоратор bot.message_handler (), с помощью которого наш бот будет реагировать на команду / start.Для этого в круглых скобках пишем commands = ['start']. В итоге у нас должно получиться это:
  @ bot.message_handler (commands = ['start'])  

Если Вы попробуете запустить свой бота (ПКМ-> Run), то у вас ничего не выйдет. Во-первых, в конце кода мы должны прописать bot.polling (). Это нужно для того, чтобы бот не выключился сразу, а работал и проверял, нет ли на сервере нового сообщения. А во второй наш бот если уж и будет проверять наличие сообщений, то всё равно ничего не ответить.Пора это исправлять! После нашего декоратора создаем функцию start_message, которая будет принимать параметр сообщение (название функции может быть любым). Далее давайте реализуем отправку сообщения от самого бота. В функции пропишем bot.send_message (message.chat.id, 'Привет, ты написал мне / start'). Смотрите, что у Вас должно получиться:
  import telebot

bot = telebot.TeleBot ('776550937: AAELEr0c3H6dM-9QnlDD-0Q0Fcd65pPyAiM')

@ bot.message_handler (commands = ['start'])
def start_message (сообщение):
    бот.send_message (message.chat.id, 'Привет, ты написал мне / start')

bot.polling ()  

Проверим…

Отлично, наш бот работает! Чтобы он отвечал не только на команды, но и на сообщения, создадим новый декоратор bot.message_handler (), а в круглые скобочки напишем content_types = ['text']. Вообще существует множество видов контента, к примеру местоположение, фото, аудио, наклейка и т.д. Но нам же нужно отвечать на текст, верно? Поэтому создаём функцию send_text, принимающую параметр message.В функции пропишем условие:

  @ bot.message_handler (content_types = ['text'])
def send_text (сообщение):
    if message.text == 'Привет':
        bot.send_message (message.chat.id, 'Привет, мой создатель')
    elif message.text == 'Пока':
        bot.send_message (message.chat.id, 'Прощай, создатель')  

Если текст сообщения будет равен «Привет», то бот отвечает «Привет, мой создатель», а если текст сообщения будет равен «Пока», то бот ответит «Прощай, создатель». Тут думаю всё понятно.Но вы скорее всего задались вопросом, а если пользователь пропишет «привет», ну или «пРиВет», как быть в ситуации? Всё достаточно просто! В условии, после message.text напишите функцию .lower (), а в тексте все заглавные буквы замените на строчные. Теперь наш бот отвечает не только на «привет», но и на «ПривеТ», и даже «пРиВеТ».

Вот что у вас должно получиться:

  import telebot

bot = telebot.TeleBot ('776550937: AAELEr0c3H6dM-9QnlDD-0Q0Fcd65pPyAiM')

@bot.message_handler (commands = ['начало'])
def start_message (сообщение):
    bot.send_message (message.chat.id, 'Привет, ты написал мне / start')

@ bot.message_handler (content_types = ['текст'])
def send_text (сообщение):
    if message.text.lower () == 'привет':
        bot.send_message (message.chat.id, 'Привет, мой создатель')
    elif message.text.lower () == 'пока':
        bot.send_message (message.chat.id, 'Прощай, создатель')

bot.polling ()  

Отлично, с текстом мы разобрались, но как же отправить к примеруер? Всё просто! У каждого стикера есть свой id, соответственно зная id, мы сможем его отправить.Получить id стикера можно двумя способами. Первый (простой) - через специальную бота «Какой у стикера?»

Ну и второй способ, для тех, кто не ищет лёгких путей. Создаем новый декоратор bot.message_handler (), вот только в скобочки пишем content_types = ['стикер']. Далее всё как обычно. Создаем функцию, принимающую параметр сообщение, а вот в ней пропишем печать (сообщение). Запускаем бота.

Смотрите, как только я отправил стикер, он сразу же вывел информацию в консоль, и в самом конце будет наш id стикера (file_id).Давайте сделаем так, чтобы когда пользователь отправил боту «я тебя люблю», то бот ему ответил стикером. Создавать новый декоратор не нужно, мы просто допишем условие, которое было до этого. Вот только вместо bot.send_message () пропишем bot.send_sticker (), а вместо текста напишем id стикера.

Поздравляю, всё получилось! Думаю как отправить аудио, фото, и геолокацию, вы разберетесь сами. Я же хочу показать вам, как сделать клавиатуру, которую бот покажет вам при старте. Это уже будет сделать сложнее.Создаем переменную keyboard1, в которую запишем telebot.types.ReplyKeyboardMarkup (). Эта функция вызывает клавиатуру. Далее создадим ряды, но помните, что рядов может быть не больше 12! Для того, чтобы их создать, пишем keyboard1.row (). В круглые скобочки запишите всё что хотите, лично я напишу «Привет» и «Пока». Теперь, чтобы вызвать клавиатуру, допишем reply_markup = keyboard1 к отправке сообщений при старте. Вот, что у вас должно получиться:

  keyboard1 = telebot.types.ОтветитьKeyboardMarkup ()
keyboard1.row ('Привет', 'Пока')

@ bot.message_handler (commands = ['start'])
def start_message (сообщение):
    bot.send_message (message.chat.id, 'Привет, ты написал мне / start', reply_markup = keyboard1)  

Запускаем бота…

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

  keyboard1 = telebot.types.ReplyKeyboardMarkup (True, True)  

Ну а на этом всё! Конечно, это не все возможно ботов в Telegram, но основные возможности я вам показан. Спасибо за внимание.

Исходный код:

  импортный телебот

bot = telebot.TeleBot ('<ваш токен>')
keyboard1 = telebot.types.ReplyKeyboardMarkup ()
keyboard1.row ('Привет', 'Пока')

@ bot.message_handler (commands = ['start'])
def start_message (сообщение):
    бот.send_message (message.chat.id, 'Привет, ты написал мне / start', reply_markup = keyboard1)

@ bot.message_handler (content_types = ['текст'])
def send_text (сообщение):
    if message.text.lower () == 'привет':
        bot.send_message (message.chat.id, 'Привет, мой создатель')
    elif message.text.lower () == 'пока':
        bot.send_message (message.chat.id, 'Прощай, создатель')
    elif message.text.lower () == 'я тебя люблю':
        bot.send_sticker (message.chat.id, 'CAADAgADZgkAAnlc4gmfCor5YbYYRAI')

@bot.message_handler (content_types = ['стикер'])
def sticker_id (сообщение):
    печать (сообщение)

bot.polling ()  

Если у вас возникли вопросы - можете мне написать в телеграмме Димагоровцов

.

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

6 апреля 2016 г., Python, 320355 просмотров

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

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

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

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

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

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

Telegram bot

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

Python Planet бот

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

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

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

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

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

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

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

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

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

Подробнее о получить Обновления и установитьWebhook можно почитать соответственно здесь и тут.

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

  pip install telepot  

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

  импортный телепот
токен = '123456'
TelegramBot = телепот.Бот (токен)
распечатать TelegramBot.getMe ()
  

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

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

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

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

Telegram Bot

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

  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}]
  

Процесс общения с телеграммой ботом происходит по HTTPS; для передачи данных используется JSON. Метод getUpdates возвращает список / массив из объектов типа Update. Внутри Обновить находится объект Сообщение.Для стандартного взаимодействия с ботом нас фактически интересует именно объект Сообщение, у которого мы считываем текст атрибутов, хранящий в себе текст, переданный боту и объект чат, в котором лежит информация о пользователе, инициировавшем общение с нашим Telegram ботом. Также имеется параметр update_id, который служит в качестве смещения параметра при вызове метода 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 выглядит вот так:

  # - * - кодировка: utf8 - * -
from xml.etree import cElementTree
запросы на импорт
def parse_planetpy_rss ():
    "" "Анализирует первые 10 элементов из http://planetpython.org/rss20.xml
    "" "
    response = requests.get ('http://planetpython.org/rss20.xml')
    parsed_xml = cElementTree.fromstring (response.content)
    items = []
    для узла в parsed_xml.iter ():
        если node.tag == 'item':
            item = {}
            для item_node в списке (узле):
                если item_node.tag == 'title':
                    item ['title'] = item_node.text
                если item_node.tag == 'ссылка':
                    item ['ссылка'] = item_node.text
            items.append (элемент)
    вернуть товары [: 10]
  

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

  TOKEN = ''
TelegramBot = telepot.Bot (ТОКЕН)
def _display_help ():
    вернуть render_to_string ('help.md')
def _display_planetpy_feed ():
    return render_to_string ('feed.md', {'items': parse_planetpy_rss ()})
класс CommandReceiveView (Просмотр):
    def post (self, request, bot_token):
        если bot_token! = ТОКЕН:
            return HttpResponseForbidden ('Недействительный токен')
        commands = {
            '/ start': _display_help,
            'help': _display_help,
            'feed': _display_planetpy_feed,
        }
        пытаться:
            полезная нагрузка = json.загружает (request.body.decode ('utf-8'))
        кроме ValueError:
            return HttpResponseBadRequest ('Неверное тело запроса')
        еще:
            chat_id = полезная нагрузка ['сообщение'] ['чат'] ['идентификатор']
            cmd = payload ['message']. get ('text') # команда
            func = commands.get (cmd.split () [0] .lower ())
            если func:
                TelegramBot.sendMessage (chat_id, func (), parse_mode = 'Markdown')
            еще:
                TelegramBot.sendMessage (chat_id, 'Я вас не понимаю, сэр!')
        вернуть JsonResponse ({}, статус = 200)
    @method_decorator (csrf_exempt)
    def dispatch (self, request, * args, ** kwargs):
        вернуть super (CommandReceiveView, self) .dispatch (запрос, * аргументы, ** kwargs)
  

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

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

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

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

http: //127.0.0.1: 8000 / planet / b ... BOT_TOKEN /

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

Postman REST Client telegram-bot-postman

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

Postman и Telegram Postman и Telegram

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

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

.

Об авторе

alexxlab administrator

Оставить ответ