Telethon中utils.resolve_invite_link返回错误Chat/Channel ID如何解决
问题原因解析
你调用utils.resolve_invite_link返回的第二个字段不是频道的全局公开ID,属于Telegram的隐私设计和标识体系差异导致的正常现象,具体原因如下:
- Telegram聊天ID的基础规则
你从IDBot拿到的-1009876543210是频道的全局唯一完整ID:前缀-100是Telegram为所有频道/超级群组固定分配的类型标识,去掉前缀后的9876543210是频道的原始ID,网页端链接里展示的-9876543210是Web端的简化格式,省略了中间的100标识。 resolve_invite_link返回值的含义
该方法返回的三元组结构为(peer_type, invite_link_peer_id, access_hash),三个字段的含义分别为:- 第一个是聊天类型枚举值,不同第三方库的枚举定义略有差异,通常2对应频道类型
- 第二个是该私有邀请链接专属的关联ID,不是频道的全局ID:私有频道的邀请链接本身绑定独立的访问标识,Telegram出于隐私保护设计,不会通过未鉴权的邀请链接解析接口直接暴露频道的全局ID,避免邀请链接泄露后被无关人员恶意检索频道信息
- 第三个是私有频道的访问哈希,所有对私有频道的操作都需要配合ID和该哈希值才能正常执行
- 正确获取私有频道全局ID的方法
你需要先完成账号鉴权,再通过客户端接口拉取频道的完整实体信息才能拿到全局ID,以Telethon库为例,示例代码如下:
运行上述代码即可输出和IDBot验证结果一致的频道ID。from telethon import utils from telethon.sync import TelegramClient # 替换为你自己的api_id、api_hash,完成账号登录 client = TelegramClient('session_name', your_api_id, your_api_hash) with client: link = input("Please provide channel invite link: ") invite_peer = utils.resolve_invite_link(link) # 拉取频道完整实体,需要你的账号拥有该频道的访问权限 channel_entity = client.get_entity(invite_peer) # 拼接生成完整的频道ID full_channel_id = int(f"-100{channel_entity.id}") print(full_channel_id)
内容的提问来源于stack exchange,提问作者SnakeDoc65
相关产品推荐
相关产品推荐

