Как создать эхо бота в Телеграмм на питоне

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

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

Начнём с создания эхо бота на aiogram, тут нет ничего сложного, возьмём пример из документации:

Однако преимущество aiogram над python-telegram-bot и pyTelegramBotAPI в том, что он асинхронный, а значит, может обрабатывать несколько запросов почти единовременно. Стандартная база данных sqlite отлично подходит для несложных проектов и уже входит в стандартную библиотеку питона, поэтому для начала я решил использовать её.

1 урок | Создание ECHO бота AIOGRAM | Программирование с нуля | Python

Через несколько часов работы приложение было написано, и мы с коллегами решили протестировать на себе его работоспособность. Бот запускался с использование технологии long polling, и запускался он на локальном компьютере. Для небольшого количества человек этого вполне достаточно: 3-4 человека в секунду бот выдерживает без особых проблем.

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

Решением этой проблемы стал переход на вебхуки. И для обеспечения бесперебойной работы разместим его на удалённом сервере. Отличным решением для этого является heroku: здесь можно управлять запуском приложения как с компьютера, так и с мобильного приложения, отслеживать логи и, что является наиболее важным для нас, настраивать вебхуки.

Алгоритм для реализации эхо бота в данном случае занимает больше времени, но он достаточно прост:

2) На странице Personal создаём новое приложение:

Выбираем имя нашего приложения (у меня это «aiogram-echo-bot-webhook» — запомним его, оно нам ещё понадобится!), меняем сервер на Europe и нажимаем кнопку «create app»:

Отлично, мы подготовили контейнер для нашего приложения! Передать туда код самого приложения можно несколькими способами, например, через Heroku CLI или через GitHub. Разберём деплой через гитхаб, так как при любой возможности лучше использовать контроль версий 🙂

Перед деплоем на Heroku хорошо бы переписать наше приложение на вехуки[1]:

Что здесь происходит?

TOKEN, HEROKU_APP_NAME мы считываем из переменных окружения, которые скоро добавим в наш проект.

WEBHOOK_HOST – доменное имя нашего приложения

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

Еще по теме:  Переименовать ссылку на ТГ

Телеграм бот на Python | Эхо-бот

WEBHOOK_URL – полный url адрес, на который будут принимать запросы.

WEBAPP_HOST – хост нашего приложения, оставляем локальный.

WEBAPP_PORT – порт, на котором работает наше приложение, так же считывается с переменных окружения, которое предоставляет Heroku, его мы не заполняем.

Асинхронная функция on_startup устанавливает вебхук для нашего телеграм бота, на который будут отсылаться уведомления о получении новых сообщений. И on_shutdown, наоборот, удаляет этот вебхук при выключении.

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

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

web: python main.py

Здесь: web – значит, что наше приложение будет web приложением, а то, что идёт после «:» это строка, которую необходимо выполнить в первую очередь. Запустить наш файл main.py с помощью питона.

И ещё один файл, который необходим для запуска, это requirements.txt, в котором мы указываем все зависимости нашего проекта. Его создаём, выполнив команду «pip freeze > requirements.txt».

Также можно указать, какую конкретную версию питона использовать: для этого создадим файл «runtime.txt» и впишем туда версию питона по шаблону «python-3.9.7».

Теперь подготовим переменные среды на Heroku: для этого переходим на вкладку «Settings» и жмём кнопку «Reveal Config Vars».

Источник: vc.ru

Чистый интерфейс Python для Telegram Bot API.

Пакет python-telegram-bot предоставляет чистый интерфейс Python для Telegram Bot API. Он совместим с версиями Python 3.7+. Пакет python-telegram-bot также может работать с PyPy3 (официально не поддерживается), хотя раньше было много проблем.

. Очень важный момент. API предоставляется через класс telegram.Bot . Методы, определенные в telegram.Bot являются эквивалентами в виде методов snake_case , описанных в официальной документации Telegram Bot API. Для удобства, также доступны точные названия методов в виде camelCase , указанные в официальной документации Telegram.

Так, например, вызов telegram.Bot.send_message совпадает с вызовом метода telegram.Bot.sendMessage официальной документации Telegram Bot API. Другими словами подмодуль telegram является оберткой Python официального API Telegram.

Все классы объектов Telegram Bot API расположены в основном модуле пакета telegram , например, класс объекта Message доступен как telegram.Message .

Внимание! Модуль python-telegram-bot-raw версии 13.x будут придерживаться многопоточной парадигмы программирования (на данный момент актуальна версия 13.15). Модуль версий 20.x и новее предоставляют чистый асинхронный Python интерфейс для Telegram Bot API. Дополнительно смотрите основные изменения в пакете python-telegram-bot версии 20.x.

