Как сделать так, чтобы кнопка 'подписался' проверяла на все ли каналы подписан юзер и после этого пускала его к возможностям бота?

Это кнопки :

sub_channel = InlineKeyboardMarkup(
    inline_keyboard =[
        [
            types.InlineKeyboardButton(text="1", url=""),
            types.InlineKeyboardButton(text="2", url=""),
            types.InlineKeyboardButton(text="3", url=""),
            types.InlineKeyboardButton(text="Подписался", callback_data="check")
          
        ],
    ]
)

Это проверка на подписку :


class CheckSubscription(BaseMiddleware):
    async def __call__(self, handler, event, data) -> Any:
        channels = ["", "", ""]
        user_id = event.from_user.id

        for channel in channels:
            chat_member = await event.bot.get_chat_member(channel, user_id)
            if chat_member.status == 'left':
                await event.answer(
                    'Подпишись на все каналы, чтобы пользоваться ботом!',
                    reply_markup=sub_channel
                )введите сюда код
                return

        # Если пользователь подписан на все каналы
        return await handler(event, data)

Ответы (1 шт):

Автор решения: Samikague

Вам нужно сделать else анти-условие.

if chat_member.status == 'left':
            await event.answer(
                'Подпишись на все каналы, чтобы пользоваться ботом!',
                reply_markup=sub_channel
            )введите сюда код
            return
else:
    return await handler(event, data)

Теперь хендлер будет возвращаться только если пользователь выполнил подписку. Сам сталкивался с такой проблемой.

→ Ссылка