Разбор параметров 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. Как они работают вместе?
-
Пользователь пишет боту:
/film фантастика
-
Telegram создаёт объект Update
с данными:
Update(
message=Message(text="/film фантастика", chat=Chat(id=123), ...),
...
)
-
Бот вызывает вашу функцию:
await film(update, context)
-
Вы обрабатываете запрос:
4. Зачем это нужно?
Без них бот не сможет понять, кто и что ему написал, и как реагировать.
5. Частые ошибки
-
Использование update
без await
:
# Неправильно!
update.message.reply_text("Привет") # Забыли await
# Правильно:
await update.message.reply_text("Привет")
-
Путаница между update
и context
:
-
Обращение к несуществующим данным:
# Ошибка, если нет аргументов!
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'] |
Как это работает?
-
Пользователь пишет:
/film фантастика 2020
-
Telegram разбивает сообщение на части:
-
Бот вызывает функцию film(update, context)
и передаёт:
-
Код извлекает данные:
-
Бот отвечает:
"Ищем фильм: жанр — фантастика, год — 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)