Pyrogram机器人获取群组/频道最新消息ID及报错解决方案
问题原因
get_chat_history_count 底层封装的是Telegram原生接口messages.GetHistory,该接口不对Bot类型账号开放,仅支持普通用户身份(userbot模式)调用,因此使用Bot Token启动Pyrogram客户端时调用该方法必然返回400 BOT_METHOD_INVALID错误。
解决方案
- 方案1:通过最新消息ID实现快速统计(匹配你的初始需求,性能最优)
Telegram群组、频道的消息ID从1开始连续递增,你不需要调用专属用户端的计数接口,直接获取聊天的最新一条消息ID即可得到有效消息总数,完全符合你不统计已删除消息的要求。
实现代码:
该方法全程使用Bot账号有权限调用的接口,不会触发权限错误,响应速度极快。# 先做判空,避免无消息的聊天触发属性错误 chat = await client.get_chat(chat_id) if chat.last_message: total_messages = chat.last_message.id else: total_messages = 0 - 方案2:精确计数方案
如果需要完全排除已删除消息得到100%准确的计数值,可以自行维护计数逻辑:- 机器人加入群组/接入频道时,通过上述方案1拿到初始消息ID作为计数基数
- 注册新消息监听器,每收到一条有效新消息,对应聊天的计数值加1
- 注册消息删除监听器,每收到消息删除事件,对应聊天的计数值减去被删除的消息条数
该方案全程不调用受限接口,计数精度最高。
- 方案3:使用userbot模式调用原生计数接口
如果必须使用get_chat_history_count方法,需要将Pyrogram客户端的登录方式从Bot Token登录改为普通Telegram账号登录(使用手机号、API ID/API Hash鉴权),也就是userbot模式。注意普通用户账号受Telegram更严格的频率限制,违规操作存在账号被封禁的风险。
避坑提示
不要尝试循环调用
get_chat_history翻页遍历全量消息来计数,消息量较大的群组/频道用这种方式会快速触发Telegram接口频率限制,导致机器人被临时封禁接口权限,执行效率也极低。
内容的提问来源于stack exchange,提问作者EDM115
相关产品推荐
相关产品推荐

