我编写了一个简单的 aiogram 聊天机器人代码,它可以将消息写入 mongodb 数据库:
@router.message(Command('memorize'), IsChat(['group', 'supergroup', 'chat', 'channel']), IsAdmin(admin_id))
async def memorize_handler(message: Message) -> None:
reply = message.reply_to_message
if not reply:
await message.answer("⚙ Can't find user")
return
text = reply.text
if reply.from_user.username:
username = reply.from_user.username
else:
username = reply.from_user.full_name
try:
user_id = reply.from_user.id
mention = reply.from_user.mention_html(reply.from_user.first_name)
memory_id = str(uuid.uuid4())
memorize(memory_id=memory_id, text=text, username=username, user_id=user_id)
await message.answer(f'💾 Succesfully saved message from {mention}')
except:
await message.answer(f'❗ Couldnt save message from {mention}')
在此过滤代码:
class IsChat(BaseFilter):
def __init__(self, chat_type: str | List[str]) -> None:
self.chat_type = chat_type
async def __call__(self, message: Message) -> bool:
if isinstance(self.chat_type, str):
return message.chat.type == self.chat_type
return message.chat.type in self.chat_type
问题是,当您从频道聊天中调用机器人时 - 他由于某种原因不处理更新。 然而,机器人仍然可以在私人聊天、群组和超级群组中工作。
我已经尝试使用“频道”和“聊天”扩展 IsChat 过滤器,但没有成功
我知道问题出在哪里了。 在每条消息上,我都有过滤器 IsAdmin 和 IsChat。
IsAdmin 代码:
class IsAdmin(BaseFilter):
def __init__(self, user_ids: int | List[int]) -> None:
self.user_ids = user_ids
async def __call__(self, message: Message) -> bool:
if isinstance(self.user_ids, int):
return message.from_user.id == self.user_ids
return message.from_user.id in self.user_ids
基本上,它会比较传递的管理员 ID 并检查它是否等于消息中的 ID。 我忘记了,我必须添加我的匿名用户 ID(实际上是频道聊天管理员的 ID)。
IsChat 在这种情况下需要“超级组”,因为频道聊天是超级组而不是常规组。 希望我对你有帮助。