如何用Pyrogram检查用户是否具备聊天消息发送权限?
在Pyrogram发送消息前检查发送权限的可行方案
直接用Chat.is_restricted或者ChatMember.restricted_by确实不好使——前者是针对聊天本身的全局限制,后者返回值经常不稳定。要准确判断自己在目标群组的发送权限,得从获取自身的ChatMember详情入手,再配合慢模式的异常处理逻辑。
1. 检查账号是否被封禁/限制发送
调用get_chat_member获取当前账号在目标聊天的成员信息,重点看这几个字段:
- ChatMember.status:如果是
"kicked"或"banned",直接判定发不了消息。 - ChatMember.restricted + permissions.can_send_messages:如果
restricted为True,且can_send_messages是False,说明你被限制了发消息权限。
示例代码:
from pyrogram import Client from pyrogram.enums import ChatMemberStatus async def can_send_message(client: Client, chat_id: int | str) -> bool: try: member = await client.get_chat_member(chat_id, "me") # 被踢/封禁直接返回False if member.status in (ChatMemberStatus.KICKED, ChatMemberStatus.BANNED): return False # 检查是否被限制发送消息 if member.restricted and not member.permissions.can_send_messages: return False return True except Exception: # 遇到聊天不存在、无权限查成员等情况,默认返回不能发 return False
2. 处理慢模式(420 SLOWMODE_WAIT_X)
Telegram官方API没提供提前查询慢模式剩余时间的接口,所以没法提前检查,只能捕获异常后处理:
- 捕获
SlowmodeWait异常,拿到等待时长后暂停对应时间再重试。 - 别无限重试,避免触发更严重的封禁。
示例代码:
import asyncio from pyrogram.errors import SlowmodeWait async def send_safe_message(client: Client, chat_id: int | str, text: str): try: await client.send_message(chat_id, text) except SlowmodeWait as e: await asyncio.sleep(e.x) await send_safe_message(client, chat_id, text) except Exception as e: print(f"发送失败: {str(e)}")
3. 补充提醒
- 部分群组会给新成员设临时禁言,
permissions.can_send_messages能准确反映这种状态,比restricted_by靠谱多了。 - 如果是隐私群组,调用
get_chat_member可能失败,这时候直接尝试发送消息并捕获异常就行——毕竟提前检查本身就做不到。
内容的提问来源于stack exchange,提问作者Unthought
相关产品推荐
相关产品推荐

