You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:53:11