Не работает кнопка проверки подписки в телегармм боте
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