Содержание:

  • Установка модуля python-telegram-bot-raw в виртуальное окружение.;
  • Многопоточный интерфейс Python для Telegram Bot API (версия 13.x);
  • Как отвечать/получать сообщения на чистом API;
  • Пример бота для ответа на сообщения на чистом API;

Установка модуля python-telegram-bot-raw в виртуальное окружение:

Модуль python-telegram-bot-raw предоставляет только интерфейс Python для Telegram Bot API, без дополнительных вспомогательных пакетов типа telegram.ext (фильтры, обработчики, планировщик, вебхук и т.д.).

Другими словами, ставим только основной модуль telegram (API Telegram) пакета python-telegram-bot :

# создаем виртуальное окружение, если нет $ python3 -m venv .telegram —prompt TelegramBot # активируем виртуальное окружение $ source .telegram/bin/activate # ставим многопоточную версию python-telegram-bot-raw (TelegramBot):~$ python3 -m pip install python-telegram-bot-raw==13.15 -U # или установка асинхронной версии python-telegram-bot-raw (TelegramBot):~$ python3 -m pip install python-telegram-bot-raw -U

Еще по теме:  Безопасен ли канди бот в Телеграмме

Многопоточный интерфейс Python для Telegram Bot API (версия 13.x).

Примечание: боты не могут самостоятельно инициировать разговоры с пользователями. Пользователь должен либо добавить их в группу, либо сначала отправить им сообщение. Для подключения к боту или каналу люди в основном используются ссылки, такие как https://telegram.me/bot_username или можно попробовать найти бота по имени в своем десктопном или мобильном приложении Telegram.

Как отвечать/получать сообщения на чистом API?

Для получения сообщений, отправленных боту, можно использовать метод API bot.getUpdates .

На чистом API это выглядит следующим образом:

updates = bot.get_updates() print([upd.message.text for upd in updates])

Получение изображения, отправленного боту:

updates = bot.get_updates() print([upd.message.photo for upd in updates if upd.message.photo])

Для отправки сообщения всегда нужен будет chat_id :

chat_id = bot.get_updates()[-1].message.chat_id message = bot.send_message(chat_id=chat_id, text=»Я бот, поговори со мной!»)

Примечание. Метод .send_message , как и любой из методов .send_* класса Bot возвращает экземпляр класса Message , поэтому его можно использовать в коде позже.

Ответ на конкретное сообщение, полученное в обновлении:

updates = bot.get_updates() updates.message.reply_text(«Прости, я не могу этого сделать.»)

Примечание. Существуют эквиваленты этого метода для ответа с фотографиями, аудио и т. д., а так же аналогичные эквиваленты встречаются по всей библиотеке python-telegram-bot .

Пример бота для ответа на сообщения на чистой реализации API Telegram.

Простой бот для ответа на сообщения Telegram. Пример построен на чистом API Telegram.

import logging from time import sleep import telegram from telegram.error import NetworkError, Unauthorized UPDATE_ID = None def echo(bot): «»»Эхо сообщение отправленное пользователем.»»» global UPDATE_ID # Запрашиваем обновление после последнего update_id for update in bot.get_updates(offset=UPDATE_ID, timeout=10): UPDATE_ID = update.update_id + 1 # бот может получать обновления без сообщений if update.message: # не все сообщения содержат текст if update.message.text: # Ответ на сообщение update.message.reply_text(f’ECHO: update.message.text>’) if __name__ == ‘__main__’: «»»Запускаем бота.»»» global UPDATE_ID # Токен авторизации бота Telegram bot = telegram.Bot(‘TOKEN’) # получаем первый ожидающий `update_id` try: UPDATE_ID = bot.get_updates()[0].update_id except IndexError: UPDATE_ID = None logging.basicConfig(format=’%(asctime)s — %(name)s — %(levelname)s — %(message)s’) # запускаем бесконечный цикл, который будет # ждать новые сообщения с тайм аутом в 1 сек while True: sleep(1) try: # вызываем функцию «Эхо сообщения» echo(bot) except NetworkError: # ошибка сети, ждем 5 секунд sleep(5) except Unauthorized: # Пользователь удалил или заблокировал бота. UPDATE_ID += 1

Асинхронный интерфейс Python для Telegram Bot API (версия 20.x).

Чтобы получить представление об асинхронном интерфейс Python для Telegram Bot API и о том, как его использовать с python-telegram-bot версии 20.x, создадим новый файл async-bot.py .

