как посмотреть код бота telegram
Простой Telegram-бот на Python за 30 минут
На Хабре, да и не только, про ботов рассказано уже так много, что даже слишком. Но заинтересовавшись пару недель назад данной темой, найти нормальный материал у меня так и не вышло: все статьи были либо для совсем чайников и ограничивались отправкой сообщения в ответ на сообщение пользователя, либо были неактуальны. Это и подтолкнуло меня на написание статьи, которая бы объяснила такому же новичку, как я, как написать и запустить более-менее осмысленного бота (с возможностью расширения функциональности).
Часть 1: Регистрация бота
Самая простая и описанная часть. Очень коротко: нужно найти бота @BotFather, написать ему /start, или /newbot, заполнить поля, которые он спросит (название бота и его короткое имя), и получить сообщение с токеном бота и ссылкой на документацию. Токен нужно сохранить, желательно надёжно, так как это единственный ключ для авторизации бота и взаимодействия с ним.
Часть 2: Подготовка к написанию кода
Как уже было сказано в заголовке, писать бота мы будем на Python’е. В данной статье будет описана работа с библиотекой PyTelegramBotAPI (Telebot). Если у вас не установлен Python, то сперва нужно сделать это: в терминале Linux нужно ввести
После, в терминале Linux, или командной строке Windows вводим
Теперь все готово для написания кода.
Часть 3: Получаем сообщения и говорим «Привет»
Небольшое отступление. Телеграмм умеет сообщать боту о действиях пользователя двумя способами: через ответ на запрос сервера (Long Poll), и через Webhook, когда сервер Телеграмма сам присылает сообщение о том, что кто-то написал боту. Второй способ явно выглядит лучше, но требует выделенного IP-адреса, и установленного SSL на сервере. В этой статье я хочу рассказать о написании бота, а не настройке сервера, поэтому пользоваться мы будем Long Poll’ом.
Открывайте ваш любимый текстовый редактор, и давайте писать код бота!
Первое, что нужно сделать это импортировать нашу библиотеку и подключить токен бота:
Теперь объявим метод для получения текстовых сообщений:
В этом участке кода мы объявили слушателя для текстовых сообщений и метод их обработки. Поле content_types может принимать разные значения, и не только одно, например
Будет реагировать на текстовые сообщения, документы и аудио. Более подробно можно почитать в официальной документации
Теперь добавим в наш метод немного функционала: если пользователь напишет нам «Привет», то скажем ему «Привет, чем я могу помочь?», а если нам напишут команду «/help», то скажем пользователю написать «Привет»:
Данный участок кода не требует комментариев, как мне кажется. Теперь нужно добавить в наш код только одну строчку (вне всех методов).
Теперь наш бот будет постоянно спрашивать у сервера Телеграмма «Мне кто-нибудь написал?», и если мы напишем нашему боту, то Телеграмм передаст ему наше сообщение. Сохраняем весь файл, и пишем в консоли
Где bot.py – имя нашего файла.
Теперь можно написать боту и посмотреть на результат:
Часть 4: Кнопки и ветки сообщений
Отправлять сообщения это несомненно весело, но ещё веселее вести с пользователем диалог: задавать ему вопросы и получать на них ответы. Допустим, теперь наш бот будет спрашивать у пользователя по очереди его имя, фамилию и возраст. Для этого мы будем использовать метод register_next_step_handler бота:
И так, данные пользователя мы записали. В этом примере показан очень упрощённый пример, по хорошему, хранить промежуточные данные и состояния пользователя нужно в БД, но мы сегодня работаем с ботом, а не с базами данных. Последний штрих – запросим у пользователей подтверждение того, что все введено верно, да не просто так, а с кнопками! Для этого немного отредактируем код метода get_age
И теперь наш бот отправляет клавиатуру, но если на нее нажать, то ничего не произойдёт. Потому что мы не написали метод-обработчик. Давайте напишем:
Остаётся только дописать в начало файла одну строку:
Вот и всё, сохраняем и запускаем нашего бота:
Bot API: часто задаваемые вопросы
Если вы незнакомы с ботами в Telegram, рекомендуется сначала прочитать ознакомительную статью.
Также, возможно, вас заинтересует описание Bot API.
Общие вопросы
Как я могу создать бота?
Создание бота для Telegram крайне простое, однако, вам понадобится кое-какой опыт в программировании. Для работы вашего бота вам необходимо осуществить первоначальную настройку через бота @BotFather, а затем подключить его к вашему серверу через API.
К сожалению, какого-либо способа создать бота без программирования не существует. Поэтому, если вы не разработчик, лучше поищите себе готового бота или закажите его разработку.
Можно посмотреть примеры кода?
Вот два бота-образца, написанных на PHP:
Многие разработчики создают своих ботов с открытым исходным кодом. Мы собираем их на специальной странице.
Добавьте в ботов фичу X!
API ботов — весьма молодой проект. Есть ещё масса возможностей, которые уже рассматриваются к реализации. Пока что администрация Telegram наблюдает за тем, как пользователи используют своих ботов, чтобы понять, в каком направлении необходимо развивать платформу.
Если у вас есть мысли по этому поводу, вы можете высказать их пользователю @BotSupport (на английском).
Какие сообщения может получать мой бот?
При создании бота у него автоматически включается режим приватности, который влияет на получения сообщений в группах. Это значит, что ваш бот будет получать сообщения из групп только при следующих условиях:
При выключении режима приватности, ваш бот будет получать все сообщения из групп, за исключением:
Почему мой бот не видит сообщений от других ботов?
Диалог двух ботов может привести к нежелательным бесконечным циклам, когда боты отвечают друг другу по кругу. Поэтому было принято решение не давать ботам возможности видеть сообщения от других ботов.
Получение обновлений
Как можно получать обновления?
На текущий момент доступно два способа. Вы можете использовать либо опрос, либо вебхуки. Обратите внимание: если вы используете вебхуки, метод getUpdates работать не будет.
Принципиальное отличие: при опросе вашему приложению самому нужно запрашивать обновления у API, а используя вебхуки — сервера Telegram будут отправлять на ваш сервер каждое обновление с помощью HTTPS POST-запроса.
Вебхуки могут работать только через HTTPS, допустимо использование самозаверенного сертификата.
Доступные порты: 443, 80, 88, 8443.
Опрос всегда выдаёт один и тот же результат!
Метод getUpdates выдаёт 100 последних неподтверждённых обновлений. Чтобы подтвердить обновление, используйте параметр offset при вызове getUpdates вот так:
Все обновления с update_id меньшим или равным offset будут отмечены как подтверждённые и не будут больше возвращаться сервером.
У меня проблема с вебхуками
Если вы успешно задали адрес вебхука, но не получаете обновлений, убедитесь, что:
У меня проблема с самозаверенным сертификатом
Ознакомьтесь с инструкцией по созданию сертификатов. Если после прочтения у вас остались вопросы, напишите пользователю @BotSupport.
Как мне убедиться, что запросы идут с серверов Telegram?
Для этого включите ваш токен в адрес вебхука, примерно так:
Так как никто посторонний не знает вашего токена, запросы на этот адрес смогут отсылать только сервера Telegram.
Как делать запросы в HTTP-ответах к обновлениям?
Это возможно при использовании вебхуков. Преимуществом является сокращение числа запросов, недостатком — невозможность получения результата запроса и его статуса.
Всякий раз при получении обновления на вебхук, у вас есть два варианта:
2. Ответить напрямую, указав метод в виде JSON в HTTP-ответе:
Пример реализации этой возможности на PHP можно посмотреть в коде HelloBot.
Обработка медиафайлов
Как скачивать файлы?
Этот метод работает только для файлов объёмом до 20 МБ.
Как закачать большой файл?
На текущий момент боты могут отправлять файлы объёмом до 50 МБ, так что крупные файлы отправить не получится. Возможно, это ограничение будет снято в будущем.
Как долго хранится file_id у файлов?
file_id у отправленных вашим ботом файлов будут удалены после отправления нескольких тысяч файлов.
Для принятых файлов file_id можно считать вечным и неизменным.
Массовая рассылка
Каков лимит сообщений в секунду?
При работе с отдельным чатом, избегайте отправки более 1 сообщения в секунду. Конечно, допустимы небольшие пики, но со временем вы начнёте получать ошибку 429.
При рассылке уведомлений нескольким пользователям, API не позволит отправлять более 30 сообщений в секунду. Для преодоления этого лимита вам необходимо разбить отправку на части с большим интервалом между собой (около 8-12 часов).
При работе с группой ограничение установлено на 20 сообщений в минуту.
Как получить список всех подписчиков моего бота?
К сожалению, пока сделать это встроенными методами нельзя. Возможно, в будущем будут добавлены пару строк для управления подписчиками.
Чтобы максимально эффективно рассылать сообщения, вам необходимо разбивать отправку на несколько частей с интервалом в 8-12 часов. Также недопустимо отправление более 30 сообщений разным пользователям в секунду — иначе вы будете получать ошибку 429.
Сайт про Telegram на русском (неофициальный).
Здесь собраны приложения на базе MTProto, переведена некоторая документация с официального сайта, а также работает Webogram.
Телеграм-бот на Python
15 минут — и можете запускать своего первого бота.
В первой части мы сделали гороскоп на Python, который выдаёт нам прогноз на день по знаку зодиака. Сегодня пойдём дальше: теперь этот же генератор гороскопов будет встроен в Телеграм в виде бота.
Да. То, что обычно на курсах продают за 50 тысяч рублей, мы вам сейчас расскажем за 15 минут бесплатно.
Как всё будет работать
В этом проекте три звена: наш компьютер с Python, сервер Телеграма и Телеграм-клиент.
На компьютере работает интерпретатор Python, а внутри интерпретатора крутится наша программа на Python. Она отвечает за весь контент: в неё заложены все шаблоны текста, вся логика, всё поведение.
Внутри программы на Python работает библиотека, которая отвечает за общение с сервером Телеграма. В библиотеку мы вшили секретный ключ, чтобы сервер Телеграма понимал, что наша программа связана с определённым ботом.
Когда клиент с Телеграмом запрашивает у бота гороскоп, запрос приходит на сервер, а сервер отправляет его на наш компьютер. Запрос обрабатывается программой на Python, ответ идёт на сервер Телеграма, сервер отдаёт ответ клиенту. Изи:
Обратите внимание, что работать наш бот будет только тогда, когда включён компьютер и на нём запущена программа на Python. Если компьютер выключится, пропадёт интернет или вы отключите интерпретатор, то бот работать перестанет: запросы будут приходить, но никто на них не ответит. В одной из следующих частей мы сделаем так, чтобы это всё работало на удалённом сервере и было всегда доступно.
Что будем делать
Если записать пошагово наш план, то он будет выглядеть так:
Теперь по очереди разберём каждый пункт.
1. Регистрация нового бота
В Телеграме находим канал @BotFather — он отвечает за регистрацию новых ботов:
Первый в списке со специальным значком подтверждения — это он.
Нажимаем Start и пишем команду /newbot. Нас по очереди спросят про название бота и его никнейм (мы придумали только с третьей попытки, потому что остальные были заняты):
С третьей попытки нам дали нового бота и токен для управления. Токен нужен для управления ботом, поэтому на экране его нет.
2. Установка библиотеки
Есть два основных способа работать с телеграмом в Python: через библиотеку telebot и с помощью Webhook. Мы будем использовать библиотеку — так проще и быстрее.
Чтобы её установить, запускаем командную строку от имени администратора (если у вас Windows) и пишем команду pip install pytelegrambotapi
В конце видим сообщение об успешной установке, значит всё сделали правильно.
Подключаем библиотеку и получаем сообщения
Чтобы программа на Python умела управлять Телеграм-ботами, нужно в самое начало кода добавить строки:
Единственное, о чём нужно не забыть — заменить слово «токен» на настоящий токен, который дал нам @BotFather. Открываем программу гороскопа и добавляем.
Теперь научим бота реагировать на слово «Привет». Для этого добавим после строчек с импортом новый метод и сразу пропишем в нём реакцию на нужное слово. Если не знаете, что такое метод и зачем он нужен, — читайте статью про ООП.
И последнее, что нам осталось сделать до запуска, — добавить после метода такую строчку:
Она скажет программе, чтобы она непрерывно спрашивала у бота, не пришли ли ему какие-то новые сообщения. Запускаем программу и проверяем, как работает наш бот.
Бот отвечает именно так, как мы запрограммировали. Класс.
Такая ошибка во время запуска программы означает, что компьютер не может соединиться с сервером telegram.org, потому что его блокирует Роскомнадзор. Что делать? Сложно сказать. Если бы вы жили в другой стране, этой проблемы бы не было. Ещё можно использовать какие-то средства, которые направляют ваш трафик через другую страну, но рассказ об этих средствах является в России преступлением, поэтому тут мы вам ничего не можем подсказать.
Добавляем кнопки
Чтобы пользователям нашего бота было удобно, покажем им сразу все знаки зодиака в виде кнопок. А потом сделаем так, что когда на них нажимаешь — появляется гороскоп для этого знака на сегодня.
Добавляем код с кнопками в раздел, который реагирует на «Привет»:
Кнопки есть, но пока не работают. Сейчас исправим.
Добавляем обработчик кнопок
Давайте сделаем обработчик кнопок, который будет реагировать на ‘zodiac’ и выдавать случайный текст, как в исходной программе. Для этого добавим новый метод в программу:
Нажимаем на кнопку — получаем текст гороскопа.
Убираем лишнее
Теперь у нас есть готовый бот, и нам осталось только убрать лишний код, который раньше отвечал за вывод знаков зодиака в консоли. После чистки получаем готовую программу:
Как видно, большую часть кода занимает тупое перечисление всех знаков зодиака. Мы могли бы автоматизировать это через циклы, но на улице такая хорошая погода, что мы это отложим.
Что дальше
Впереди — безграничные возможности:
Напишите в комментариях, что бы вы хотели от такого бота? Что должен уметь идеальный бот с гороскопом?
Обучаемый Telegram чат-бот с ИИ в 30 строчек кода на Python
Сегодня мне в голову пришла мысль: «А почему бы не написать Telegram чат-бота с ИИ, которого потом можно будет обучать?»
Сейчас сделать это совсем легко, поэтому, недолго думая, я принялся к написанию кода.
Языком я выбрал Python, т.к. на нём легче всего работать с подобного рода приложениями.
Итак, для создания Telegram чат-бота с ИИ нам потребуется:
1. API Telegram. В качестве обёртки я взял проверенную библиотеку python-telegram-bot
2. API ИИ. Выбрал я продукт от Google, а именно Dialogflow. Он предоставляет довольно-таки неплохое бесплатное API. Обёртка Dialogflow для Python
Шаг 1. Создаём бота в Telegram
Придумываем имя нашему боту и пишем @botfather. После создания бота нам придёт API токен, который желательно бы где-то сохранить, т.к. в дальнейшем он нам понадобится.
Шаг 2. Пишем основу бота
Создаём папку Bot, в которой потом создаём файл bot.py. Здесь будет код нашего бота.
Открываем консоль и переходим в директорию с файлом, устанавливаем python-telegram-bot.
После установки мы уже можем написать «основу», которая пока что будет просто отвечать однотипными сообщениями. Импортируем необходимые модули и прописываем наш токен API:
Далее напишем 2 обработчика команд. Это callback-функции, которые будут вызываться тогда, когда будет получено обновление. Напишем две таких функции для команды /start и для обычного любого текстового сообщения. В качестве аргументов туда передаются два параметра: bot и update. Bot содержит необходимые методы для взаимодействия с API, а update содержит данные о пришедшем сообщении.
Теперь осталось лишь присвоить уведомлениям эти обработчики и начать поиск обновлений.
Делается это очень просто:
Итого, полная основа скрипта выглядит вот так:
Теперь мы можем проверить работоспособность нашего нового бота. Вставляем на 2 строке наш API токен, сохраняем изменения, переносимся в консоль и запускаем бота:
После запуска пишем ему. Если всё настроено правильно, то Вы увидите вот это:
Основа бота написана, приступаем к следующему шагу!
P.s. не забывайте выключить бота, для этого вернитесь в консоль и нажмите Ctrl + C, подождите пару секунд и бот успешно завершит работу.
Шаг 3. Настройка ИИ
В первую очередь, идём и регистрируемся на Dialogflow (просто входим с помощью своего Google аккаунта). Сразу после авторизации мы попадаем в панель управления.
Жмём на кнопку Create agent и заполняем поля по усмотрению (это никакой роли не сыграет, это нужно лишь для следующего действия).
Жмём на Create и видим следующую картину:
Расскажу, почему созданный нами ранее «Агент» никакой роли не играет. Во вкладке Intents есть «команды», по которым работает бот. Сейчас он умеет лишь отвечать на фразы типа «Привет», и если не понимает, то отвечает «Я вас не понял». Не сильно впечатляет.
После создания нашего пустого агента, у нас появилась куча других вкладок. Нам нужно нажать на Prebuilt Agents (это уже специально обученные агенты, которые имеют множество команд) и из всего представленного списка выбрать Small Talk.
Наводим на него и жмём Import. Далее ничего не меняя, жмём Ok. Агент импортировался и теперь мы можем его настроить. Для этого в левом верхнем углу жмём на шестерёнку возле Small-Talk и попадаем на страницу настроек. Теперь мы можем изменить имя агента, как захотим (я оставляю как было). Меняем часовой пояс и во вкладке Languages проверяем, чтобы был установлен русский язык (если не установлен, то ставим).
Возвращаемся на вкладку General, спускаемся немного вниз и копируем Client access token
Теперь наш ИИ полностью настроен, можно возвращаться к боту.
Шаг 4. Собираем всё вместе
ИИ готов, основа бота готова, что дальше? Дальше нам нужно скачать обёртку API от Dialogflow для питона.
Установили? Возвращаемся к нашему боту. Добавляем в нашу секцию «Настройки» импорт модулей apiai и json (нужно, чтобы в будущем разбирать json ответы от dialogflow). Теперь это выглядит вот так:
Переходим к функции textMessage (которая отвечает за получение любого текстового сообщения) и посылаем полученные сообщения на сервера Dialogflow:
Этот код будет посылать запрос к Dialogflow, но нам нужно также извлечь ответ. Дописываем парочку строк, итого textMessage выглядит вот так:
Немного пояснений. С помощью
получается ответ от сервера, закодированный в байтах. Чтобы декодировать его, просто применяем метод
и после этого «заворачиваем» всё в
чтобы распарсить json ответ.
Если ответа нет (точнее, json приходит всегда, но не всегда есть сам массив с ответом ИИ), то это означает, что Small-Talk не понял пользователя (обучением можно будет заняться позже). Поэтому если «ответа» нет, то пишем пользователю «Я Вас не совсем понял!».
Итого, полный код бота с ИИ будет выглядеть вот так:
Сохраняем изменения, запускаем бота и идём проверять:
Вот и всё! Бот в 30 строк с ИИ написан!
Шаг 5. Заключительная часть
Думаю, Вы убедились, что написать бота с ИИ – дело 10 минут. Осталось лишь теперь его учить и учить. Делать это, кстати, можно во вкладке Training. Там можно посмотреть все сообщения, которые писались и что на них ответил бот (или не ответил). Там же его можно и обучать, говоря боту где он ответил правильно, а где нет.
Надеюсь, статья была Вам полезна, удачи в обучении!
TelegramBot инструкция по созданию базового функционала для бота. (Часть 1)
Не так давно я предложил вам воспользоваться моим ботом для телеграмма.
Получив много вопросов в личку, я понял, что вопрос создания ботов для Телеграм довольно популярен.
У меня спрашивали исходный код бота, просили поделиться конкретными примерами реализации тех или иных возможностей бота, просили подсказать тот или иной функционал по работе с ботом и сообщениями.
Я решил написать цикл статей, в которых хочу показать базовые вещи, которые будут нужны вам для написания своего бота.
Вас ждет Java, Maven, TelegramAPI, Lombok и Log4j.
Кому интересно — прошу под кат…
И сразу с козырей зайду 🙂
То, о чем просили в предыдущей статье.
В ветке «master» будет финальная версия бота, которого мы вместе с вами и напишем, в процессе появления новых статей.
Полный исходники по этой статье будет находится в ветке «Part1-Base».
В данной части мы создадим с вами базовый шаблон, который способен будет:
Создаем стандартный maven проект
(я упущу мануалы по работе со средой разработки и базовые вещи из Java программирования. Все эти вещи достаточно легко гугляться.А если не будет получаться — пишите вопросы).
Давайте посмотрим, какие зависимости нам будут нужны в этом проекте.
В первую очередь это Lombok. Что это и зачем — можно почитать, например, тут.
И обязательно добавим логгер. Я использую log4j и чуть дальше покажу вам как полезно его можно использовать при отладке данного приложения и более глубокого осмысления работы TelegramAPI.
И, т.к. мы пишем бота для Телеграм, то и саму библиотеку от Telegram:
Структуру pom файла можно посмотреть тут
Структуру файла pom.xml можно увидеть тут.
Далее добавляем базовый класс Bot.java, который и будет реализовывать все наше взаимодействие с с сервисами Telegram. Работать мы будем с помощью LongPolling, т.к. этот метод не требует сертификатов шифрования и запускаться может с любой машины, которая имеет Java у себя на борту.
Для этого мы наследуемся от класса TelegramLongPollingBot и реализуем базовые методы:
public void onUpdateReceived(Update update)
public String getBotUsername()
public String getBotToken()
И от себя нам нужно будет добавить процедуру, которая будет подключать наш бот к TelegramAPI:
public void botConnect()
В принципе все. Данный код умеет подключаться к серверам Телеграмм и при получении адресованных ему сообщений будет фиксировать в лог файл информацию, что он получил Update.
Давайте создадим класс, который и будет запускать наше приложение.
Этим займется класс App.java. Ссылка на файл: тут
Как вы видите, для работы бота нам понадобятся только «имя бота» и «токен», которые мы и передадим в конструкторе нашего класса Bot.
Имя и токен для бота вы можете получить у отца всех ботов :), написав ему в телеграмме.
Его ник: @BotFather
Общение с ним очень простое и лаконичное.
В результате у вас должен получиться такой диалог:
Так же здесь пишут, что аккуратнее, никому не показывайте эту информацию, иначе кто-то другой сможет управлять вашим ботом 🙂
Вы скажете, что я не очень аккуратен… Возможно, но отец ботов позволяет нам менять токены и отзывать те, что попали в публичный доступ. Потому с попробовав подключиться с моими данными, вы получите такое сообщение:
Так что с моими данными вам подключиться не получится. Регистрируйте свои. Новые данные укажите в классе App.java
Теперь запустив метод main в классе App мы позволим нашему боту подключиться и ждать новых сообщений. О своих действиях и попытках он напишет нам в консоле.
Log4j
Помните, выше я говорил о полезности библиотеки log4j. И вот тут для любопытных открывается клондайк полезных данных.
В файле log4j.properties уже прописаны базовые настройки для логирования и конкретные уровни логирования для сторонних классов и для тех, которые работают в нашем боте.
Базовый уровень логирования у нас указан как Error.
Для классов Bot и App указан вывод логов на уровне Debug.
Что это за уровни и чем отличаются — вы легко найдете в гугле.
Если хотите посмотреть, как и в каком порядке отрабатывает библиотека Телеграм все ваши действия — переключите режим общего логирования на уровень ниже: info или debug.
И при запуске приложения вы в консоли увидите, сколько всего интересного происходит в процессе подключения, работы. Сколько раз опрашиваются ваши функции с именем и токеном бота.
Уровни логирования меняются вот этой строчкой:
Чтобы получить логи по уровню info, ставите вот так:
Для уровня debug, вот так:
И в заключение
Сейчас у нас бот: подключается, показывает нам красивые логи и сообщает о том, что ему приходят сообщения.
Но выше я вам обещал, что бот будет отзываться на команду старт. Давайте немного изменим процедуру, ответственную за обработку полученных сообщений.
Как видно из кода бот делает следующее:
В дальнейшем я покажу вам, как в моих ботах реализуется:
А второй — Дерзкий киноман. Он очень любит фильмы и очень много о них знает. А еще больше он любит делится с вами своими знаниями. Он ведет свой канал в телеграмме, в котором сам решает, какие фильмы ему нравятся и предлагает их вам. Он умеет формировать индивидуальные подборки по жанрам и создавать подписку на персональные рекомендации. Он умеет находить такие шедевры, о которых вы никогда не слышали и даже не знали как такие фильмы вообще можно найти.
Например, как вы думаете, существуют ли фильмы с такой «дикой» комбинацией жанров, как: документальный, ужасы, комедия.
А вот бот по команде
Скажет, что таких фильмов с 2010 по текущий момент сняли аж 6 штук 🙂
Как работать с подобными командами, как разбирать строки и последовательности команд мы рассмотрим с вами в следующих публикациях.
Спасибо вам за внимание. Программируйте в удовольствие 🙂