Не работает кнопка проверки подписки в телегармм боте

from typing import Any
from aiogram.filters import BaseFilter
from aiogram import types, Bot

from config import CHANNEL_ID
from database.db import DataBase


class ChatJoinFilter(BaseFilter):

    async def __call__(self, message: types.Message, bot: Bot) -> Any:
        chat_member = await bot.get_chat_member(chat_id=CHANNEL_ID,
                                                user_id=message.from_user.id)

        if (chat_member.status.value == "member" or
                chat_member.status.value == "creator"):

            return True

        return False


class RegisteredFilter(BaseFilter):

    async def __call__(self, callback: types.CallbackQuery) -> Any:
        return not await DataBase.get_user(callback.from_user.id) is None

Выдает ошибку, подскажите где в скрипте косяк?

    check = await event_filter.call(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/dist-packages/aiogram/dispatcher/event/handler.py", line 43, in call
    return await wrapped()
           ^^^^^^^^^^^^^^^
  File "/root/bot/other/filters.py", line 15, in __call__
    if (chat_member.status.value == "member" or chat_member.status.value == "creator"):
        ^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'value'

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

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

Если открыть документацию, то можно прочитать что bot.get_chat_member возвращает объект ChatMember:

This object contains information about one member of a chat. Currently, the following 6 types of chat members are supported:

  • ChatMemberOwner.status -> "creator"
  • ChatMemberAdministrator.status -> "administrator"
  • ChatMemberMember.status -> "member"
  • ChatMemberRestricted.status -> "restricted"
  • ChatMemberLeft.status -> "left"
  • ChatMemberBanned.status -> "kicked"

У каждого из этих объектов есть атрибут status, который возвращает строку, и у этой строки нет атрибута value о чем собственно и говорится в ошибке:

AttributeError: 'str' object has no attribute 'value'

Исправляем:

async def __call__(self, message: types.Message, bot: Bot) -> Any:
    chat_member = await bot.get_chat_member(chat_id=CHANNEL_ID, user_id=message.from_user.id)                         

    if chat_member.status in ["member", "creator"]:
        return True

    return False
→ Ссылка