如何使用aiogram 3.4.1机器人查询Telegram群组用户权限
在aiogram 3.4.1中查询Telegram群组用户权限的方法
要查询Telegram群组内用户的权限,核心是利用aiogram提供的ChatMember对象——它包含了用户在群组中的状态和具体权限配置。注意:机器人必须是群组的成员(最好是管理员),否则无法获取成员权限信息。
一、查询当前消息发送者的权限
通过当前消息的上下文,直接获取发送者的ChatMember信息,然后解析其状态和权限:
from aiogram import Router, types from aiogram.filters import Command router = Router() @router.message(Command("my_perm")) async def check_my_permission(message: types.Message): # 获取当前发送者在群组中的成员信息 chat_member = await message.chat.get_member(message.from_user.id) # 判断用户状态 if chat_member.status == "creator": await message.answer("你是这个群组的创建者,拥有所有权限") elif chat_member.status == "administrator": # 管理员的具体权限示例 perm_details = [ "删除消息" if chat_member.can_delete_messages else "", "管理群组" if chat_member.can_manage_chat else "", "邀请新成员" if chat_member.can_invite_users else "" ] # 过滤空字符串 perm_details = [p for p in perm_details if p] await message.answer(f"你是群组管理员,拥有权限:\n" + "\n".join(perm_details)) elif chat_member.status == "member": # 普通成员的权限示例 perm_details = [ "发送文本消息" if chat_member.can_send_messages else "", "发送媒体内容" if chat_member.can_send_media_messages else "", "发起投票" if chat_member.can_send_polls else "" ] perm_details = [p for p in perm_details if p] await message.answer(f"你是普通成员,拥有权限:\n" + "\n".join(perm_details)) elif chat_member.status == "restricted": await message.answer(f"你是受限成员,当前可发送消息:{chat_member.can_send_messages}") else: await message.answer("你不是这个群组的成员")
二、查询指定用户的权限
如果需要查询特定用户(通过ID或@用户名)的权限,可以按以下方式实现:
@router.message(Command("check_user")) async def check_specific_user(message: types.Message): # 检查是否传入了目标用户标识 if len(message.text.split()) < 2: await message.answer("请指定用户ID或@用户名,格式:/check_user @username 或 /check_user 123456789") return target = message.text.split()[1] try: # 处理用户ID if target.isdigit(): user_id = int(target) chat_member = await message.chat.get_member(user_id) # 处理@用户名 else: username = target.lstrip("@") user = await message.bot.get_user(username) if not user: await message.answer("未找到该用户") return chat_member = await message.chat.get_member(user.id) # 整理权限信息 result = [f"用户:{chat_member.user.full_name} (@{chat_member.user.username})"] result.append(f"状态:{chat_member.status}") if chat_member.status in ["creator", "administrator"]: admin_perms = [ "删除消息" if chat_member.can_delete_messages else "", "禁言成员" if chat_member.can_restrict_members else "", "置顶消息" if chat_member.can_pin_messages else "" ] admin_perms = [p for p in admin_perms if p] result.append("权限:" + "\n".join(admin_perms)) elif chat_member.status == "member": member_perms = [ "发送消息" if chat_member.can_send_messages else "", "发送贴纸/表情" if chat_member.can_send_other_messages else "" ] member_perms = [p for p in member_perms if p] result.append("权限:" + "\n".join(member_perms)) await message.answer("\n".join(result)) except Exception as e: await message.answer(f"查询失败:{str(e)}")
关键说明
ChatMember的不同状态对应不同的类:ChatMemberCreator:群组创建者,拥有全部权限ChatMemberAdministrator:管理员,包含can_delete_messages、can_manage_chat等专属权限属性ChatMemberMember:普通成员,权限属性以can_send_*为主ChatMemberRestricted:受限成员,需查看is_member和具体的受限权限
- 机器人权限限制:如果机器人不是群组管理员,可能无法获取部分敏感权限信息,甚至调用
get_member方法会报错 - 异常处理:务必捕获调用过程中的异常(比如用户不在群组、机器人权限不足等情况)
内容的提问来源于stack exchange,提问作者Olimpiia_ ART
相关产品推荐
相关产品推荐

