Как можно получить ID сообщения и использовать его в другом обработчике?

Как можно узнать ID сообщения, отправленного в хендлере с командой 'check_creator', начиная с await message.reply(...), чтобы ответить на это же сообщение в нижележащем хендлере 'sub_check', после выполнения его условий?
  • 28 сентября 2024 г. 8:23
Ответы на вопрос 1
Чтобы получить ID сообщения, отправленного в хендлере с командой `check_creator`, и затем использовать его в другом обработчике, вы можете сохранить ID сообщения в каком-либо виде. Например, можно использовать атрибут объекта сообщения или хранилище данных, чтобы передать его между обработчиками.

Пример реализации такого подхода:

```python
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.utils import executor

# Создание бота и хранилища
bot = Bot(token='YOUR_BOT_TOKEN')
dp = Dispatcher(bot, storage=MemoryStorage())

# Определение состояния FSM (если требуется)
class Form(StatesGroup):
    waiting_for_sub_check = State()

@dp.message_handler(commands=['check_creator'])
async def check_creator(message: types.Message):
    # Отправляем сообщение и сохраняем его ID
    reply_message = await message.reply("Пожалуйста, проверьте подписки.")
    # Сохраняем ID сообщения в контексте
    await Form.waiting_for_sub_check.set()
    await dp.current_state(user=message.from_user.id).update_data(reply_message_id=reply_message.message_id)

@dp.message_handler(state=Form.waiting_for_sub_check)
async def sub_check(message: types.Message, state: FSMContext):
    # Получаем данные из состояния
    data = await state.get_data()
    reply_message_id = data.get('reply_message_id')

    # Выполните необходимые действия здесь
    if some_condition:  # Замените на вашу логику
        # Ответим на сообщение с ID reply_message_id
        await message.reply("Условия выполнены!")
        await bot.edit_message_text("Условия выполнены!", chat_id=message.chat.id, message_id=reply_message_id)

    # Сбрасываем состояние
    await state.finish()

if __name__ == '__main__':
    executor.start_polling(dp)
```

В этом примере:

1. Когда обрабатывается команда `/check_creator`, бот отправляет сообщение и сохраняет его ID в состоянии FSM.
2. В обработчике `sub_check` получаем ID предыдущего сообщения из состояния и используем его для редактирования или отправки сообщения.

Обратите внимание, что вам необходимо включить расширение для работы с состояниями (FSM) и настроить его в вашем боте.
Похожие вопросы