Добавить нового бота в Телеграм очень просто. В последнее время этот вопрос актуален для пользователей мессенджера. Это неудивительно, потому что функционал ботов очень разнообразен. Изготавливать их тоже не очень сложно, простого Телеграм-бота с элементарными функциями можно сделать и добавить самому.
Если вы обладаете хотя бы начальными навыками программирования, то функционал работа можно значительно расширить.
Рекомендуем нашу статью о самостоятельном создании Телеграм-ботов.
Программные помощники умеют массу полезного. С их помощью можно находить музыку, фильмы, книги и другую полезную информацию. Есть Телеграм-боты, которые добавляются в групповые чаты и могут озвучивать текстовые сообщения. Масса роботов — хорошие посредники для различных сервисов, компаний и банков.
Свои собственные боты есть у «Сбербанка», «Почты России», «OneTwoTrip», «Связного», «Медузы» и многих других.
Помимо них есть ещё сотни тысяч роботов поменьше, общая аудитория которых насчитывает десятки миллионов пользователей.
Доступность, простота и эффективность Телеграм-ботов сделали их крайне популярными среди пользователей. Поговорим о том, что это такое и как ими пользоваться.
Специально для жителей РФ: рекомендуем бота TeleBot, который раздает надежные, быстрые и бесплатные MTProxy для обхода блокировки Telegram.
Содержание:
Для обычных пользователей роботы работают через диалоги прямо в Телеграм. Нужного можно найти через строку поиска. Лучше всего использовать для этого имя, оно всегда начинается с «@» и заканчивается на «…bot», например, @PollBot — помощник для создания голосований.
В этом случае предполагается, что вы уже знаете конкретное имя робота, которого хотите добавить. Если же нет, вам помогут подборки и каталоги, такие как наш.
Рекомендуем к обязательному прочтению нашу огромную подборку лучших ботов для Телеграм.
Чтобы активировать помощника, нужно начать с ним диалог нажатием кнопки «Start». В дальнейшем большинство функций будут доступны именно через окно беседы. Но есть, например, @gif (для поиска гифок) или @vkmusic_bot (для поиска музыки) — их можно вызывать в диалоге с вашим собеседником, для чего нужно напечатать символ «@».
Больше музыкальных ботов вы найдете в специальном разделе нашего Каталога.
В окне беседы можно общаться с Телеграм-ботом, вводя команды или нажимая на кнопки. Если кнопки не предусмотрены, а команд вы не знаете, просто напечатайте в поле набора сообщения слеш «/». После этого появится всплывающее меню с подсказками, где будут видны команды, которые можно добавить.
Варианты команд на примере одного из популярных ботов для проксиПомимо этого, лучше знать несколько универсальных команд, которые работают практически во всех ботах:
Бот — это программный продукт, который использует облачные сервера Телеграм для работы. Поэтому их работоспособность может влиять на скорость реакции на команды. Чаще всего, если робот долго не отвечает на команды, то проблема именно в этом. Единственное, что можно сделать в этом случае — немного подождать, пока работа не возобновится.
Другой причиной может быть ошибка в процессе разработки Телеграм-бота, которую допустил программист. Если компания-владелец перестала поддерживать бот-сервис, то программный помощник скорее всего не будет откликаться на команды.
Это хороший инструмент для администраторов каналов и групп.
Если вы ведёте свой канал, вам могут пригодиться боты для автоматического и отложенного постинга.
Это значительно облегчает администрирование и позволяет удобно и оперативно вести даже несколько каналов сразу.
Боты для каналов и чатов также позволяют устраивать голосования, добавлять другой интерактив, банить участников в автоматическом режиме и облегчать жизнь администратора другими способами.
Для того чтобы использовать бота, нужно добавить его в администраторы Телеграм канала или в чат. После этого, в некоторых случаях, может понадобиться назначить ему необходимые права.
Узнайте о том, как добавить админа в Телеграм-канал.
Подробнее о ботах для групп и каналов мы уже писали. Надеемся, что вы найдёте в этой статье что-то полезное.
Сегодня мессенджер Телеграм набирает все большую популярность. У многих он стал ассоциироваться именно с ботами. Связано это с тем, что некоторые руководители каналов/групп не могут представить свою работу в Telegram без роботов-помощников, которые значительно облегчают нашу жизнь.
Именно об этом мы и поговорим в нашем сегодняшнем материале.
Давайте для начала определимся, что это такое? Бот – это программа (строчки кода), написанная программистом в целях выполнения определенных задач.
Телеграм никак не ограничивает использование роботов. Поэтому, они способны практически на все. При достаточных навыках программиста он может создать программу практически любой сложности.
Итак, судя по тому, что боты способны практически на все, можно назвать первую причину, зачем люди их подключают – расширение возможностей. То есть, они привносят в мессенджер то, чего раньше не было.
Хорошим примером является бот-статистик. Он умеет собирать статистику по каналу или его участникам, а затем по запросу руководителя он ее показывает. Это очень удобно, особенно когда вы беспокоитесь о дальнейшей стратегии развития. Ведь полученные данные помогут определить целевую аудиторию, какой контент более интересен людям и многое другое. В самом же Телеграм такого инструмента нет.
Люди часто используют ботов именно для того, чтобы автоматизировать некоторые рабочие процессы. Особенно это касается рутинной работы. Ведь гораздо проще перекинуть все на программу, которая будет выполнять эти задачи гораздо быстрее и качественнее, а в это время мы можем заняться более важными делами или отдохнуть. Это значительно упрощает нашу работу с Телеграм.
Например, чат-боты, которые способны общаться с людьми. Их можно настроить так, что они будут сами отвечать на большинство часто задаваемых вопросов. И в этой ситуации довольны все, и клиенты, получивший ответ на свой вопрос, и вы, так как вам не пришлось тратить на это свое время.
Все готовые боты – бесплатны. Вам не нужно их покупать или платить за их использование. Такова политика Телеграм. Если же вы столкнулись с тем, что вам пытаются продать, то не стоит на это вестись.
Платными программы могут быть только в случае, если вы заказываете их разработку у профессионалов. Например, вы не нашли бота с нужным функционалом и поэтому, обращаетесь к программистам.
Давайте попробуем подключить какого-нибудь бота. Для примера возьмем довольно интересного кандидата под названием Shmalala Bot. Это чат-бот, способный поднять настроение всему чату, он будет рассказывать интересные истории и многое другое.
Ниже приведена инструкция, просто следуйте ей:
Готово! Теперь робот должен работать. Он будет периодически отправлять сообщения в чат.
В примере выше мы подключали готового бота. Мы хотим также показать вам, как сделать своего бота в конструкторе и подключить его. В качестве конструктора мы будем использовать ManyBot.
Данный процесс будет несколько сложнее, но не настолько, чтобы он вызвал какие-либо трудности.
Итак, для примера мы попробуем создать бота, который будет автоматически постить новости с сайта в Телеграм-канал.
Готово. Наш помощник создан и настроен. И все что осталось сделать – это добавить его в нужный канал/группу и назначить администратором.
С персональным компьютером и десктопной версией Телеграм разобрались. Теперь давайте поговорим о мобильных устройствах. Попробуем проделать те же самые действия, только на смартфоне.
Итак, для начала давайте попробуем снова подключить нашу Shmalala Bot.
Готово! Теперь она будет общаться с вами и с остальными участниками группы.
Ну и напоследок попробуем настроить все тот же автопостер, который будет публиковать все новости, которые публикуются на сайте.
Чтобы автопостинг начался, добавьте бота в канал/группу и назначьте админом.
Готово! Как видите, процесс настройки на ПК и на мобильной версии мало чем отличается. Самое большое отличие – это интерфейс.
При подключении роботов в Телеграм у вас могут возникнуть определенные проблемы и вопросы. Мы постарались дать ответы на некоторые из них.
Сегодня мы поговорили с вами на тему подключения ботов в Телеграм. Теперь вы знаете, зачем и как это делается. И ваша задача – использовать полученную информацию. Надеемся, статья была полезной.
Оцените текст:
[Всего: 4 Средний: 5/5]
Комментарии: 95Публикации: 268Регистрация: 15-05-2014
Telegram Messenger самый совершенный и технологически продвинутый месеенджер для телефонов и планшетов, который набирает все большую популярность среди пользователей Рунета. В чем секрет успеха этого приложения спросите вы — отличная и стабильная работа, разнообразные фишки которых нет у конкурирующих мессенджеров. Одной из таких опция являются Боты в Телеграмм. Это по сути программа которая отвечает вам на нужные запросы.
Вам достаточно знать список фраз, на которые роботы в Telegram реагируют и дают ответы. Самые популярные боты это — Робот Антон — @telerobot, который может вам подсказать погоду, курс валюты, русифицировать ваш Телеграмм, также он в курсе всех новостей в мире, спорте, культуре, науке и многое другое. Тажке вы сможете узнать какие события или мероприятия планируются в вашем городе.
Telegram Bots — это функция присущая только мессенджеру Телеграмм. Давайте рассмотрим какие еще боты есть в телеграмме и как их добавить в свой список контактов.
Робот Антон — @telerobot может отвечать на следующие команды :
Не для кого не является секретом что Telegram Открыл платформу для свободного создания ботов. По сути это приложение которое функционирует на ваше стороне, и осуществляет запросы к Telegram API. Причем API довольное простое — бот обращается на определенный URL с параметрами, а Telegram отвечает JSON объектом. более подробная инструкция по созданию ботов описана на Хабре. Вы можете ознакомиться с инструкцией по ссылке.
Telegram – самый популярный и динамично развивающийся мессенджер, который успешно работает на всех основных платформах, фактически не отличаясь по внешнему виду, функциям.
Прогрессивный подход разработчиков позволяет использовать «телегу» не только для общения, обмена новостями или файлами. При помощи «Телеграма» можно заниматься продвижением брендов.
Помощниками при работе с приложением служат роботы – автоматические программы, заточенные создателями под определенные задачи. Разобраться, как добавить бота в Телеграмме и использовать его возможности по максимуму, может практически каждый, как на iPhone, так и на Андроид.
По своей сути bot – это реализованный программно алгоритм, поддерживающий беседу с живым человеком. Руководствуется он ключевыми запросами и параметрами.
Боты в Телеграме.
Здесь помогают элементы искусственного интеллекта: сообщения анализируются по ключам, а ответ выбирается из сформированной базы данных.
Современные хелперы справляются с консультированием клиентов по стандартным ситуациям не хуже реальных сотрудников. И не всегда понятно, кто скрывается за аватаркой: человек или автомат.
С готовыми чатами работать несложно. Сперва помощника нужно найти, после чего открывается ряд возможностей.
Чат-бота допустимо:
При необходимости можно создать своего собственного хелпера, придумав ему имя и очертив круг задач. Осваивать работу нужно от простого к сложному.
Чтобы добавить бота в канал Telegram, необходимо сделать три шага:
Важно! Автомат сможет присоединиться к беседе, если эту функцию для сторонних пользователей не заблокировал автор.
Вся процедура добавления не занимает более двух минут. Немного сложнее будет процесс настройки под конкретные установки.
Найти робота можно при помощи @StoreBot или в каталоге ботов на различных сайтах.
Обычно о принадлежности бота к той или иной категории говорит его название. Но не всегда по имени можно догадаться о функции помощника. Получить информацию помогут каталоги.
Если надо предоставить возможность участникам какой-либо группы взаимодейст-вовать с ботом, то понадобится для начала добавить бота в группу. Для этого переходят к настройкам самой группы и выбирают «Add member». Далее через поиск находят определенного бота и добавляют его к чату.
Создание своего бота в Телеграме.
Подключить бот в Телеграм – дело минутное. Создать же помощника можно на разных сервисах на платной и свободной основе. Традиционный способ – через интегрированный в мессенджер сервис.
Как выглядит процесс пошагово:
После завершения процесса создатель получает ссылку, по которой можно подключить бота к телеграм-каналу или добавить пользователей из своего контакт-листа.
Обратите внимание! Создавать новые чаты лучше на ПК, чтобы было удобнее использовать дополнительные файлы.
Чаты используют серверы программы в облачных хранилищах, именно их производительность оказывает влияние на реакцию. Поэтому при зависании помощника поможет время. Если же программист, задающий код на Java, допустил просчет, или владелец прекратил поддержку «автоответчика», придется поискать более работоспособный код.
Помимо автоматического информирования у роботов есть ряд дополнительных функций.
Использование бота в Телеграм.
Они могут сделать:
Если добавить бота в администраторы канала Telegram, помощник сможет работать админом в реальном времени.
Доступными будут такие функции:
Плюсы такого администрирования: человек работает с программой в удобное время, а робот с аудиторией – в нужное, избавляя своего создателя от много-кратного дублирования одинаковых действий. Хороший код может фактически вести сайт или аккаунт.
Работа с ботами универсальна на Айфоне, устройствах на Android и стационарных компьютерах. С помощью хелперов можно осуществлять продажи, получать дополнительный доход на продвижении брендов или консультировании клиентов.
Детальная инструкция видна на видео:
Боты — специальные аккаунты в Telegram, созданные для того, чтобы автоматически обрабатывать и отправлять сообщения. Пользователи могут взаимодействовать с ботами при помощи сообщений, отправляемых через обычные или групповые чаты. Логика бота контролируется при помощи HTTPS запросов к нашему API для ботов.
Вот несколько примеров использования ботов:
Как уже было сказано ранее, роботы — особые аккаунты, которые не требуют номера телефона при создании. По сути, эти аккаунты играют роль интерфейса к вашему сервису, который работает на удалённом сервере.
Самое интересное в роботах это то, что для их создания вам не нужно изучать низкоуровневые методы работы с MTProto и шифрованием — общение с роботом организовано при помощи обычного HTTPS интерфейса с упрощёнными методами Telegram API. Мы назвали его Bot API.
ПримечаниеРекомендуем также ознакомиться с подробным описанием Bot API.
Для этого есть… Бот. Просто напишите пользователю @BotFather и следуйте его инструкциям. Как только вы создали бота и получили свой ключ (токен) авторизации, переходите в раздел документации Bot API, чтобы начать настраивать вашего бота.
t.me/<bot_username>
или поиск по имени пользователя.У роботов Telegram есть много уникальных возможностей — например, кастомизированные клавиатуры, дополнительные интерфейсы для команд по умолчанию, внешнее связывание и специальные режимы приватности для групп.
Пользователи могут общаться с вашим ботом напрямую из поля ввода сообщения — из любого чата или группы. Для этого нужно всего лишь набрать имя пользователя вашего бота и запрос для поиска. Получив запрос, бот может возвратить какие-либо результаты. Как только пользователь нажмёт на один из них, он сразу же отправится в чат. Таким образом можно запрашивать контент от бота в чатах, группах или каналах.
Подробнее о встроенном режиме в блоге »
С помощью ботов пользователи могут играть в HTML5-игры в группах или приватных чатах. Игровая платформа Telegram поможет составить таблицу рекордов и оповещать пользователей об изменении рейтинга.
Под капотом у игр — HTML5, поэтому вы можете создавать игры любой сложности. На данный момент командой Telegram созданы несколько демо-игр:
Подробнее об играх в Telegram »
Одна из самых необычных возможностей Bot API — кастомизированные клавиатуры. При передаче сервером ответа есть возможность передать команду на отображение специальной клавиатуры с предустановленными вариантами ответа (см. ReplyKeyboardMarkup). Клиент Telegram, получив сообщение, отобразит пользователю вашу клавиатуру. Нажатие на клавишу сразу же отправит на сервер соответствующую команду. Таким образом можно значительно упростить взаимодействие робота с пользователем. На данный момент для отображения на клавише могут использоваться эмодзи и текст. Вот несколько примеров таких клавиатур:
За более подробной информацией обращайтесь к описанию метода sendMessage.
Команды представляют собой более гибкий способ общения с ботом. Рекомендуется следующий синтаксис:
/команда [необязательный] [аргумент]
Команда должна начинаться с символа косой черты «/» и не может быть длиннее 32 символов. Команды могут состоять из букв латинского алфавита, цифр и подчёркивания. Несколько примеров:
/get_messages_stats
/set_timer 10min Alarm!
/get_timezone London, UK
Сообщения, начинающиеся с косой черты, будут всегда доставляться боту (точно также, как и при ответе на его сообщения и на @упоминания бота в чате). Приложения Telegram будут:
Если в группе есть несколько ботов, вы можете дописать после команды имя бота, чтобы избежать коллизий в общих командах:
/start@TriviaBot
/start@ApocalypseBot
Это происходит автоматически, если вы выбираете команду из списка доступных.
Чтобы пользователям было проще работать с ботами, мы просим всех разработчиков реализовывать поддержку нескольких простых команд. В интерфейсе приложений Telegram будут ярлыки (быстрые ссылки) для этих команд.
При попытке начать общение с роботом, пользователь увидит кнопку СТАРТ. На странице профиля бота также будут доступны ссылки Помощь и Настройки.
Ботов часто добавляют в группы, чтобы получать различную информацию — новости, уведомления и т.д. Однако, при добавлении бота вы наверняка спрашивали себя: «А что если этот маленький засранец пересылает всю групповую переписку куда-то “налево”?» Именно поэтому у роботов есть режимы приватности.
Робот с включенным режимом приватности не будет получать всех сообщений, а только сообщения, удовлетворяющие этим условиям:
Это хорошо со всех сторон: во первых, некоторые люди будут спать спокойно (в своих шапочках из фольги), не опасаясь, что их будут прослушивать. Во-вторых, режим приватности избавляет разработчиков от необходимости обрабатывать сотни ненужных сообщений из групповых чатов.
Режим приватности включен по умолчанию во всех ботах. Он может быть выключен — тогда бот начнёт получать все сообщения, как и обычный пользователь. Всем участникам конференции виден текущий статус режима приватности в списке участников группы.
Мы рекомендуем отключать режим приватности только в случаях крайней необходимости. В подавляющем большинстве случаев, запроса принудительного ответа на сообщение бота будет достаточно.
Боты имеют механизм внешнего связывания, которые позволяет передать дополнительные параметры при запуске. Например, для передачи авторизационного токена пользователя, чтобы соединить его аккаунт с каким-либо внешним сервисом.
У каждого робота есть ссылка, при помощи которой можно начать с ним диалог — 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
.
$memcache_key = 'TESTKEY'
123
с ключом $memcache_key
в Memcache на 3600 секунд (один час)https://t.me/ExampleComBot?start=TESTKEY
/start
. Если ключ существует, записываем chat_id, переданный в веб-хук, в telegram_chat_id
для пользователя 123
. Удаляем ключ из Memcache.123
, сначала проверяем telegram_chat_id
. Если оно существует, используем метод sendMessage, чтобы отправить пользователю сообщение.BotFather — один бот, чтобы править всеми. При помощи него меняются настройки у существующих ботов и создаются новые.
Напишите команду /newbot
, чтобы создать нового робота. BotFather спросит у вас имя нового бота и предложит придумать username.
Имя (name) будет отображаться в контактах и чатах.
Username — короткое имя на латинице, которое используется для упоминаний бота и в ссылках на профиль в telegram.me. Username должен состоять из букв латинского алфавита, подчёркиваний и цифр и быть длиной от 5 до 32 символов. Также имя пользователя обязательно должно заканчиваться на «bot», например: «tetris_bot» или «TetrisBot».
Ключ (токен) это набор символов вида 110201543:AAHdqTcvCh2vGWJxfSeofSAs0K5PALDsaw
, который нужен, чтобы получать и отправлять сообщения с помощью Bot API.
Если вы потеряли или утратили доступ к токену, отправьте команду /token
, чтобы сгенерировать новый.
Пожалуйста, имейте в виду, что для применения настроек на сервере, возможно, потребуется некоторое время.
Рассмотрим API на примере создания тривиального бота:
Пишем ему /start и получаем список всех его команд.
Первая и главная — /newbot — отправляем ему и бот просит придумать имя нашему новому боту. Единственное ограничение на имя — оно должно оканчиваться на «bot». В случае успеха BotFather возвращает токен бота и ссылку для быстрого добавления бота в контакты, иначе придется поломать голову над именем.
Для начала работы этого уже достаточно. Особо педантичные могут уже здесь присвоить боту аватар, описание и приветственное сообщение.
Не забудьте проверить полученный токен с помощью ссылки api.telegram.org/bot<TOKEN>/getMe, говорят, не всегда работает с первого раза.
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))
Собственно, её код довольно прост:
def send_reply(response):
if 'text' in response:
api.post(URL + "sendMessage", data=response)
Теперь, когда вся логика бота описана можно начать придумывать ему команды.
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 услужливо покажет список всех доступных команд.
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
Для примера расширим словарь RESPONSES:
RESPONSES["What time is it?"] = ["<at_sticker>", "{date} UTC"]
if response['text'] == "<at_sticker>":
response['sticker'] = "BQADAgADeAcAAlOx9wOjY2jpAAHq9DUC"
del response['text']
def send_reply(response):
if 'sticker' in response:
api.post(URL + "sendSticker", data=response)
elif 'text' in response:
api.post(URL + "sendMessage", data=response)
Вспоминая статью про умный дом, могу сказать, что теперь извращений меньше, а работа прозрачнее.
К счастью, 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’ (или любой другой метод, используемый ботом).
Статья получилась длинной, советую пробежаться глазами по содержанию и кликнуть по интересующему вас пункту.
P.S. Пишите если нужна статья по созданию более сложного бота, т.е. с вебхуками, БД с настройками юзеров и т.д.
В поиске вбиваем @BotFather и переходим в диалог с Отцом Ботов.
Пишем /newbot. Указываем имя бота (то, что отображается в диалогах). Указываем его логин, по которому его можно булет найти.
P.S. Оно должно заканчиваться на Bot/bot
Вот. Нам дали API ключ и ссылку на бота. Желательно сохранить API ключ и перейти в диалог с ботом, чтобы потом не копаться в переписке с BotFather
Дальше добавим ему пару команд: пропишем /setcommands и одним сообщением, т.к. /setcommands не добавляет команды, а задаёт их с нуля, пошлём ему команды.
all - спарсить заголовки с вкладки "ВСЁ ПОДРЯД"
top - спарсить заголовки с вкладки "ЛУЧШЕЕ"
На этом работа с BotFather закончилась, перейдём к следующей части.
Установим pipenv, если его конечно ещё нет.
Для Windows:
pip install pipenv
sudo pip3 install pipenv
pipenv install
pipenv install PyTelegramBotAPI
pipenv install beautifulsoup4
Открываем bot.py, импортируем библиотеки и создаём главные переменные.
import telebot
import parser
#main variables
TOKEN = "555555555:AAAAaaaAaaA1a1aA1AAAAAAaaAAaa4AA"
bot = telebot.TeleBot(TOKEN)
python bot.py
python3 bot.py
Начнём с самого простого: ответим на команды /start и /go
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
bot.send_message(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
}
Добавим вот такой код.
@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, 'Простите, я вам не понял :(')
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()
Рассмотрим пример с картинкой, добавив этот код.
@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
@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 + ' лет.')
Во второй функции всё поинтересней, здесь идёт проверка ввёл ли пользователь число, и, если нет, то функция рекурсивно вызывает сама себя, с сообщением «Возраст должен быть числом, введите ещё раз.». Если пользователь ввёл всё верно, то он получает ответ.
Но, есть тут проблема. Можно повторно вызвать команду /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
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.pyimport 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
, из-за этого бот не будет падать при каждой ошибке.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
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.polling(none_stop=True)
Есть же вариант использовать в корне другой метод — вебхуки. Так бот сам будет отправлять нам данные о получении сообщения и т.д. Но этот метод сложнее в настройке, и, для простого показательного бота я решил его не использовать.
Также в дополнительных материалах будут ссылки на всё, что использовалось и о чём говорилось.
Я выведу маркапы в отдельный файл — markups.py.
В написании маркапов нет ничего сложного. Нужно лишь создать маркап, указать пару параметров, создать пару кнопок и добавить их в маркап, далее просто указываем reply_markup=markup
в send_message
.
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)
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
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)
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)
Ура! С кодом впринципе разобрались. Теперь самое важное — деплоинг бота не хероку.
Теперь создаём репозиторий на гитхабе. (нажмите плюсик слева от вашего аватара)
Сейчас нам нужен 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
Рассмотрим API на примере создания тривиального бота:
Пишем ему / start и получаем список всех его команд.
Первая и главная — / newbot — отправляем ему и бот просит придумать имя нашему новому боту. Единственное ограничение на имя — оно должно оканчиваться на «бот».В случае успеха BotFather возвращает токен бота и ссылку для быстрого добавления бота в контакты, иначе придется поломать голову именем над.
Для начала работы этого уже достаточно. Особо педантичные могут уже здесь присвоить боту аватар, описание и приветственное сообщение.
Не забудьте проверить полученный токен с помощью ссылок api.telegram.org/bot
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))
Собственно, её код довольно прост:
def send_reply (response):
если текст в ответе:
api.post (URL + "sendMessage", данные = ответ)
Теперь, когда вся логика бота описана можно начать придумывать ему команды.
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 услужливо покажет список всех доступных команд.
UPD: Как верно подсказали, такое пройдет только при личном общении. В чатах боту доставляются только сообщения, начинающиеся с команды (/
- Все сообщения, начинающиеся с косой черты ‘/’ (см. Команды выше)
- Сообщения с упоминанием бота под ником
- Ответы на собственные сообщения бота
- Служебные сообщения (люди, добавленные или удаленные из группы и т. Д.)
Чтобы бот получал все сообщения в группах пишем @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", "")}
)
ответ на ответ
Для примера расширим словарь ОТВЕТОВ:
ОТВЕТОВ ["Который час?"] = ["", "{date} UTC"]
если ответ ['text'] == "":
ответ ['стикер'] = "BQADAgADeAcAAlOx9wOjY2jpAAHq9DUC"
del response ['текст']
def send_reply (response):
если в ответ «стикер»:
api.сообщение (URL + sendSticker, данные = ответ)
elif 'text' в ответ:
api.post (URL + "sendMessage", данные = ответ)
Вспоминая статью про умный дом, могу сказать, что теперь извращений меньше, а работа прозрачнее.
К счастью, 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, созданные для того, чтобы автоматически обрабатывать и отправлять сообщения. Пользователи могут взаимодействовать с ботами при помощи сообщений, отправляемых через обычные или групповые чаты. Логика бота контролируется при помощи HTTPS-запросов к нашему API для ботов.
Вот несколько примеров использования ботов:
Как уже было сказано ранее, роботы - особые аккаунты, которые не требуют номера телефона при создании. По сути, эти аккаунты играют роль к вашему сервису, который работает на удалённом сервере.
Самое интересное в роботах это то, что для их создания вам не нужно изучать низкоуровневые методы работы с MTProto и шифрованием - общение с роботом организовано при помощи обычного интерфейса HTTPS с упрощёнными методами Telegram API. Мы назвали его Bot API.
ПримечаниеРекомендуем также ознакомиться с подробным описанием Bot API.
Для этого есть ... Бот. Просто напишите пользователю @BotFather и следуйте его инструкциям.Как только вы создали бота и получили свой ключ (токен) авторизации, переходите в раздел документации Bot API, чтобы начать настройку вашего бота.
t.me/
или поиск по имени пользователя.У роботов Telegram есть много уникальных возможностей - например, кастомизированные клавиатуры, дополнительные интерфейсы для команд по умолчанию, внешнее связывание и специальные режимы приватности для групп.
Пользователи могут общаться с вашим ботом напрямую из поля ввода сообщения - из любого чата или группы. Для этого нужно всего лишь набрать имя пользователя вашего бота и запрос для поиска. Получив запрос, бот может возвратить какие-либо результаты.Как только пользователь нажмёт на один из них, он сразу же отправится в чат. Таким образом можно запрашивать контент от бота в чатах, группах или каналах.
Подробнее о встроенном режиме в блоге »
С помощью ботов пользователи могут играть в HTML5-игры в группах или приватных чатах. Игровая платформа Telegram поможет составить таблицу рекордов и оповещать пользователей об изменении рейтинга.
Под капотом у игр - HTML5, поэтому вы можете создать игры любой сложности.На данный момент командой Telegram создано несколько демо-игр:
Подробнее об играх в Telegram »
Одна из самых необычных возможностей Bot API - кастомизированные клавиатуры . При передаче данных ответа есть возможность передать команду на программном интерфейсе клавиатуры с предустановленным сервером ответа (см. ReplyKeyboardMarkup). Клиент Telegram, получив сообщение, отобразит пользователю вашу клавиатуру. Нажатие на услуги сразу же отправит на сервер соответствующую команду.Таким образом можно значительно упростить взаимодействие робота с пользователем. На момент для показа на клавише данный проект эмодзи и текст. Вот несколько примеров таких клавиатур:
За более подробной информацией обращайтесь к описанию метода sendMessage.
Команды Предоставьте собой более гибкий способ общения с ботом. Рекомендуется следующий синтаксис:
/ команда [необязательный] аргумент]
Команда должна начинаться с символа косой черты «/» и не может быть длиннее 32 символа.Команды могут состоять из букв латинского алфавита, цифр и подчёркивания. Несколько примеров:
/ get_messages_stats
/ set_timer 10мин будильник!
/ get_timezone Лондон, Великобритания
Сообщения, начинающиеся с косой черты, будут всегда доставляться боту (точно также, как и при ответе на его сообщения и на & commat; упоминания бота в чате). Приложения Telegram будут:
Если в группе есть несколько ботов, вы можете дописать после команды имя бота, чтобы избежать коллизий в общей командех:
/ старт @ TriviaBot
/ start @ ApocalypseBot
Это происходит автоматически, если вы выбираете команду из списка доступных.
Чтобы пользователям было проще работать с ботами, мы просим всех разработчиков реализовывать поддержку нескольких простых команд. В интерфейсе приложений Telegram будут ярлыки (быстрые ссылки) для этих команд.
При попытке начать общение с роботом, пользователь увидит кнопку СТАРТ . На странице профиля бота также доступны ссылки Помощь и Настройки .
Ботов часто добавлять в группы, чтобы получать различную информацию - новости, уведомления и т.д. Однако, при добавлении бота вы наверняка спрашивали себя: «А что если этот маленький засранец пересылает всю групповую переписку куда-то« налево »?» Именно поэтому у роботов есть режимы приватности .
Робот с включенным режимом приватности не будет получать всех сообщений, а только сообщения, удовлетворяющие этим условиям:
Это хорошо со всех сторон: некоторые люди будут спать спокойно (в своих шапочках из фольги), не опасаясь, что их будут слушать. Во-второй, режим приватности избавляет разработчиков от необходимости обрабатывать ненужных сообщений из групповых чатов.
Режим приватности включен по умолчанию во всех ботах. Он может быть выключен - тогда бот начнёт получать все сообщения, как и обычный пользователь. Всем участникам конференции виден текущий статус режима приватности в списке участников группы.
Мы рекомендуем отключать режим приватности только в крайней необходимости. В подавляющем большинстве случаев запроса принудительного ответа на сообщение бота будет достаточно.
Боты имеют механизм внешнего связывания, который позволяет передать дополнительные параметры при запуске. Например, для передачи авторизационного токена пользователя, чтобы соединить его аккаунт с каким-либо внешним способом.
У каждого робота есть ссылка, при помощи которой можно начать с ним диалог - 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
.
$ memcache_key = 'ТЕСТКЛЮЧ'
123
с ключом $ memcache_key
в Memcache на 3600 секунд (один час) https: // t.я / ExampleComBot? start = ТЕСТКЛЮЧ
/ start
. Если ключ существует, записываем chat_id, переданный на веб-хук, в telegram_chat_id
для пользователя 123
. Удаляем ключ из Memcache. 123
, сначала проверяем telegram_chat_id
.Если оно существует, используйте метод sendMessage, чтобы отправить пользователю сообщение.BotFather - один бот, чтобы править всеми. При помощи него меняются настройки у новых ботов и новых.
Напишите команду / newbot
, чтобы создать нового робота. BotFather спросит у вас имя нового бота и предложит придумать имя пользователя.
Имя (имя) будет в контактах и чатах.
Имя пользователя - короткое имя на латинице, которое используется для упоминаний бота и в ссылках на профиль в telegram.me. Имя пользователя должен состоять из букв латинского алфавита, подчёркиваний и цифр и быть длиной от 5 до 32 символов. Также имя пользователя обязательно должно заканчиваться на «бот», например: «tetris_bot» или «TetrisBot».
Ключ (токен) это набор символов вида 110201543: AAHdqTcvCh2vGWJxfSeofSAs0K5PALDsaw
, который нужен, чтобы получать и отправлять сообщения с помощью Bot API.
Если вы потеряли доступ к токену, отправьте команду / токен
, чтобы сгенерировать новый.
Пожалуйста, имейте в виду, что для использования на сервере, возможно, некоторое время использования.
. pip install pytelegrambotapi
Как вы видите выдали специальный API токен, с помощью которого вы управляете своим ботом (в моём случае это: 776550937: AAELEr0c3H6dM-9QnlDD-0Q0Fcd65pPyAiM ). Свой токен Вы можете запомнить, но я рекомендую его записать.
Тут рекомендую поставить всё как у меня (название, конечно можно изменить).После создания проекта, давайте создадим файл, в котором будет наш код. Кликните правой кнопкой по вашему проекту, затем New → Python File. Отлично, начнем писать код. Импортируем библиотеку telebot, с помощью:
import telebot
bot = telebot.TeleBot ('ваш токен')
@ bot.message_handler (commands = ['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, 'Прощай, создатель')
Вот что у вас должно получиться:
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 ()
Ну и второй способ, для тех, кто не ищет лёгких путей. Создаем новый декоратор 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)
Исходный код:
импортный телебот
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 у всех на слуху. Нужно отдать должное отделу маркетинга этого приложения, шумиху подняли на славу. Одной основной из "фишек" Telegram является его якобы защищённость - по словам Павла Дурова вся переписка между пользователями шифруется.Более того, ни одна спец.служба мира не будет доступ к вашим сообщениям. Но в данной статье речь не об этом. Сегодня хотелось бы поговорить о не менее крутой фишке в Telegram, а именно о ботах. Помимо того, что в сети уже полно информации о различного рода ботах Telegram (например, github бот), мессенджер открыл свое API для разработчиков, и теперь каждый может создать свой собственный бота с блэкджеком и плюшками.
В статье я приведу пример написания бота с использованием Python и Django фреймворка.То есть мы "запилим" полноценное веб-приложение, которое будет крутиться на удалённом хосте и принимать команды от пользователей. Весь исходный текст доступен в моём github репозитории.
Документация, описывающая процесс взаимодействия с ботами Telegram находится тут. Чтобы не изобретать велосипед, я нашел неплохую библиотеку Python, реализующую основные функции ботов - телепот. Как я уже упоминал ранее, чтобы обслуживать пользователей нашего бота, мы будем разрабатывать веб-приложение, используя Django фреймворк.
Для начала нам необходимо зарегистрировать в Telegram нашего будущего бота. Это следующий следующим образом:
После создания бота, обратите внимание на текст:
.Используйте этот токен для доступа к HTTP API:
За которой следует т.н. token по которому мы будем манипулировать нашим ботом. Помимо функций создания телеграммы бота, BotFather также имеет ряд других возможностей:
и так далее. Полное описание доступных команд можно увидеть на первом скриншоте.
Как я ранее уже упоминал, мы будем писать веб-приложение на Django .Но стоит отметить, что это делать необязательно. Можно обойтись и обычным скриптом Python, правда в этом случае необходимо периодически опрашивать Telegram на предмет новых запросов от пользователей бота (используя метод getUpdates ) и увеличивая смещение для получения самых последних данных без повторений. В Telegram существует два взаимоисключающих метода предоставления команд / сообщений для вашего бота.
Установка 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.
Добавим нашего бота к себе в контакт-лист и пошлём ему первую стандартную команду / начало
Выполняем код:
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 - это токен нашего бота. Смотрим скриншот:
А давайте-ка отправим команду для получения списка новостей из Planet Python:
На скриншотах видно, что бот адекватно отреагировал на нашу команду вывести список последних 10 постов.
Следующим шагом является деплой нашего Django приложения на удаленный хост и последующий вызов метода setWebhook для передачи URL на который будет посылаться POST-запрос от сервиса Telegram каждый раз при поступлении команды боту от пользователей. Об этом мы поговорим в следующей заметке.
.
Об авторе