Начиная с версии 12.4, пакет python-telegram-bot
поддерживает передачу значений по умолчанию для таких аргументов, как parse_mode
, чтобы уменьшить количество повторного кода. Для этого был введен класс Defaults
, что позволяет установить значения по умолчанию для часто используемых аргументов. Они устанавливаются при создании бота и в последствии неизменяемы.
parse_mode
(Markdown/HTML). Устанавливает режим парсинг сообщении бота;disable_notification
- (bool
). Отправляет сообщение молча. Пользователи получат уведомление без звука;disable_web_page_preview
(bool
). Отключает предварительный просмотр ссылок в этом сообщении;allow_sending_without_reply
(bool
). True
, если сообщение должно быть отправлено, даже если указанное ответное сообщение не найдено;timeout
(float
). Для версии 13.x. Если это значение указано, то оно используется в качестве тайм-аута чтения с сервера (вместо указанного при создании пула соединений);quote
(bool
). Если установлено значение True
, то ответ отправляется как фактический ответ на сообщение. Если reply_to_message_id
передается в kwargs
, этот параметр будет проигнорирован. По умолчанию: True
в групповых чатах и False
в приватных чатах;tzinfo
(объект pytz
). Часовой пояс, который будет использоваться для всех входных данных даты (времени). Должен быть часовой пояс, предоставленный модулем pytz
. По умолчанию UTC;run_async
(bool
). Для версии 13.x. Настройка по умолчанию для параметра run_async
обработчиков и обработчиков ошибок. По умолчанию False
.block
(bool
, необязательный). Добавлено для версии 20.x. Настройка по умолчанию для параметра BaseHandler.block
обработчиков обратных вызовов и обработчиков ошибок, зарегистрированных с помощью Application.add_handler()
и Application.add_error_handler()
. По умолчанию True
.protect_content
(bool
, необязательный). Добавлено для версии 20.x. Защищает содержимое отправленного сообщения от пересылки и сохранения.В примере устанавливается значение parse_mode
на ParseMode.HTML
и tzinfo
на pytz.timezone('Europe/Berlin')
по умолчанию:
Для для версии пакета 13.x:
import pytz import datetime as dtm from telegram import ParseMode from telegram.ext import Updater, MessageHandler, Filters, Defaults def job(context): chat_id = context.job.context local_now = dtm.datetime.now(context.bot.defaults.tzinfo) utc_now = dtm.datetime.utcnow() text = 'Running job at {} in timezone {}, which equals {} UTC.'.format( local_now, context.bot.defaults.tzinfo, utc_now ) context.bot.send_message(chat_id=chat_id, text=text) def echo(update, context): # Отправление сообщений с парсингом по умолчанию update.message.reply_text('<b>{}</b>'.format(update.message.text)) # Переопределение режима парсинга сообщений по умолчанию update.message.reply_text('*{}*'.format(update.message.text), parse_mode=ParseMode.MARKDOWN) update.message.reply_text('*{}*'.format(update.message.text), parse_mode=None) # Задание по расписанию context.job_queue.run_once(job, dtm.datetime.now() + dtm.timedelta(seconds=1), context=update.effective_chat.id) def main(): """Создание экземпляра объекта Defaults""" defaults = Defaults(parse_mode=ParseMode.HTML, tzinfo=pytz.timezone('Europe/Berlin')) """Создаем слушатель""" updater = Updater("TOKEN", use_context=True, defaults=defaults) # диспетчер для регистрации обработчиков dp = updater.dispatcher # Если сообщение не команда то отвечаем репликой # смотрите функцию обработчик `echo()` dp.add_handler(MessageHandler(Filters.text & ~Filters.command, echo)) # Запуск Telegram бота updater.start_polling() updater.idle() if __name__ == '__main__': main()
То же самое для для асинхронной версии пакета 20.x:
Изменения кода для асинхронного python-telegram-bot
версии 20.x смотрите в обзорном материале в подразделе "Асинхронный модуль расширения telegram.ext
(версия 20.x)"
import logging import pytz import datetime as dtm from telegram.constants import ParseMode from telegram.ext import MessageHandler, filters, Defaults, Application logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) async def job(context): chat_id = context.job.chat_id timezone = context.bot.defaults.tzinfo local_now = dtm.datetime.now(timezone) utc_now = dtm.datetime.utcnow() text = f'Running job at {local_now} in timezone {timezone}, which equals {utc_now} UTC.' await context.bot.send_message(chat_id=chat_id, text=text) async def echo(update, context): text = update.message.text # Отправление сообщений с парсингом по умолчанию await update.message.reply_text(f'<b>{text}</b>') # Переопределение режима парсинга сообщений по умолчанию await update.message.reply_text(f'*{text}*', parse_mode=ParseMode.MARKDOWN) # Отправка без режима синтаксического анализа await update.message.reply_text(f'*{text}*', parse_mode=None) # Schedule job context.job_queue.run_once( job, dtm.datetime.now() + dtm.timedelta(seconds=1), chat_id=update.effective_chat.id ) def main(): """Создание экземпляра объекта по умолчанию""" defaults = Defaults(parse_mode=ParseMode.HTML, tzinfo=pytz.timezone('Europe/Berlin')) application = ( Application.builder() .token("TOKEN") .defaults(defaults) .build() ) # Если сообщение не команда то отвечаем репликой (функция `echo()`) application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo)) # Запуск бота application.run_polling() if __name__ == '__main__': main()