Внимание! Пакеты
python-telegram-bot
версии 13.x будут придерживаться многопоточной парадигмы программирования (*на данный момент актуальна версия 13.15). Пакеты версий 20.x и новее предоставляют чистый асинхронный Python интерфейс для Telegram Bot API. Дополнительно смотрите основные изменения в пакетеpython-telegram-bot
версии 20.x.
Объект контекста CallbackContext
принимает объект Dispatcher
, который содержит контекст принятого сообщения. Далее, через экземпляр Dispatcher
контекст передается в зарегистрированный обработчик сообщений, который в свою очередь передает его в свою функцию обратного вызова. В функции обратного вызова объект контекста доступен как параметр context
.
telegram.ext.CallbackContext(dispatcher)
:Класс telegram.ext.Dispatcher
создаст единый контекст для всего обновления. Это означает, что если есть 2 обработчика в разных группах и они оба вызываются, то им будет передан один и тот же объект CallbackContext
(атрибуты .matches
будут отличаться). Это позволяет добавлять пользовательские атрибуты в обратный вызов более низкой группы обработчиков, а затем впоследствии получать доступ к этим атрибутам в обратном вызове более высокой группы обработчиков.
Обратите внимание, что атрибуты в CallbackContext
могут измениться в будущем, поэтому обязательно используйте для них довольно уникальное имя.
Внимание!!! Не объединяйте пользовательские атрибуты и @run_async
/telegram.ext.Disptacher.run_async()
. Из-за того, как работает run_async
, он почти наверняка выполнит обратные вызовы для сообщения не по порядку, и атрибуты, которые были добавлены, не будут присутствовать.
CallbackContext
.context.bot_data
:Атрибут context.bot_data
представляет собой словарь dict
, который можно использовать для хранения любых дополнительных данных.
Для каждого обновления это будет один и тот же словарь.
context.chat_data
:Атрибут context.chat_data
представляет собой словарь dict
, который можно использовать для хранения любых дополнительных данных.
Для каждого обновления с одного и того же идентификатора чата это будет один и тот же словарь.
Внимание! Когда групповой чат переходит в супергруппу, то его идентификатор чата изменится, в этом случае context.chat_data
должен быть передан в супергруппу. Подробности смотрите в материале "Хранение данных модулем python-telegram-bot
".
context.user_data
:Атрибут context.chat_data
представляет собой словарь dict
, который можно использовать для хранения любых дополнительных данных.
Для каждого обновления от одного и того же пользователя это будет один и тот же словарь.
context.matches
:Атрибут context.matches
представляет собой список объектов соответствия для каждого шаблона, по которому задействованная функция re.search()
вернула совпадение.
Атрибут context.matches
доступен, если связанное обновление исходило от обработчика, поддерживающего регулярные выражения, или имело Filters.regex
. Обратите внимание, что фильтры имеют замыкание подобно операторам and
, or
или not
, поэтому комбинированные фильтры регулярных выражений не всегда будут оцениваться.
context.args
:Атрибут context.args
представляет собой список слов в тексте, разделенных по пробелам, которые следуют за какой либо командой, если связанное сообщение обрабатывается обработчиком CommandHandler
, PrefixHandler
или StringCommandHandler
.
context.error
:Атрибут context.error
представляет собой поднятое исключение. Присутствует только при передаче обработчику ошибок, который должен быть зарегистрирован Dispatcher.add_error_handler()
.
context.async_args
:Атрибут context.async_args
представляет собой список позиционных аргументов функции, которая подняла ошибку. Присутствует только тогда, когда эта функция была запущена асинхронно с Dispatcher.run_async()
.
context.async_kwargs
:Атрибут context.async_kwargs
представляет собой словарь ключевые аргументы функции, вызвавшей ошибку. Присутствует только при асинхронном запуске этой функции с помощью Dispatcher.run_async()
.
context.job
:Атрибут context.job
представляет собой задание Job
, вызвавшее этот обратный вызов. Присутствует только при передаче в обратный вызов telegram.ext.Job
.
context.bot
:Атрибут context.bot
представляет собой экземпляр telegram.Bot
(API Telegram), связанный с этим контекстом.
context.dispatcher
:Атрибут context.dispatcher
представляет собой экземпляр диспетчера Dispatcher
, связанный с этим контекстом.
context.job_queue
:Атрибут context.job_queue
представляет собой объект JobQueue
, используемый экземпляром диспетчера Dispatcher
и (обычно) экземпляром Updater
, связанным с этим контекстом.
context.match
:Атрибут context.match
объект первого совпадения match
из всех совпадений context.matches
. Полезно, если для фильтрации сообщений использовался только один фильтр Filters.regex
. Возвращает Нет, если спички пусты.
context.update_queue
:Атрибут context.update_queue
представляет собой экземпляр очереди Queue
, используемый диспетчером Dispatcher
и (обычно) экземпляром Updater
, связанным с этим контекстом.
CallbackContext
.В основном CallbackContext
используется в функции обратного вызова обработчика сообщений:
from telegram.ext import Updater, CommandHandler updater = Updater(token='TOKEN') dispatcher = updater.dispatcher # функция обратного вызова для команды '/caps' # объект `CallbackContext` передается в качестве аргумента `context` def caps(update, context): # `context` содержит аргументы команды '/caps' в виде списка if context.args: # здесь список `context.args` объединяется # в строку и переводится в верхний регистр text_caps = ' '.join(context.args).upper() context.bot.send_message(chat_id=update.effective_chat.id, text=text_caps) else: context.bot.send_message(chat_id=update.effective_chat.id, text='No command argument') context.bot.send_message(chat_id=update.effective_chat.id, text='send: /caps argument') # обработчик команды '/caps' caps_handler = CommandHandler('caps', caps) # регистрируем обработчик в диспетчере dispatcher.add_handler(caps_handler) updater.start_polling() updater.idle()