关于 dump-channel
用于将 Telegram 频道、群组或聊天记录归档为 NDJSON,并可下载媒体文件,适合需要可查询消息记录和本地媒体的用户。
主要功能
- 01按时间顺序导出 NDJSON 消息
- 02下载照片、视频和文档
- 03使用参数跳过媒体下载
- 04通过跳过已有文件续传
适用场景
- 01归档频道以供后续分析
- 02查询消息文本和元数据
- 03继续中断的媒体下载
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ terrylica/ cc-skills --skill dump-channel安装后在 Claude Code 中输入/dump-channel确认已加载。
详细介绍
转储 Telegram 频道历史记录
将完整的 Telegram 频道/群组/聊天记录归档为 NDJSON 和下载的媒体文件。
自我演进的技能:此技能会在使用过程中持续改进。如果说明有误、参数发生变化,或需要采用变通方案,请立即修复此文件,不要拖延。仅针对真实且可复现的问题进行更新。
执行前检查
- 会话必须存在:
~/.local/share/gramjs/<profile>.session- 如果不存在,请先运行
/tlg:setup
- 如果不存在,请先运行
- 用户必须已订阅目标频道,或已加入目标群组/聊天
用法
/usr/bin/env bash << 'EOF'
ROOT="$(cc-plugin-root tlg)"
SCRIPT="$ROOT/scripts/tg-cli.ts"
# Full dump: NDJSON + all media (photos, videos, documents)
bun "$SCRIPT" dump @ChannelName ./output/ChannelName
# NDJSON only (skip media downloads — much faster)
bun "$SCRIPT" dump @ChannelName ./output/ChannelName --no-media
# Dump by numeric chat ID
bun "$SCRIPT" dump -1001234567890 ./output/MyChannel
# Use a different profile
bun "$SCRIPT" -p personal dump @ChannelName ./output/ChannelName
EOF
参数
| 参数 | 类型 | 说明 |
|---|---|---|
| chat | string/int | 频道用户名(@name)或数字聊天 ID |
| output | path | 输出目录(将在其中创建 messages.ndjson + media/) |
--no-media | flag | 跳过媒体下载,仅生成 NDJSON |
输出结构
output/ChannelName/
├── messages.ndjson ← one JSON object per line, chronological (oldest first)
└── media/
├── 6.jpg ← named by message ID for cross-referencing
├── 12.png
├── 45.mp4
└── ...
NDJSON 记录架构
每行都是一个包含以下字段的 JSON 对象:
| 字段 | 类型 | 说明 |
|---|---|---|
id | int | Telegram 消息 ID |
date | string | ISO 8601 时间戳,包含时区 |
text | string/null | 完整消息文本(不截断) |
has_media | bool | 消息是否包含媒体 |
media_type | string/null | GramJS 类名(MessageMediaPhoto 等) |
media_file | string/null | media/ 目录中的文件名(例如 "6.jpg") |
views | int/null | 查看次数(仅限频道) |
forwards | int/null | 转发次数 |
reply_to_msg_id | int/null | 回复所指向的父消息 ID |
grouped_id | int/null | 相册组 ID(同一相册中的消息共享此 ID) |
edit_date | string/null | 最后编辑时间的 ISO 8601 时间戳 |
sender.id | int | 发送者的 Telegram 用户/频道 ID |
sender.name | string | 显示名称(频道标题或用户名字) |
sender.username | string/null | 设置后显示的 @username |
断点续传支持
重新运行同一命令时,会跳过已下载的媒体文件(检查 dest.exists())。每次运行都会完整重写 NDJSON,因此可以安全地恢复中断的下载。
查询输出
# jq: find all GOLD BUY signals with chart screenshots
jq 'select(.text != null and (.text | test("GOLD.*BUY")) and .media_file != null)' messages.ndjson
# DuckDB: aggregate by date
duckdb -c "SELECT date::DATE as day, count(*) FROM read_ndjson('messages.ndjson') GROUP BY day ORDER BY day"
# Python/Polars
import polars as pl
df = pl.read_ndjson("messages.ndjson")
性能说明
- 约 3000 条消息和 1700 个媒体文件需要约 3-5 分钟
- Telegram 可能会在下载过程中短暂断开连接(
Server closed the connection)——GramJS 会自动重新连接 - 对于超大型频道(10k+ 条消息),下载媒体预计需要 10-15 分钟
推荐的存储方式
对于由 git 跟踪的项目,请将媒体文件夹添加到 gitignore:
# data/telegram/.gitignore
*/media/
这样可以将 NDJSON(元数据)保存在版本控制中,同时仅在本地保留较大的媒体文件。
反模式
- 不要转储你未订阅的频道——GramJS 需要通过你的账户访问
- 不要在同一 profile 上同时运行多个转储任务——会话文件会发生争用
执行后复盘
此技能执行完毕后,请在结束前检查:
- 命令是否成功?——如果没有,请修复导致失败的说明或错误表。
- 参数或输出是否发生变化?——如果 tg-cli.ts 的接口发生变化,请相应更新用法示例和参数表。
- 是否需要采用变通方案?——如果你不得不临时调整(使用不同的标志、增加额外步骤),请更新此 SKILL.md,避免下次调用时再次遇到同样的问题。
仅在问题真实且可复现时进行更新,不要基于猜测更新。
评论
支持 Markdown