@Br12

Aiogram 3, FSMContext/State: почему бот отвечает из всех фото только на последнее?

from aiogram import Bot, Dispatcher, html, F, flags, BaseMiddleware, Router
from aiogram.fsm.state import StatesGroup, State
from aiogram.enums import ParseMode, ChatAction
from aiogram.filters import CommandStart, Command
from aiogram.fsm.context import FSMContext
from aiogram.types import Message, CallbackQuery, FSInputFile, TelegramObject, File, Sticker, Document
from aiogram.utils.chat_action import ChatActionMiddleware
from aiogram.utils.keyboard import InlineKeyboardBuilder, InlineKeyboardButton, InlineKeyboardMarkup

from asyncio import Lock, sleep

class TextState(StatesGroup):
    answer = State()
    message_id = State()

@router.message(F.photo)
async def photo_handle(message: Message, state: FSMContext):
    await hadnle_text(message, state)

async def hadnle_text(message: Message, state: FSMContext):
    await state.set_state(TextState.answer)
    await state.update_data(
        message_id=message
    )
    builder = InlineKeyboardBuilder()
    builder.add(InlineKeyboardButton(
        text="Answer 1",
        callback_data="Answer 1"),
    InlineKeyboardButton(
        text="Answer 2",
        callback_data="Answer 2"),
    )
    await message.answer(
        f"<b>Выберите кнопку</b>",
        reply_markup=builder.as_markup()
    )

@router.callback_query(TextState.answer)
async def text_state_callback(callback: CallbackQuery, state: FSMContext):
    await state.update_data(answer=callback.data)
    data = await state.get_data()
    await data["message_id"].reply(data["answer"])
    # await state.clear()


Бот присылает сообщение hadnle_text (два раза, если два фото и тд) с двумя кнопками, и в зависимости от выбора должен отвечать фото в присланном юзером сообщении. При выборе кнопки в первом сообщении, я хочу, чтобы оно отвечало на первое фото, кнопка из второго сообщения на второе и так далее.
Проблема: бот только отвечает на последнее фото при выборе кнопки из любого сообщения. Как решить эту проблему?
  • Вопрос задан
  • 29 просмотров
Пригласить эксперта
Ответы на вопрос 1
Следует почитать на счет того как работает медиагруппа в ТГ, 5 фото в одном сообщении = 5 апдейтов.

Я бы ушел от FSM в сторону Callback Data Factory

# ...
from aiogram.filters.callback_data import CallbackData


class AnswerCallback(CallbackData, prefix='answer'):
    message_id: int
    answer_type: str


@router.message(F.photo)
async def photo_handle(message: Message):
    await hadnle_text(message)

async def hadnle_text(message: Message):
    builder = InlineKeyboardBuilder()
    builder.add(InlineKeyboardButton(
        text="Answer 1",
        callback_data=AnswerCallback(message_id=message.message_id, answer_type='Answer 1').pack()),
    InlineKeyboardButton(
        text="Answer 2",
        callback_data=AnswerCallback(message_id=message.message_id, answer_type='Answer 2').pack()),
    )
    # Или так
    # builder.button(text="Answer 1", callback_data=AnswerCallback(message_id=message.message_id, answer_type='answer 1'))
    # builder.button(text="Answer 2", callback_data=AnswerCallback(message_id=message.message_id, answer_type='answer 2'))
    await message.answer(
        f"<b>Выберите кнопку</b>",
        reply_markup=builder.as_markup()
    )

@router.callback_query(AnswerCallback.filter())
async def text_state_callback(callback: CallbackQuery, callback_data: AnswerCallback):
    await bot.send_message(
        chat_id=callback.message.chat.id,
        text=callback_data.answer_type,
        reply_to_message_id=callback_data.message_id,
    )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы