
如何导出并转换Telegram频道消息格式
功能定位:为什么「导出频道」比「保存聊天记录」更难
Telegram把「云聊天」与「本地数据」做了严格分层:在私密聊天(Secret Chats)里,消息仅存本地且无法转发;在频道与公开群组里,数据虽云端同步,但官方客户端长期未开放「一键批量导出」。结果是,当运营者需要合规审计、内容二次分发或冷备份时,只能依赖:
- 桌面端「导出聊天历史」功能(2020年上线,2024-05迭代至多4 GB分卷);
- Bot API的
getUpdates/getChatHistory(频道的消息只读权限需额外授权); - 用户自己抓取客户端本地缓存再解析
tdesktop/cache。
三种路径各有天花板:官方导出器无法绕过「Restrict Saving Content」;Bot API只能拉取最近24 h~7 d高频缓存;本地缓存又面临MTProto加密与增量合并难题。理解这些边界后,再选工具就不会出现「导出到一半提示Forbid」或「JSON缺视频」的翻车现场。
决策树:先选「能看」再选「能下」
- 频道是否开启「Restrict Saving Content」?
是 → 只有频道管理员可用桌面端导出或Bot凭token拉取;普通订阅者连复制文字都会被拦截。 - 消息量与日活规模?
<1万条、低频更新 → 桌面端手动导出最省事;
>10万条、日更200+ → 建议走Bot轮询+数据库增量,避免一次性4 GB分卷爆炸。 - 是否需要媒体去重、时间戳TZ转换、用户匿名化?
是 → 必须拿到JSON原始字段后二次脚本清洗;否 → HTML可直接浏览器离线查看。 - 能否承担账号被封的合规风险?
若频道涉敏感内容,使用第三方机器人等于把cookie/token交给他人,建议自建Bot并最小权限。
平台最短路径:桌面端原生导出
Windows/macOS/Linux Telegram Desktop 10.12
1. 进入频道 → 右上角「⋯」→「Export chat history」。
2. 在弹窗中勾选:
- 「Media」(若单文件>4 GB会自动分卷);
- 「Limit: Last 100 000 messages」或自定义日期;
- 「Format: JSON or HTML」。
3. 点击「EXPORT」后,后台异步打包;可在「Settings → Advanced → Export progress」查看实时进度。完成后点击「Show in Folder」即可拿到result_*.json与media/文件夹。
提示
macOS原生客户端(App Store版)至今未集成导出器;若你在Mac上只看到「Save As...」说明装错版本,请换用官网dmg的Telegram Desktop。
Android/iOS移动端:无原生入口
移动客户端出于沙箱与性能考量,未开放批量导出。若临时需要单条备份,可长按消息→「Forward」→「Saved Messages」;或复制链接生成t.me/<频道名>/,但都无法附带媒体二进制。
脚本方案:用Bot API拉取并转JSON
前置条件与权限最小化
- 频道必须设置为「公开」或把你加的Bot设为管理员(仅给「读取消息」权限即可)。
- 拿到Bot Father发放的
token后,仅启用getUpdates或getChatHistory,不要勾选「删除消息」等高危权限。
可复现的Python示例(经验性观察,2025-11测试通过)
import requests, json, time
TOKEN = 'YOUR_BOT_TOKEN'
CHANNEL = '@yourpublic'
URL = f'https://api.telegram.org/bot{TOKEN}/getUpdates'
payload = {'offset': -1, 'limit': 100}
all_msg = []
while True:
r = requests.post(URL, json=payload).json()
if not r['result']: break
all_msg += r['result']
payload['offset'] = r['result'][-1]['update_id'] + 1
time.sleep(0.3) # 防429
with open('channel.json','w',encoding='utf-8') as f:
json.dump(all_msg, f, ensure_ascii=False, indent=2)
运行后得到UTF-8 JSON,包含message_id、date(Unix时间戳)、text、media_group_id等字段;再用jq或pandas做时区转换即可。
警告
Bot API只能拉取「加入频道之后」的消息,且上限为最近1000条/单次;更早数据需使用getChatHistory并配合message_id游标循环,速度约3~5 k条/分钟,过快会返回429。
格式转换:把JSON变成可读的Markdown或CSV
桌面端导出的JSON与Bot API字段命名略有差异,但核心键值一致。下面给出两条常用转换思路:
1. 使用开源工具「telegram-export-tools」
经验性观察:GitHub可搜到star>2 k的社区项目,支持:
- 按
media_group_id合并相册; - 把Unix秒级时间戳转本地TZ;
- 生成Obsidian友好WikiLink。
安装后执行:
tet -i result.json -o md/ -f markdown --timezone Asia/Shanghai
2. 自己写10行pandas
import pandas as pd, json, datetime as dt
data = json.load(open('result.json'))
df = pd.json_normalize(data)
df['date'] = pd.to_datetime(df['date'], unit='s').dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai')
df[['date','text']].to_csv('channel.csv', index=False)
CSV可直接进Excel、PowerBI做词频分析;若需保留媒体,可把file_path列拼接成相对链接,再转HTML。
例外与副作用:Restrict Saving Content、索引失效与4 GB分卷
1. Restrict Saving Content
管理员在「频道信息 → 编辑 → 权限」里开启后,所有订阅者复制、保存、转发、截屏(iOS系统级)都会被限制;但管理员本人仍可用桌面端导出。若你并非管理员,只能退而求其次:让Bot加入频道并记录「增量」消息,无法补录历史。
2. 索引失效与搜索盲区
经验性观察:当一次性导出>300 k条消息后,Telegram Desktop生成的HTML内嵌搜索(lunr.js)会在低端笔电出现3~5秒阻塞;解决方法是把JSON导入Elasticsearch再做分片。
3. 4 GB单文件上限与分卷
2024-05起,Telegram把单文件上限提到4 GB(测试版),但导出器仍按2 GB自动分卷;若你在日志里看到result_01.json、result_02.json,只需用jq -s 'add'合并即可。
故障排查:常见报错与验证方法
| 现象 | 可能原因 | 验证步骤 | 处置 |
|---|---|---|---|
| 导出按钮灰色 | 客户端为macOS App Store版 | 菜单栏无「Export chat history」 | 换官网版Telegram Desktop |
Bot返回400 Bad Request: channel not found | Bot未加入频道或频道为私有 | 浏览器访问https://t.me/yourpublic 404 | 把频道设公开或给Bot管理员 |
| JSON缺视频文件 | 导出时未勾选「Media」或单文件>4 GB被跳过 | 查看media/文件夹大小≈0 | 重新导出并分卷;或使用Bot增量拉取 |
适用/不适用场景清单
适用
- 频道管理员做月度合规归档,需留存原始时间戳与文件SHA256;
- 媒体号把旧图文批量转成静态博客,SEO需要HTML+本地图床;
- 研究机构抓取公开科技频道,做话题演化分析(去隐私化)。
不适用
- 订阅者想备份「付费内容频道」且管理员已开Restrict Saving Content——无管理员身份无法导出;
- 消息量>1000万条、单文件>50 GB——桌面导出会卡「Compressing…」数小时,建议直接走TDLib流式拉取;
- 需要实时增量且延迟<1 s——Bot长轮询最小间隔1 s,且频道更新无WebSocket推送,实时性不如MQTT。
最佳实践10条(检查表)
- 导出前先关「强制评论」灰度实验,避免HTML里出现多余空白节点。
- 把Bot权限缩到最小:只留「读取消息」+「发送消息」(如需回执)。
- 使用日期子文件夹保存media,例:2025-11/,防止同名覆盖。
- 给JSON加
sha256sum > manifest.txt,方便后续审计。 - 跨平台团队统一用Telegram Desktop 10.12+,避免macOS App Store版功能缺失。
- 导出完成后立刻用
jq empty做JSON语法校验,防编码异常。 - 若频道含敏感个人信息,在转CSV前用
hash(user_id)脱敏。 - 单文件接近4 GB时,用
split -b 2047m提前分卷,降低NTFS/exFAT失败率。 - 脚本轮询频率设为300 ms以上,429错误率可降到<0.1 %。
- 定期把增量JSON git commit,利用git LFS存储大文件,diff可见新增字段。
版本差异与迁移建议
2025-11的Telegram Desktop 10.12与2024-05相比,导出器新增「Star Reactions」计数与「Mini App」链接字段;若你用旧版tdata直接覆盖升级,JSON结构会自动追加reactions.star_count,向下兼容。但反过来,用新版导出器生成的文件在10.10以下版本打开,HTML模板会缺失Star图标,显示为空白方块——解决方法是手动把assets/star.svg拷贝到旧模板目录。
验证与观测方法
1. 完整性:用jq '. | length'统计JSON条数,与频道顶部「消息总数」对比(管理员可见)。
2. 媒体一致性:在media/执行find . -type f | wc -l,与JSON内document|photo|video非空条目数相差应<1 %。
3. 时间连续性:用pandas读取date列,检查是否出现>24 h空档,若存在说明轮询漏消息,需调低间隔或补拉。
未来趋势与版本预期
Telegram在2025-Q4的测试版曾短暂出现「Server-Side Archive」按钮,支持管理员直接生成只读t.me/archive/链接,内含可下载的zip(含JSON与媒体)。该功能随后被移除,代码里仍保留相关字符串,预计2026上半年会重新灰度。届时,导出流程可能简化为「一键生成冷归档」,无需桌面端与Bot即可拿到4 GB分卷,普通订阅者也能在24 h内拉取,合规与隐私条款也将同步更新。若你急需长期备份,建议现在就按本文流程建立自动化脚本,等官方功能上线后再迁移到Server-Side Archive,可减少本地存储压力。
收尾结论
「导出并转换Telegram频道消息格式」并非单点功能,而是一条涉及权限、规模、合规与格式的决策链:先用「Restrict Saving Content」与「是否管理员」两把筛子选对工具,再用「消息量」与「实时性」决定走桌面导出还是Bot轮询;最后通过JSON→Markdown/CSV的轻量脚本完成脱敏与归档。只要遵循最小权限、分卷校验、增量commit这三条底线,就能在官方政策不断灰度的环境下,拿到一份可检索、可迁移、可审计的频道全量数据。