Здесь вызываем метод API bot.get_me() . Асинхронный менеджер контекста — строка: async with bot: гарантирует, что python-telegram-bot сможет правильно получать и освобождать ресурсы. Если запустить файл, то получим вывод:

$ python3 async-bot.py #

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

Примечание: боты не могут самостоятельно инициировать разговоры с пользователями. Пользователь должен либо добавить их в группу, либо сначала отправить им сообщение. Для подключения к боту или каналу люди в основном используются ссылки, такие как https://telegram.me/bot_username или можно попробовать найти бота по имени в своем десктопном или мобильном приложении Telegram.

Нужно сначала отправить сообщение боту. Если это сделано, то можно получить обновление. Перепишем функцию main() в файле async-bot.py :

Еще по теме:  Топ авы для Телеграмма

async def main(): bot = telegram.Bot(«TOKEN») async with bot: # получение обновления print((await bot.get_updates())[0])

Вывод теперь должен выглядеть примерно так (вывод немного сокращен):

$ python3 async-bot.py # # ‘message’: # ‘chat’: , # ‘from’: , # . # > # >

Из полученного сообщения нужно извлечь идентификатор чата, здесь это 1234567890. Обратите внимание, что можно получить к нему доступ также как update[0].message.from_user.id , так как update[0] является экземпляром класса Update . Теперь, когда идентификатор чата получен, можно отправить сообщение. Для этого снова перепишем функцию main() :

async def main(): bot = telegram.Bot(«TOKEN») async with bot: # отправка сообщения await bot.send_message(text=’Hi John!’, chat_id=1234567890)

Источник: docs-python.ru

Python-сообщество

[RSS Feed]

  • Начало
  • » Центр помощи
  • » Не получается создать Телеграм-эхо бота

#1 Июль 25, 2019 01:27:23

Не получается создать Телеграм-эхо бота

bot = telebot.TeleBot(“Мой токен ,который взял у BotFather в телеграме”)

def send_echo(messange):
bot.reply_to(messange, messange.text)
bot.polling( none_stop = True)

#Всем доброй ночи.Сейчас попробую объяснить свою проблему.Открыл я видеоурок по ЯП Python ,дойдя с автором урока до создания телеграм-бота ,начал ,как обезьяна ,все делать под копирку.
1)Для написания программы на языке Python использую Subline Text.
2)Для вывода использую командную строку от Windows ( и да ,программа выполняется,так что ошибки в том,что указал неверный путь до программы в командной строке нет)
3)В командной строке установил для телеграм-бота ,написав pip install pyTelegramBotAPI
4)Под копирку написал весь код,как у автора видео(Фото 1) ,но проблема в том,что у автора Subline Text не выделяет некоторые слова синим цветом(Фото 2),к примеру ,где написано bot.reply_to ,поэтому код и не выполняется.Прошу сравнить ФОТО1 и ФОТО2 между собой ,ибо сам код одинаковый ,но мне почему -то выдает ошибку.САМ КОД ЭТОЙ ПРОГРАММЫ В САМОМ ВЕРХУ УКАЗАН.
5)Перепроверил свой код и в программе PythonLiner ,он тоже выдал ошибки(ФОТО3) .Но у автора видеоурока все получилось и работало.
Прошу помочь разобраться,надеюсь,все грамотно объяснил.Заранее спасибо

Отредактировано c_g_july (Июль 25, 2019 01:31:28)

attachment

Прикреплённый файлы:
фото1,2,3.png (208,4 KБ)

#2 Июль 25, 2019 02:37:41

Не получается создать Телеграм-эхо бота

c_g_july
увидел,что форум почему-то вместо куска программы ставит смайл

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

c_g_july
поэтому дописываю ,что после types cтоит знак равно и в квадратных скобках написано ‘text’ ,и закрывает круглая скобка

А надо было всего-то поразбираться с форумом и узнать про теги экранирования кода, которые есть на большинстве форумов уже лет 20.

[code python][/code]

c_g_july
использую Subline Text

Ты ещё и невнимательный или с дислексией, как у Вупи Голдберг.
Программа называется Sublime Text. На скриншоте у тебя тоже такая же ошибка: в слове message ты ставишь лишнюю букву и получается messange.

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

c_g_july
Перепроверил свой код и в программе PythonLiner

Ну, он говорит, что telebot не установлен. Как ты его устанавливал, неизвестно. Если запускаешь питон в консоли, делаешь import telebot и он не может его найти, значит пакет установлен неправильно.

Отредактировано py.user.next (Июль 25, 2019 02:38:39)

Источник: python.su

Рейтинг
( Пока оценок нет )
Загрузка ...