MTProto Telegram API 用户B发消息返回PEER_ID_INVALID但用户A正常
错误核心原因
PEER_ID_INVALID 错误90%以上的场景都是因为使用了非当前登录账号对应的peer access_hash。
Telegram 出于隐私保护设计,任意用户、群组、频道的 access_hash 都是和查询账号绑定的,用户A账号获取到的用户X的access_hash仅对A的会话有效,直接复用给用户B账号必然会触发错误,这也是你当前遇到的最可能的诱因。
其余可能的触发原因包括:
- 用户X设置了隐私限制,仅允许联系人发送消息,且用户B既不是X的好友,也没有和X在共同的群组/频道中
- 你填写的用户X的
user_id本身错误,不是Telegram分配的全局用户ID - 用户X的账号已经被官方封禁、主动注销
- 你读取的是过期缓存的
access_hash,用户X修改账号相关设置后旧哈希已经失效
解决思路
- 先为用户B账号单独拉取用户X的有效
access_hash,可选的拉取方式:- 如果B和X是好友,调用
contacts.getContacts接口拉取完整联系人列表,提取X对应的access_hash - 如果知道X的公开用户名,调用
contacts.resolveUsername接口,传入用户名直接获取B会话下X对应的inputPeerUser结构,里面包含正确的user_id和access_hash - 如果B和X在同一个群组/频道,调用
channels.getParticipants(超级群/频道)或messages.getChats(普通群)拉取群成员列表,提取X的对应哈希
- 如果B和X是好友,调用
- 校验发送权限:先用官方客户端登录用户B账号,尝试直接给X发消息,如果官方客户端也无法发送,说明是X的隐私设置限制,需要先让B发送好友申请并通过,或者加入同一个共同群后再尝试发送
- 校验参数正确性:确认你使用的
user_id是Telegram分配的全局数字ID,不是短ID、用户名或者其他场景下的临时ID - 修复
random_id生成逻辑:你当前代码里的random_id生成规则不严谨,Telegram要求random_id是全局唯一的64位整数,仅用用户ID加随机数容易出现重复,可能会导致消息发送失败或者重复发送,建议用完全随机的64位整数生成规则
内容的提问来源于stack exchange,提问作者jo-chris
相关产品推荐
相关产品推荐

