Telegram Bot API:调用getChatMember对有效用户抛出USER_ID_INVALID错误
解决Telegram Bot调用getChatMember时USER_ID_INVALID的坑
咱们先唠唠为啥明明是活跃用户,调用getChatMember却报USER_ID_INVALID——其实这大多和Telegram的隐私规则还有Bot权限有关,不是你代码写错了:
常见原因
- 用户隐私锁死了:很多用户会开启严格的隐私设置,禁止非联系人的Bot获取自己的信息。哪怕用户之前在你的超级群里,一旦离开,Bot就失去了访问权限,自然查不到。
- 你传的ID格式不对:别把用户名(@xxx)当成用户ID传啊!必须用纯数字的用户ID,要是传了其他格式,API肯定给你报错。
- Bot没权限碰这个用户:Telegram对Bot的权限管得很严,Bot只能查两种用户的信息:要么是Bot所在群组/频道里的成员,要么是已经和Bot私聊过的用户。用户离开群后又没和Bot聊过?那Bot根本没资格查人家状态。
靠谱的解决办法
- 提前存状态,靠事件推送:这是最稳的方式!用户进群的时候,你记录好ID;等Telegram主动推
chat_member事件(用户离开/被踢的时候会触发),直接把状态改成Left/Kicked就行,完全不用事后调用getChatMember。 - 先试探能不能互动:如果非得查,可以先给用户发一条轻量的消息(比如“你已离开XX群,如有疑问可联系我”),要是消息发成功了,说明Bot能访问用户信息,再去调用getChatMember。不过这种方式可能打扰用户,得谨慎用。
- 先校验ID格式:调用API前先检查下用户ID是不是纯数字,用个简单的正则
^[0-9]+$就能搞定,避免低级错误。
官方文档早就明确说明
Telegram官方文档提到:如果目标用户不在指定聊天里,而且Bot没有该用户的联系人权限,调用
getChatMember就会返回USER_ID_INVALID错误。这是隐私机制限制,不是Bug哦。
所以核心思路就是别等用户走了再去查,而是在用户状态变化的时候直接记录,既符合平台规则,效率也更高。
内容的提问来源于stack exchange,提问作者Axel Magagnini
相关产品推荐
相关产品推荐

