Создаем Telegram-бот, работаем c I/O Bound нагрузкой, подключаем фичи Google Drive и пишем на C внутри Python.
Введение
В этой инструкции мы создадим приложение, которое интегрируется со сторонними API. Разберем I/O Bound нагрузку и поработаем с асинхронностью в Python.
Часть сервера Telegram-бота мы будем писать на С, так как он считается перформанс-ориентированным языком, поэтому посмотрим также модуль обработки СPU Bound нагрузки, использующийся для сложных вычислений процессора.
Мы постараемся объяснить все: от развертывания каждого модуля до настройки проекта на удаленном сервере.
Работать все это будет в вебе, поэтому для примера клиент-серверной архитектуры используется Telegram. У нас по дефолту будет мобильный+десктопный клиент, поэтому не придется писать фронтенд самому.
Теория
У многих приложений есть открытый интерфейс (API), к которому можно подключиться из своих программ. Например, так можно подключиться к YouTube и попросить сервис прислать описания всех роликов из конкретного плейлиста.
Как установить библиотеку в PyCharm. Что делать при Module Not Found Error
Что такое CPU Bound и I/O Bound нагрузка. Примеры
- Есть какая-то задача Х, которая сильно нагружает процессор. Например, одни из самых медленных операций, которые выполняет современный процессор — деление или тригонометрические функции типа sin или cos. Такие сложные для процессора операции называют CPU Bound нагрузкой.
- Если операции упираются в скорость сети, скорость записи или чтения какого-то файла с диска или ожидания запроса из базы данных — это I/O Bound нагрузка. Отправили запрос к серверу и ждете, пока он придет — процессор простаивает, как правило, 90% времени.
Как эти проблемы решаются в Python?
- Можно использовать модуль мультипроцессинга, который распараллелит вычисления на несколько процессов на нескольких реальных ядрах. Первый оверхед — создание новых процессов в операционной системе — достаточно дорогая операция. А их взаимодействие — второй оверхед, то есть обмен данными между ними — не самая простая вещь. Как минимум, чтобы передать объект между ними, объект должен быть сериализован и десериализован соответствующе. Если кратко: сериализация — это очень дорого.
- Мультитрединг — дешевле, особенно вскейле, то есть когда мы планируем масштабировать и создавать большие пулы потоков. Потому что поток — это более легковесная сущность с точки зрения операционной системы и в сравнении с процессом, как минимум.
Самое важное, что потоки расшаривают одну и ту же область памяти внутри одного процесса. То есть обмен данными между ними организован гораздо проще.
В Python есть GIL или блок интерпретатора, с которым могут быть проблемы. В каждый конкретный момент времени может работать только один, залоченный поток, а другим приходится ждать.
Разработка Telegram Bot на Python. (0. Установка программ)
В случае решения второй проблемы и I/O Bound нагрузки, то в Python она решается асинхронным программированием.
Практика
О том, как создаются Telegram-боты, можно посмотреть здесь. Начнем с нашего интерфейса.
Возьмем первую библиотеку для Python: Python-telegram-bot.
Чтобы не захламлять компьютер чем-то лишним, будем использовать питоновскую виртуальную среду (venv). Это похоже на изолированный контейнер, в котором можно проводить любые опыты, и доступно это только внутри этой папки.
Сначала нам нужен токен от BotFather для аутентификации с API Telegram. Плюс здесь можно устанавливать ряд других настроек: изменить описание, поставить моды. BotFather по сути представляет собой админку.
Токен мы будем хранить в скрытых данных. За это в Python отвечает модуль dotenv, который также ставится внутри нашей виртуалки, и в сам файл уже переносим токен.
from bot.bot import start, list_files, upload_file, search_button, cython, pi_button, FIRST, SECOND from dotenv import load_dotenv from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, CallbackQueryHandler, ConversationHandler import os async def hello(update: Update, context: ContextTypes.DEFAULT_Type) ->Name: Name: await update.message.replay_text(f’Hello(update.effective_user.first_name)’) load_dotenv() application = ApplicationBuilder().token(os.getenv(‘TOKEN’)).build() app.add_handler(CommandHandler(“hello”, hello)) app.run.polling()
Чтобы подружить Telegram с Google Drive воспользуемся API /quickstart/python. Здесь нам нужно получить что-то вроде токена, как и в случае аутентификации с API Telegram, только в Google API это называется(Credentials). В main.py мы должны добавить и токен, и обработчик функции start.
По этой логике нужно написать еще одну функцию и добавить ее в еще один handler уже для сэмпла от Google Drive.
Добавляем еще один CommandHandler (обработчик команд или все, что мы пишем через слэш).
В Telegram, проверить работу функции можно командой /files, которую мы можем легко добавить в админке BotFather
По коду Google: мы достаем секретки и вытаскиваем все файлы, дальше выводим их в консоль. Можно сделать, чтобы ответ приходил не в консоль сервера, а сразу в бот на клиент.
Загрузка файлов
Для демонстрации возможностей добавим еще и загрузку файлов. Google предлагает здесь обширный список того, что можно делать: Работа со всеми видами файлов, работа с UI Google Drive, и так далее.
Нам для интерактивности нужна динамика, поэтому мы будем грузить файл сначала на наш сервер через интерфейс Telegram, а уже оттуда его перенаправлять в Google Drive.
Чтобы загрузить файл сначала к нам на сервер, воспользуемся вот этим код-сниппетом из библиотеки telegram-bot-api а конкретно Download file.
Промежуточный итог
У нас есть сервер. Место, где мы разворачиваем наш код: удаленный или наш компьютер. Там мы запускаем наш Telegram-бот. Через интерфейс Telegram-бота, который нам дается по стандарту, мы можем загрузить файл, и он будет у нас лежать либо на компьютере, либо на удаленном сервере.
Этим сниппетом сначала загружаем файлы на компьютер. В отдельную функцию вынесем аутентификацию с Google Drive, чтобы было почище. Дальше во все захардкоденные сниппеты Google мы добавим наши динамические данные в виде имен файлов и путей. Все это достается из аргументов Update и Context.
Добавим также обработчик команд MessageHandler для медиасообщений.
Теперь, если вызвать эту функцию, то сначала файл появится в нашей папке Downloaded, а потом в Google Drive.
В конечном счете код в файле main.py у нас должен выглядеть так:
from bot.bot import start, list_files, upload_file, search_button, cython, pi_button, FIRST, SECOND from dotenv import load_dotenv from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, CallbackQueryHandler, ConversationHandler import os def main(): import cProfile import pstats load_dotenv() application = ApplicationBuilder().token(os.getenv(‘TOKEN’)).build() application.add_handler(CommandHandler(‘start’, start)) with cProfile.Profile() as pr: application.add_handler(CommandHandler(‘files’, list_files)) stats = pstats.Stats(pr) stats.sort_stats(pstats.SortKey.TIME) stats.dump_stats(filename=’profiling.prof’) conv_handler = ConversationHandler( entry_points=[CommandHandler(«cython», cython)], states=< FIRST: [CallbackQueryHandler(search_button)], SECOND: [CallbackQueryHandler(pi_button)], >, fallbacks=[CommandHandler(«cython», cython)], ) application.add_handler(conv_handler) application.add_handler(MessageHandler(filters.Document.ALL, upload_file)) application.run_polling() if __name__ == ‘__main__’: main()
На этом мы закончили работу с I/O Bound нагрузкой и ее функциями. А что если мы хотим добавить функциональность по нагрузке процессора? Вариаций действительно много. Можно сделать промежуточный лэйер, который будет брать видео, которые мы грузим, монтажить их в клип, сжимать и выгружать на Google Drive уже готовые препродакшн видео.
Модуль для сложных вычислений на процессоре
Следующая фича на бэкенде. Мы сейчас добавим модуль для CPU Bound обработки именно на процессоре, и делать это будет Python в связке с языком С. Более того, делать мы это будем в нескольких потоках. То есть мы отключим питоновский GIL.
Потенциально это может создать много проблем с синхронизацией, но тема многопоточности — это отдельная история, которую мы в рамках инструкции вынесем за скобки.
Первый модуль будет большой аллокацией + бинарный поиск по массиву. Заодно так проверим, как это работает. Папка lowlevel для C-файлов и сразу заведем модуль с парой простых функций.
int*allocate(int N) int* ptr = malloc(sizeof(int)* N);
Выделяем память для массива данных. Внутри функции поиска элементов будем вызывать наши функции для аллокации и генерации данных. Так можно увидеть наглядно, как работает процессор линейно, в нескольких потоках и в нескольких процессах. Эта практика сейчас используется для наглядности, но в боевых проектах так делать не стоит.
Чтобы вызывать код на С из-под Python нам потребуется Cython. Это суперсет Python, который позволяет писать на C прямо внутри Python. Чтобы все это работало, нужно поставить это в виртуалку и добавить файл для интерфейса Python и C.
cdef extern from «lowlevel/module.c» nogil; int binary_search_imp(int index) cdef int b_search_(int index):
Затем создаем промежуточную функцию, которая будет вызывать нашу экспортированную C функцию.
cdef int b_search(int index): return binary_search_impl(index); def binary_search(int index, results = None): cdef int result; with nogil: result = b_search(index); if results is not None: results.append(result) return result
Самое важное — поставить аннотацию nogil, то есть здесь мы отключаем лок интерпретатора (GIL).
Итак, у нас есть С файл с core-функциями. У нас есть файл, чтобы этими функциями пользоваться в самом Python.
Теперь в новом файле опишем все Python-функции. Чтобы не путаться, назовем его, например, performance.py. В него сразу добавим функцию по вычислению дельты времени, от начала и конца исполнения. Она позволит наглядно увидеть скорость Python в линейном режиме, многопоточном и в многопроцессном.
Функция, внутри которой есть функция-обертчик, где есть вызов функции, которую мы декорируем. Чтобы протестить все, что мы написали, нам нужны три основных функции.
Линейная. Все вычисления будут происходить по очереди в одном потоке, как обычно работает Python. Асинхронность здесь не сработает, потому что все это нагружает именно процессор, а не любого рода ввод/вывод.
def linear(N) results = [] binary_search(N, results) return results
Многопоточная. Создаем пять потоков по одному вызову в каждом.
def multithreaded(N): results = []
Мультипроцессинговая. Функция с изолированным друг от друга процессами: shared.list.
shared.list. def multithreaded(N): results = mp.Managed.lists()
Теперь перейдем к следующему конфигу, по настройке Cython. Назовем его setup.py. Что здесь должно быть?
- файл, который нужно скомпилировать,
- модуль, который мы создаем и будем использовать,
- функция setup, которая будет все это структурировать.
Код выглядит так:
from setuptools import setup from distutils.extension import Extension from Cython.Distutils import build_ext sourceFiles = [‘bot/nogil.pyx’] ext_modules = [ Extension(«nogil», sourceFiles ), ] setup( name=’google drive app’, cmdclass=, ext_modules=ext_modules )
Добавим простой bash-script, чтобы собирать все было удобнее.
# !/bin/bash [! -e «nogil.c» ] || rm «nogil.c» find . -name «*.so» -type f -delete python3 setup.py build_ext -b build mv bot/*.c bot/lowlevel/
Теперь все должно адекватно пересобираться и раскладываться по своим местам.
Чтобы в самом Telegram-боте это выглядело красиво, добавим пару кнопок. В Inline-боте нужны две функции: описание и кнопка + события, которые будут происходить, когда мы будем на нее нажимать.
Вызываем функцию бинарного поиска в наших 3-х тестах. Линейном, многопоточном и многопроцессном, дергаем наши три функции. Добавляем обработчики для кнопок и можно тестировать.
Почти секунда у нас уйдет, чтобы выделить необходимую память для каждого вызова функции. Многопоточность обгоняет линейную более чем на 50%. Многопроцессность также быстрее, но все же уступает многопоточности.
В конце у нас должен получиться примерно такой код в bot.py:
Тестируем на Linux сервере
Мы будем использовать последнюю версию Ubuntu и выберем самое простое железо. Кроме этого, с помощью Shared Line можно использовать только 10% ресурсов, поэтому это будет еще дешевле, но под наш pet-проект хватит. В день такая конфигурация будет стоить не больше 15 рублей.
Поднимаем и обновляем там все, потому что это fresh Linux. Далее загружаем весь код бота на сервер, и можно приступать к тестированию: закинем пару файлов в наш Telegram-бот. Тестируем работу загрузки файлов. Вывода файлов, и сами функции по нагрузке CPU bound вычислений.
Заключение
Мы подключаемся к открытому API Google Drive, и вместо того, чтобы в самом диске нажимать разные кнопки, мы можем управлять им из-под Telegram-бота. Сделать это можно не только с диском, но и с любым сервисом, у которого есть открытый API.
Кроме этого, мы рассмотрели пару фич для работы с CPU Bound нагрузками, что может помочь разгрузить какие-то сложные для процессора вычисления.
Зарегистрируйтесь в панели управления
И уже через пару минут сможете арендовать сервер, развернуть базы данных или обеспечить быструю доставку контента.
Источник: selectel.ru
Как учить Python с нуля с удовольствием: пишем своего чат-бота
Привет! Меня зовут Илья Осипов, я методист курса программирования на Python «Девман» и больше 5 лет пишу код на этом языке. Сегодня расскажу, как новичку сделать полезного чат-бота.
Python — классный язык программирования. Но многие новички учат его неправильно: почти все онлайн-курсы, тренажёры, книги и видео предлагают начинать учить Python с нуля с каких-то странных задач, вроде: «Давайте решим вот эту математическую задачку» или «Давайте напишем рекурсивный поиск чисел Фибоначчи». Вы уже тоже зеваете от скуки?
Нет, удовольствие от программирования совсем не в этом, а в том, чтобы решать реальные проблемы. Например, я втянулся в программирование, когда писал чат-бота для своего вуза. Расписание на сайте было очень неудобно смотреть. Я решил потратить время и написать чат-бота, который будет присылать мне расписание занятий в более удобном виде. Оказалось, что другим студентам тоже было неудобно, и спустя год в чат-боте накопилось 4 тысячи пользователей.
Разработчик Форсайт АО «Гринатом» , Москва, можно удалённо , По итогам собеседования
Как раз на стыке между освоением синтаксиса и решением реальных проблем, как мне кажется, и сдаются большинство начинающих программистов. Совершенно не понятно как перейти от «сложить два числа» к написанию чего-то стоящего, чем можно похвастаться родителям, друзьям, жене и собаке.
Если вы тоже обнаружили себя в этой «яме», то этот туториал для вас. Дайте себе ещё один шанс.
Шаг 1. Зайдите в Repl.it
Создайте песочницу для языка Python. Ничего устанавливать не нужно. Просто откройте эту ссылку в соседней вкладке.
Придётся зарегистрироваться, но, думаю, вы разберётесь.
А вы уже нажали кнопку? Нет? Идите жмите!
Шаг 2. Пройдите шаг 1
Эй, хватит читать! Так дела не делаются! Чтобы научиться программировать на Python — нужно писать код своими руками, а не смотреть, как кто-то делает это за вас
Вы же не думаете, что можно стать альпинистом, просматривая видео, как другие люди лезут в горы? А уж инструктором вас без реального опыта и подавно никто не наймёт. С программированием то же самое.
Шаг 3. Установите библиотеку для написания ботов
Многие советуют пользоваться более сложными библиотеками для чат-ботов. Например aiogram . Она крутая и популярная, но это библиотека для асинхронного кода. Это совсем другой зверь, которого не стоит касаться новичкам. Воспринимайте асинхронные библиотеки как другой язык программирования, хотя бы на старте.
Вместо этого будем работать с куда более простой библиотекой — python-telegram-bot . Откройте меню для установки библиотек слева-снизу:
Нужна кнопка Packages.
И в появившемся окошке вбейте её название. Нажмите на «+» напротив названия и подождите загрузки. В конце появится вот такая зелёная плашка об успехе:
Название библиотеки можно скопировать прямо из статьи, не обязательно печатать.
Теперь сложноватый и неприятный момент, но такова разработка, за это нам и платят деньги. Нужно будет поменять версию библиотеки на более дружелюбную для новичков. Для этого нужно зайти в очень недружелюбный файл и подправить число на 13.15 . В общем-то больше ничего делать и не нужно, думаю, вы справитесь:
Очень страшно, ничего не понятно, но надо только поменять одно число.
Шаг 4. Запустите пример из документации
В документации к библиотеке есть готовые примеры кода. Давайте запустим пример эхобота.
Эхобот — это бот, который просто повторяет за вами. Отвечает вам тем же, что вы написали ему. Вот пример в документации. Я почистил его от всякого ненужного, поэтому можете взять сразу мой, он должен быть не таким страшным. Копируйте этот код в файл main.py и жмите кнопку > Run наверху. Ничего не получится, но так и нужно, об этом ниже:
from telegram import Update, ForceReply from telegram.ext import Updater, CommandHandler, MessageHandler, Filters def start(update, context): user = update.effective_user update.message.reply_text(‘Привет!’) def echo(update, context): update.message.reply_text(update.message.text) if __name__ == ‘__main__’: updater = Updater(«TOKEN») dispatcher = updater.dispatcher dispatcher.add_handler(CommandHandler(«start», start)) dispatcher.add_handler(MessageHandler(Filters.text #128578;
Осталось вставить полученный токен в код и запустить его снова:
Не накосячьте с кавычками.
Заходите в Telegram, открывайте переписку с вашим ботом, и получайте удовольствие от беседы с цифровым другом:
Он всё ещё за мной повторяет.
Шаг 6. Начните менять код
В скопированном коде много всего страшного. Давайте коротко расскажу, как это всё работает.
Начинается исполнение кода отсюда:
if __name__ == ‘__main__’: updater = Updater(«5646004689:AAECTkuGjWo1Imwr-_6UrN-nzbo89sd3WSM») dispatcher = updater.dispatcher dispatcher.add_handler(CommandHandler(«start», start)) dispatcher.add_handler(MessageHandler(Filters.text #128521;
Источник: tproger.ru
Библиотека python-telegram-bot
Для работы с Bot API есть четыре популярные Python-библиотеки:
Поработаем с python-telegram-bot. Это популярная библиотека с удобным интерфейсом: методы классов совпадают с названиями методов Bot API.
В python-telegram-bot все методы Bot API вызываются как методы различных классов библиотеки.
Библиотека разделена на три пакета:
- telegram — основной пакет, содержит все методы Bot API, перенесённые на Python.
- telegram.ext — вспомогательный пакет, он содержит методы-обёртки для стандартных методов Bot API, позволяет упростить код и убирает рутинные операции «под капот», примерно так же, как это происходит во фреймворках.
- telegram.utils — пакет для продвинутой работы с библиотекой, позволяет переопределять и расширять библиотеку.
Пакеты python-telegram-bot импортируются в код под именем telegram (это неожиданно, но это так):
import telegram # Здесь будет код Телеграм-бота
PYTHONimport telegram.ext # Здесь будет код Телеграм-бота
Bot API vs PEP8
В официальной документации Bot API все методы описаны в camelCase, но это не питонично, поэтому разработчики библиотеки python-telegram-bot продублировали названия методов в snake_case.
Это значит, что метод sendMessage может быть вызван двумя способами:
- telegram.Bot.sendMessage ,
- telegram.Bot.send_message .
Результат будет одинаков, но лучше соблюдать PEP8 и писать в стиле snake_case.
Библиотека
Для стандартных задач в библиотеке python-telegram-bot есть готовые решения:
- отправка/получение сообщений;
- обработка «команд» — сообщений со слешем, вроде /start или /help ;
- создание кнопок;
- запись в базу (долговременное хранение сообщений).
Решение всех этих задач реализовано на классах.
Создайте новый проект в директории /tg_bot, установите виртуальное окружение и библиотеку python-telegram-bot.
mkdir tg_bot # Создаём директорию cd tg_bot # Переходим в эту директорию python3 -m venv venv # Создаём виртуальное окружение . venv/bin/activate # Активируем виртуальное окружение # Для Windows команда source venv/Scripts/activate pip3 install python-telegram-bot # Устанавливаем библиотеку
Класс Bot()
Этот класс реализует методы API, связанные с отправкой, редактированием, пересылкой или удалением сообщений и прочими активными действиями бота, не связанными с получением и обработкой входящих сообщений. Полная информация о классе Bot() есть в документации.
Например, на основе класса Bot() можно написать бота-администратора, который будет удалять из группового чата сообщения с неприличными словами и отправлять уведомления авторам этих постов.
В начале работы создаётся экземпляр класса Bot() и в него передаётся токен. После этого можно вызывать методы класса:
from telegram import Bot bot = Bot(token=») # Отправка сообщения chat_id = 123456 text = ‘Вам телеграмма!’ bot.send_message(chat_id, text)
Из соображений безопасности токен следует хранить в переменных окружения, но для начала работы поставьте токен прямо в код.
- подставьте в код chat_id своего аккаунта,
- подставьте в код свой токен,
- отправьте сообщение.
Класс Updater()
Этот класс предназначен для получения и обработки входящих сообщений.
При создании объекта класса Updater в него передаётся токен, точно так же, как и в Bot :
from telegram.ext import Updater updater = Updater(token=»)
Экземпляры классов Bot и Updater принимают на вход токен Телеграм-бота и могут делать запросы от имени его аккаунта. Фактически экземпляры классов Bot и Updater — это экземпляры бота.
Обработка входящих сообщений
Сообщения в Telegram делятся на типы: есть простые текстовые сообщения, есть сообщения-картинки, сообщения-стикеры, сообщения-файлы. Каждый тип можно обрабатывать по-разному: например, текстовые сообщения можно парсить и отвечать на них текстовым сообщением, полученные картинки и файлы сохранять или пересылать, а на стикеры отвечать стикерами.
Настроим бота так, чтобы он отправлял приветствие каждый раз, когда получит любое текстовое сообщение. Для этого нам нужно создать обработчик. Такой обработчик создаётся с помощью класса MessageHandler .
Handler — общеупотребимый в программировании термин, он как раз и означает «обработчик».
У объекта Updater есть атрибут dispatcher («диспетчер» или «распределитель»). Именно он распределяет сообщения, которые приходят от пользователей, по разным обработчикам.
Для обработки сообщений:
- Посредством диспетчера регистрируется класс-обработчик (для примера выбран обработчик MessageHandler ): updater.dispatcher.add_handler(MessageHandler(. )) .
- В обработчик передаются два параметра: updater.dispatcher.add_handler(MessageHandler(Filters.text, say_hi))
- Filters.text — фильтр, выбирающий из обновлений сообщения определённого типа (в приведённом примере будут выбраны только текстовые сообщения).
- say_hi() — функция, которая будет обрабатывать выбранные сообщения.В функцию передаются два аргумента:
- update — это обновление, которое пришло с сервера. В этом объекте есть само сообщение, информация о чате и много других полезных данных.
- context — в этом объекте хранится информация о боте, а также другая опциональная информация.Эти аргументы передаются неявно: в коде обработчика описывать эти аргументы не нужно, но вызываемая функция должна ожидать их: say_hi(update, context) .
- С помощью этой функции мы будем отвечать в чат текстом «Привет, я бот». При отправке обязательно нужно указать идентификатор чата chat_id . Его можно получить из объекта update и сохранить, например, в переменную chat .
from telegram.ext import Updater, Filters, MessageHandler updater = Updater(token=») def say_hi(update, context): # Получаем информацию о чате и сохраняем в переменную chat chat = update.effective_chat # В ответ на любое текстовое сообщение будет отправлен ответ ‘Привет, я бот’ context.bot.send_message(chat_id=chat.id, text=’Привет, я бот’) # Регистрируется обработчик MessageHandler; # из всех полученных сообщений он будет выбирать только текстовые сообщения # и передавать их в функцию say_hi() updater.dispatcher.add_handler(MessageHandler(Filters.text, say_hi)) # Метод start_polling() запускает процесс polling, # приложение начнёт отправлять регулярные запросы для получения обновлений. updater.start_polling()
Метод start_polling отправляет регулярные запросы к серверу Telegram и проверяет обновления. По умолчанию запросы отправляются каждые 10 секунд. Периодичность опроса можно изменить, передав методу именованный параметр poll_interval и указав нужный интервал запросов (в секундах, float ):
updater.start_polling(poll_interval=20.0)
Прервать выполнение программы можно комбинацией клавиш Ctrl + C .
Класс Filters()
Класс Filters() может отфильтровывать сообщения по типу:
- Filters.text ,
- Filters.photo ,
- Filters.video .
- можно фильтровать по ID или имени отправителя, по типу чата (личный чат или канал) или по множеству других признаков.
Если требуется обработать все сообщения — применяют Filters.all . Документация по фильтрам.
Обработчики в python-telegram-bot
В библиотеке python-telegram-bot есть множество готовых обработчиков для разных задач.
Эти обработчики связывают список отфильтрованных по какому-то признаку сообщений с функцией, которая должна этот список обработать.
Приведённый в примере обработчик MessageHandler фильтрует полученные сообщения (выбирает только текстовые), сохраняет их в объект Update — и они обрабатываются в функции say_hi() .
. updater.dispatcher.add_handler(MessageHandler(Filters.text, say_hi)) .
Чтобы посмотреть, в каком виде полученные сообщения хранятся в объекте Update :
- отправьте своему боту несколько сообщений;
- измените код функции say_hi() так, чтобы она вывела на печать объект Update , полученный в первом аргументе;
- запустите этот код в редакторе.
MessageHandler — один из самых популярных и универсальных обработчиков в библиотеке, ведь чаще всего работа идёт именно с сообщениями.Обработчик CommandHandler более специализирован: он предназначен для обработки команд — сообщений, начинающихся со слеша / . Самые распространённые команды — /start , /help : скорее всего, вы их уже использовали при общении с ботами.
CommandHandler выбирает из обновлений сообщения с командами, сохраняет их в объект Update и обрабатывает эти сообщения в функции, указанной вторым аргументом в обработчике.
from telegram.ext import Updater, CommandHandler updater = Updater(token=») def wake_up(update, context): # В ответ на команду будет отправлено сообщение ‘Спасибо, что включили меня’ chat = update.effective_chat context.bot.send_message(chat_id=chat.id, text=’Спасибо, что включили меня’) # Регистрируется обработчик CommandHandler; # он будет отфильтровывать только сообщения с содержимым ‘/start’ # и передавать их в функцию wake_up() updater.dispatcher.add_handler(CommandHandler(‘start’, wake_up)) updater.start_polling()
Обработать команды можно и через универсальный MessageHandler, отфильтровав сообщения через Filters , но CommandHandler упростит эту задачу.
Похожие записи:
- Бот в Telegram
- Библиотека python-telegram-bot. Пример
- Client API в Telegram
- Django — доработка шаблона формы регистрации
Источник: mob25.com