Статья Автор: Деникина Н.В., Деникин А.В.

Параметры функции (update, context)

Разбор параметров update: Update, context: CallbackContext

Эти параметры — основа для обработки любых действий пользователя в Telegram-боте. 


1. update: Update

Объект Update содержит всю информацию о событии, которое произошло в чате с ботом:

  • Новое сообщение.

  • Нажатие кнопки.

  • Редактирование сообщения.

  • Добавление бота в группу и т.д.

Что внутри?

Атрибут Пример Когда используется
update.message Текст, фото, голосовое сообщение Когда пользователь что-то отправляет боту.
update.callback_query Данные от нажатой inline-кнопки Если бот использует кнопки под сообщениями.
update.edited_message Изменённое сообщение Если пользователь отредактировал сообщение.
Пример
async def echo(update: Update, context: CallbackContext):
    # Получить текст сообщения
    text = update.message.text  
    # Получить ID чата
    chat_id = update.message.chat.id  
    # Получить имя пользователя
    user_name = update.message.from_user.first_name

2. context: CallbackContext

Вспомогательный объект для:

  • Доступа к данным бота (например, списку чатов).

  • Хранения пользовательских данных между вызовами функций.

  • Работы с аргументами команд (например, /film Комедия).

Основные возможности

Метод/Атрибут Пример Для чего
context.args ['Комедия', '2020'] Аргументы команды (если /film Комедия 2020).
context.bot context.bot.send_message(...) Позволяет вызывать методы API Telegram.
context.user_data context.user_data['fav_genre'] = 'фантастика' Хранение данных пользователя между сообщениями.
context.chat_data context.chat_data['admins'] = [...] Хранение данных чата (для групп).
Пример
async def film(update: Update, context: CallbackContext):
    # Получить аргументы команды (/film комедия 2020 → ['комедия', '2020'])
    args = context.args  
    
    # Сохранить жанр в память бота для этого пользователя
    context.user_data['genre'] = args[0] if args else 'любой'
    
    # Отправить сообщение через context.bot
    await context.bot.send_message(
        chat_id=update.message.chat.id,
        text=f"Ищем фильм (жанр: {context.user_data['genre']})..."
    )

3. Как они работают вместе?

  1. Пользователь пишет боту:
    /film фантастика

  2. Telegram создаёт объект Update с данными:

    Update(
        message=Message(text="/film фантастика", chat=Chat(id=123), ...),
        ...
    )
  3. Бот вызывает вашу функцию:

    await film(update, context)
  4. Вы обрабатываете запрос:

    • Через update получаете текст и чат.

    • Через context достаёте аргументы (фантастика).


4. Зачем это нужно?

  • Update — для чтения данных от пользователя.

  • Context — для управления ботом и хранения временных данных.

Без них бот не сможет понять, кто и что ему написал, и как реагировать.


5. Частые ошибки

  1. Использование update без await:

    # Неправильно!
    update.message.reply_text("Привет")  # Забыли await
    
    # Правильно:
    await update.message.reply_text("Привет")
  2. Путаница между update и context:

    • update.message.chat.id — ID чата.

    • context.bot.send_message() — отправка сообщения.

  3. Обращение к несуществующим данным:

    # Ошибка, если нет аргументов!
    genre = context.args[0]  # IndexError, если команда без аргументов
    
    # Лучше так:
    genre = context.args[0] if context.args else 'любой'

6. Пример

async def film(update: Update, context: CallbackContext):
    # Проверяем, есть ли аргументы
    if not context.args:
        await update.message.reply_text(
            "Пример использования:\n"
            "/film фантастика\n"
            "/film комедия 2020"
        )
        return

    # Извлекаем жанр (первый аргумент)
    genre = context.args[0].lower()  # Переводим в нижний регистр

    # Извлекаем год (если есть)
    year = context.args[1] if len(context.args) > 1 else "любой"

    # Ищем фильмы в базе данных (пример)
    found_films = []
    for name, data in films_dict.items():
        if (genre in data["genre"].lower() and
                (year == "любой" or str(data["year"]) == year)):
            found_films.append(name)


    # Отправляем результат
    if found_films:
        await update.message.reply_text(
            f"Нашёл: {', '.join(found_films)}"
        )
    else:
        await update.message.reply_text("Ничего не найдено 😢")

Как аргументы команды попадают в context.args[0]

Когда пользователь отправляет боту команду с дополнительными параметрами, например:
/film фантастика 2020

Telegram разбивает эту строку на части, и они становятся доступны в context.args как список.


1. Разбор команды

Что ввёл пользователь Как это обрабатывается context.args
/film Команда без аргументов [] (пустой список)
/film фантастика Команда + 1 аргумент ['фантастика']
/film фантастика 2020 Команда + 2 аргумента ['фантастика', '2020']
 

Как это работает?

  1. Пользователь пишет:
    /film фантастика 2020

  2. Telegram разбивает сообщение на части:

    • Команда: /film

    • Аргументы: ['фантастика', '2020']

  3. Бот вызывает функцию film(update, context) и передаёт:

    • context.args = ['фантастика', '2020']

  4. Код извлекает данные:

    • genre = context.args[0] → 'фантастика'

    • year = context.args[1] → '2020'

  5. Бот отвечает:
    "Ищем фильм: жанр — фантастика, год — 2020"
     

3. Важные нюансы

1. Проверка на наличие аргументов

Всегда обрабатывайте случай, когда аргументов нет:

if not context.args:
    await update.message.reply_text("Укажите жанр: /film фантастика")
    return

2. Разделение аргументов пробелами

Аргументы разделяются только пробелами:

  • /film фантастика,2020 → ['фантастика,2020'] (один аргумент!).

  • /film "фантастика 2020" → ['фантастика 2020'] (кавычки сохраняют пробел).

3. Числа — это строки

Даже если пользователь ввёл число, в context.args оно будет строкой:

year = context.args[1]  # "2020" (str), а не 2020 (int)
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать