Telegram 的 Telethon session 是一把钥匙,不是一个应用
Telegram 的 telethon session 是一把授权密钥(通常是一个 .session SQLite 文件,或一个 StringSession 字符串),而不是一个 Telegram 应用窗口,也就是大家常说的 telegram协议号。它让你的 Python 客户端以用户身份使用 MTProto。如果你双击这个文件,期待看到聊天列表,那你买错格式了。如果你需要 get_me() 返回一个用户对象,那它就是你要的商品。
本指南写给已经在用(或准备使用)Telethon 的开发者和运营者:想从我们的自有库存获得 Session 交付,并需要清晰的测活方法和替换流程。目录在 Telegram 账号。关于“即用号、新号、老号”这些更宽泛的说法,请阅读即用型 Telegram 账号。
要点速览
- Telethon session 是一个授权密钥文件或 StringSession,不是桌面应用窗口。
- 在 Telegram 账号选择 Session (Telethon);同一批库存,不同的交付方式。
- 测活:用你自己的
api_id/api_hash连接,然后调用get_me()。- 测试通过后修改 2FA;把密钥的每一份额外副本都当作漏洞。
- 失效密钥(
AuthKeyUnregistered、手机号不符)走替换流程,而不是去改 SQLite。
telethon session 到底是什么?
Telethon session 是你的 Python 客户端以用户身份使用 MTProto 时所用的授权密钥。当你构造类似 TelegramClient('anon') 的对象并完成登录时,Telethon 会创建它。从那以后,这个文件就是登录本身。
一个典型的 .session 文件里装的是枯燥但关键的东西:要连接哪个数据中心、用于加密流量以让 Telegram 把该进程视为这个用户的授权密钥,以及客户端见过的实体缓存。缓存会让文件比“一把小钥匙”更大,但不会让它变成可读的聊天导出。不要打开 SQLite 去找消息。测活的方式是连接。
StringSession 是同一把密钥的文本编码。在会丢弃文件系统的机器上很方便,也更容易泄露。任何拿到这串字符的人都能以该用户身份登录。把字符串放在密钥管理里,不要放进代码仓库。一次有效登录在导出时可能变成两把密钥,数清楚你有几份副本。
bot token 是第三种东西:用于 Bot API 的 HTTP 密钥。它不是用户会话。如果你的测试需要一个用户去按 Start,你要的是用户 session;如果你的测试需要 bot 来回复,你要的是 token。
如何在 TgFather 购买 Session / Telethon 交付(协议号购买)?
在 TgFather 上,你在与 TData 相同的自有账号目录中选择 Session (Telethon) 交付。打开 Telegram 账号,选择 Session,再选国家和账号年龄段。钱包扣款后即时交付,下载链接经过签名且会过期。
你买的是一种交付格式,而不是另一种账号。因为你的代码是 Telethon,所以选 Session。如果有人要坐在 Telegram Desktop 前,就选 TData。如果你想在自己掌控的客户端里输入验证码,就选实时登录码。“听起来更专业”的错误格式,对你的工位来说依然是错的。
如果交付的 session 调用 get_me() 失败,那是替换的情况,而不是讨论 SQLite 结构的时候。在把生产任务建立在这把密钥上之前,先自己跑一遍测试。
应该先选 Session,再选国家吗?
是的:先把交付格式写下来,再选国家和年龄段。打开 Telegram 账号,选择 Session (Telethon),选好国家和年龄段,预留一个当天就能测试的名额。
应该跑什么样的测活?
在信任这个文件之前,用你自己的 api_id 和 api_hash 真实连接一次并调用 get_me()。不要因为扩展名是 .session 就信任文件,也不要因为字符串很长就信任它。
你需要看到:
- 连接成功。
- 返回一个用户对象。
- 用户 ID 和手机号与你以为买到的账号一致。
展示用的用户名可能会变,ID 不会。用户名对不上是售后咨询问题;手机号对不上,那就是另一个人。
失败情形:
- 无法连接:不是有效的 session。
- 能连接,但要求一个你没拿到的云密码:缺了第二把锁。
AuthKeyUnregistered:文件里的密钥已不再注册。这是纪念品。申请替换;不要手动编辑 SQLite。
get_me() 证明这把密钥还能说话,但它不证明什么“老号生活方式”。测试通过后,设置或修改两步验证。云密码锁住的是新的登录,它不会把已经流出去的 session 文件吸回来。如果 session 附带了云密码,就修改它。不要复用你私人 Telegram 的密码。
Telethon vs StringSession vs TData vs bot token
Telethon session 文件和 StringSession 都是用户密钥;TData 属于桌面端;bot token 属于 Bot API。付款之前,让格式对上你的工位。
Telethon .session |
StringSession | TData | Bot token | |
|---|---|---|---|---|
| 它是什么 | 含授权密钥 + 缓存的 SQLite 文件 | 同一把密钥的文本形式 | Telegram Desktop 工作目录 | bot 的 HTTP 密钥 |
| 用什么打开 | Telethon | Telethon | Telegram Desktop | Bot API / 任何 HTTP 客户端 |
| 看起来像应用吗? | 不像 | 不像 | 像,在桌面端 | 不像 |
| 测活 | 连接 + get_me() |
连接 + get_me() |
设置里显示号码 | 在 Bot API 上调用 getMe |
| 当作 | 一个密码 | 一个很容易被粘贴的密码 | 装在文件夹里的密码 | 一个密码 |
Telethon 和 Pyrogram 都说 MTProto,也都会写“session”。但它们的文件不能互换。不要把 Telethon 的 .session 喂给 Pyrogram 客户端,也不要把 Pyrogram 字符串粘进 StringSession。如果你的项目用 Pyrogram,就购买或生成 Pyrogram session。只写“session”却不注明是哪个库的电报协议号商品页,只会浪费你一个下午。
如何安全地存放和使用密钥?
像对待密码一样存放 session 文件或字符串:不粘贴、不提交、不随手复制。任何拥有这把密钥的人,都能在他运行客户端的任何地方以该用户身份登录。
实用规则:
- 不要“只是为了测一下”就贴到群里。
- 不要提交到代码库。
- 两台机器两份副本,就是两把钥匙。
- 如果你在 Telegram 设备列表里撤销错了那一行,下一次
get_me()会以AuthKeyUnregistered失败。 - 第一次
get_me()成功之后,就别再折腾了。把文件放到进程能读到的地方。把每一份额外副本都当作漏洞。
正当的用法包括:需要真实用户与 bot 对话的测试框架、按用户要求拉取某个聊天的客服脚本、Mini App 的预发布收件箱。一张收据并不能为未经请求的群发消息买来豁免。
需要的是给人用的桌面席位?在即用型 Telegram 账号里比较各种格式。需要的是 bot 用户名而不是用户密钥?请看Telegram 老机器人。
去哪里买,替换包括什么?
在 TgFather 账号目录购买 Session 交付;替换覆盖的是失效密钥,而不是密钥保管上的失误。从 Telegram 账号开始:选择 Session (Telethon)、国家和年龄段。用钱包付款,从签名链接下载,运行 get_me(),修改云密码。只有在密钥证明有效之后再开始搭建。
失效的密钥(AuthKeyUnregistered、手机号不符、承诺的 2FA 没给)走的是自有库存的替换流程,而不是一句“session 就是这样”。保管好你自己的 api_id / api_hash 和你自己的密钥存储。目录负责交付格式,交付之后的卫生由你的流程负责。
telegram session 就是那把授权密钥。Telethon 是向 Telegram 发起请求的 Python 库。即便你搜索的是 Telethon 交付,你买到的依然是一个文件(或字符串),而不是一个应用窗口。
准备好了:购买带 Session 交付的 Telegram 账号。
常见问题
能把 Telethon .session 转换成 Pyrogram session 字符串吗?
没有受支持的方法能把 Telethon session 文件转换成 Pyrogram session 字符串。如果你的代码用 Pyrogram,请直接获取 Pyrogram session。
如果我在设置里撤销其他会话,我的 .session 会失效吗?
只有当你撤销的正是设置里那一行会话时它才会失效。设备列表就是一份密钥列表;点错一行,下一次 get_me() 就会失败。
AuthKeyUnregistered 是什么意思?
AuthKeyUnregistered 表示你文件里的授权密钥已不再注册。替换它,不要手动编辑 SQLite。
文件大约 40KB,我是不是拿到了聊天记录?
大概率不是:Telethon 会缓存实体,所以较大的文件依然只是库的元数据。它不是一个可以手动打开浏览的聊天存档。
同一个 session 能放在两台服务器上吗?
你可以复制文件,但两个进程会共享同一把密钥。如果你需要两个互不干扰的地方,最好分别进行两次有意的登录。
在 TgFather 上,Session 和 TData 是不同的库存吗?
不是:Session 和 TData 是同一批账号,只是交付格式不同。用 Telethon 就在结账时选 Session;用桌面端就选 TData。