Сообщить об ошибке.

Добавление настроек по умолчанию для Telegram бота

Начиная с версии 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. Защищает содержимое отправленного сообщения от пересылки и сохранения.

Пример установки значений по умолчанию для Telegram бота:

В примере устанавливается значение 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()