01 · Start
快速开始
先完成一次交互式认证,再选择聊天同步到本地。之后,本地搜索不需要连接 Telegram。
01
安装
需要 Node.js 22.12.0 或更高版本。全局安装后,生产命令是 tg。
npm install -g @will-17173/telegram-cli
tg --version
02
认证账号
认证可能需要手机号、登录验证码和 2FA 密码,因此必须由人在交互式终端完成。
tg account add
tg status
tg whoami
03
找到聊天
脚本中优先使用 JSON 返回的数字 ID。聊天类型包括 user、group、supergroup、channel 和 unknown。
tg chats --account work --json
tg chats --type channel --account work --json
04
同步,再搜索
sync 把消息写入所选账号的 SQLite;search 只查询这份本地数据库。
tg sync @team --account work --json
tg search "release" --chat @team --account work --json
02 · Model
执行模型:命令到底运行在哪里
“读取”不等于“保存”,“写到本地”也不等于“修改 Telegram”。先按下面五种范围选命令。
查询 Telegram,不保存消息
inbox、read、search-online、联系人和多数检查命令需要有效会话,但返回结果不会进入 SQLite。
tg read @ops --since 2h --json
从 Telegram 获取并持久化
history、sync、sync-all 和 refresh 会把消息写入所选账号的 SQLite。
tg sync @ops --limit 5000 --delay 1
只访问 SQLite
search、recent、stats、export 和 purge 不连接 Telegram。新鲜度取决于上次同步。
tg recent --hours 24 --limit 50
改变 Telegram 状态
send、edit、delete、通知静音、文件夹成员变更和群组管理操作都受写入总开关约束。
tg config write-access status --json
在线读取,写入 Markdown
archive 把 Telegram 历史增量写入 Markdown 和可选媒体文件,但不会填充 SQLite。
tg archive @ops --download-media
两个容易混淆的本地落点
- SQLite 持久化
history会从本地最旧消息继续向更旧回填,默认最多 1000 条;sync会从本地最新消息增量更新。一个聊天尚未出现在本地数据库时,sync、sync-all和refresh的首次抓取最多 500 条,即使传入更大的--limit。- Markdown 文件归档
archive在线读取历史并写入文件系统,但不会填充 SQLite。首次未指定范围时归档此前七天;后续根据 manifest 与 Markdown 内的消息标记增量追加。
03 · Workflows
常用工作流
下面的组合刻意把在线、持久化、本地和远端写入分开,适合直接改成自己的账号名和聊天 ID。
只看最新情况,不落盘
tg inbox --limit 50 --account work --json
tg read @ops --since 2h --account work --json
tg search-online "incident" --chat @ops --until "2026-07-14T10:00:00+08:00" --account work --yaml
inbox 不会把消息标记为已读。相对时间必须是正数加 s/m/h/d/w;绝对时间必须带时区,且 --since 早于 --until。
同步后做可重复分析
tg refresh --max-chats 20 --delay 1 --account work --json
tg search "error|failed" --regex --hours 168 --account work --json
tg top --chat @ops --hours 168 --limit 20 --account work --json
tg timeline --chat @ops --hours 168 --by hour --account work --json
refresh 的顶层结果可以成功,但个别聊天仍可能失败;自动化必须检查 data.failures。sync-all 只投影 new_messages、chats 和 results,需要可靠识别部分失败时应选 refresh。
发送消息,再同步本地副本
tg config write-access status --json
tg send @team "Release is ready" --file ./report.pdf --account work --json
tg sync @team --account work --json
send 没有确认提示。重复的 --file 会按顺序组成一个 Telegram 媒体组,文本成为说明文字;Telegram 决定可接受的文件组合与数量。
监听、回复和下载附件
tg listen @team --persist --retry-seconds 5 --account work
tg listen @team --no-interactive --no-media --auto-download --account work
tg listen @team @ops --send-to @team --account work
listen 是无界数据流,不提供 JSON、YAML 或 Markdown 格式选项。交互式 TTY 使用 Ink;--no-interactive 输出纯文本。--auto-download 默认写入 ~/Downloads/telegram-cli,即使 --no-media 隐藏渲染媒体行,规范化附件仍会持久化并可下载。
增量归档为 Markdown
tg archive @ops --download-media --account work --json
tg archive @ops --since "2026-07-12T10:00:00+08:00" --until "2026-07-14T10:00:00+08:00" --account work --json
tg archive --all --full --output ./telegram-archive --account work --markdown
传入一个或多个聊天,或者使用 --all,不能同时使用。--full 与 --since 冲突;--rebuild 会替换聊天文件,并在没有新范围时沿用初始范围。自定义 --output 目录不会被自动重置。
04 · Accounts
账号与配置
每个账号的 Telegram 会话和消息数据库彼此隔离;API 凭据与持久化代理配置则由所有账号共享。
账号生命周期
tg account add
tg account list --json
tg account current --json
tg account switch work --json
tg account logout work --yes --json
tg account login work --json
tg account remove work --force --json
- 第一个添加的账号会成为当前账号;之后新增账号不会自动切换。
logout会使 Telegram 会话失效,但保留账号注册信息和消息数据库;已登出的账号仍能运行本地 SQLite 查询。login会安全替换会话并保留数据库。非 TTY 返回interaction_required时,请在人类终端重试,不要通过管道传入凭据。- 自动化优先在每次调用中显式传入
--account work,避免依赖或改变当前账号。
API 凭据和代理
tg config set --api-id <id> --api-hash "<hash>"
tg config set --proxy socks5://127.0.0.1:1080
tg config list --json
TG_PROXY=http://127.0.0.1:8080 tg status
- 凭据优先级
TG_API_ID与TG_API_HASH必须一起设置,并覆盖已保存值。两者都不存在时可以使用受限的内置默认凭据,但更容易遇到 flood wait。- 代理优先级
TG_PROXY覆盖已保存代理。支持 SOCKS4、SOCKS5、HTTP、HTTPS 和 MTProxy,且代理会用于登录和所有需要 Telegram 连接的命令。- 脱敏规则
config list默认隐藏 API hash。--show-secrets只显示完整 API hash;代理用户名、密码和凭据查询参数始终显示为***。- 恢复文件
- 账号登录失败若返回
error.details.recovery_path或recovery_paths,请安全保留并报告这些路径,恢复前不要删除或覆盖。
本地路径
DATA_DIR 可替换操作系统默认数据根目录;DB_PATH 主要用于测试时覆盖数据库。典型布局如下:
config.json
accounts.json
accounts/<name>/session
accounts/<name>/messages.db
accounts/<name>/archive/
05 · Reference
34 个顶层命令
这是 tg v0.6.1 的完整顶层 Commander 命令清单。范围徽标描述主要行为;带子命令的命令组可能同时包含读取和写入操作。
| 命令 | 范围 | 用途与关键行为 |
|---|---|---|
tg search <keyword> |
仅本地 | 按关键词、聊天、发送者、小时范围或正则搜索已同步消息。 |
tg recent |
仅本地 | 查看近期存储的消息;默认最近 24 小时、最多 50 条。 |
tg stats |
仅本地 | 统计本地消息与聊天数量。 |
tg top |
仅本地 | 列出本地消息中最活跃的发送者,可限制聊天和时间范围。 |
tg timeline |
仅本地 | 按小时或其他时间粒度汇总本地消息活动。 |
tg today |
仅本地 | 查看本地数据库中今天存储的消息。 |
tg filter <keywords> |
仅本地 | 用多关键词及聊天、小时等条件筛选已存储消息。 |
tg archive [chats...] |
文件归档 | 从 Telegram 读取历史并增量写入 Markdown,可下载媒体;不会填充 SQLite。 |
tg export <chat> |
仅本地 | 把本地消息导出为选定格式;--format 控制文件内容,--json 控制命令信封。 |
tg purge <chat> --yes |
本地删除 | 确认后删除该聊天的本地消息,不会删除 Telegram 远端消息。 |
tg data reset --yes |
本地重置 | 管理账号范围的本地数据。媒体 schema 破坏性升级后需要删除旧数据库/默认归档,再重新同步。tg data reset --yes |
tg status |
在线读取 | 检查所选账号的 Telegram 身份验证状态。 |
tg whoami |
在线读取 | 显示当前已认证 Telegram 身份的基本信息。 |
tg chats |
在线读取 | 列出对话,可按 user/group/supergroup/channel/unknown 类型筛选。 |
tg history <chat> |
写入本地 | 从本地最旧消息继续向更旧回填并保存;默认上限 1000,本地无消息时从最新开始。 |
tg sync <chat> |
写入本地 | 按本地进度增量同步一个聊天的新消息。 |
tg sync-all |
写入本地 | 批量增量同步多个对话;输出投影不保留完整失败明细。 |
tg refresh |
写入本地 | 批量刷新聊天;脚本应在顶层成功时继续检查 data.failures。 |
tg info <chat> |
在线读取 | 查询 Telegram 聊天元信息。 |
tg send <chat> [message] |
远端写入 | 发送文本、文件或带说明文字的媒体组;没有确认提示,也不会写入本地消息库。 |
tg edit <chat> <msgId> <text> |
远端写入 | 编辑一条 Telegram 消息。 |
tg delete <chat> <msgIds...> |
远端写入 | 删除一条或多条 Telegram 消息。 |
tg download --chat <chat> |
文件下载 | 下载单条消息全部媒体、指定附件、按 grouped_id 下载相册、消息范围、指定日期或整个聊天中的媒体。附件编号从 1 开始;相册按消息 ID 和消息内编号展平。稳定媒体错误包括 attachment_changed 和 media_access_denied。tg download @channel 42 --attachment 2 |
tg listen [chats...] |
在线流 | 持续监听消息;交互模式可回复或执行群操作,不支持有限结果的格式标志。持久化结构化行使用有序小写 attachments[]。 |
tg contact |
在线读取 | list 列出通讯录联系人,info 按 ID、用户名或手机号解析联系人。 |
tg inbox |
在线读取 | 列出有未读消息的对话,不把消息标记为已读,也不持久化。 |
tg read <chat> |
在线读取 | 按数量或时间范围读取近期 Telegram 消息,不写入 SQLite。 |
tg search-online <query> |
在线读取 | 全局或指定聊天搜索 Telegram 在线消息,不保存结果。 |
tg dialog |
在线读取 | 提供 inbox/read/search/groups 的对话族路由;自动化优先使用较短的顶层同类命令。 |
tg group |
检查 管理 | 检查群组、成员与审计日志,或管理成员、管理员、设置、邀请、话题和消息。 |
tg folder |
检查 管理 | 列出或查看聊天文件夹;显式添加、移除聊天会修改 Telegram。 |
tg notification |
检查 管理 | 查看通知设置,或临时、永久静音与取消静音。 |
tg account |
认证 选择 | 添加、登录、登出、列出、切换或移除隔离账号。 |
tg config |
本地配置 | 管理 API 凭据、代理和远端写入总开关;改变开关不等于授权具体写操作。 |
tg web |
本地管理 | 在 127.0.0.1 启动仅限本机访问的 React 管理界面,用于浏览已存储消息,并为选中的聊天触发只读同步。 |
所有有限结果命令都可使用全局 --account(适用时)与 --markdown;各命令的 JSON/YAML 支持和专用参数请用 tg <command> --help 核对。
06 · Groups
群组检查与 48 个管理操作
先用只读路由确认聊天、成员和权限,再执行具体操作。下面每条完整 CLI 语法都把 <chat> 放在操作之后、操作参数之前。
先检查,不修改
tg group info <chat> --account work --json
tg group members <chat> --type admins --query alice --limit 50 --account work --json
tg group member info <chat> <@username-or-user-id> --account work --json
tg group audit <chat> --user <user> --type member_invited --limit 100 --account work --json
tg group list --admin --limit 100 --account work --json
7 个操作
member · 成员
tg group member add <chat> <users...>添加一个或多个成员。tg group member kick <chat> <user> --yes移出成员。tg group member ban <chat> <user> --yes封禁成员。tg group member unban <chat> <user> --yes解除封禁。tg group member mute <chat> <user> [duration] --yes按可选时长禁言。tg group member unmute <chat> <user> --yes恢复发言权限。tg group member purge <chat> <user> --yes删除该成员在群内的全部消息。
4 个操作
admin · 管理员
tg group admin promote <chat> <user> [permissions] --yes提升为管理员。tg group admin demote <chat> <user> --yes移除管理员权限。tg group admin rank <chat> <user> <text...> --yes设置管理员自定义头衔。tg group admin transfer-owner <chat> <user> --yes把群主身份转移给另一名成员。
13 个操作
chat · 群设置
tg group chat title <chat> <text...>修改群名。tg group chat description <chat> <text...>修改群描述。tg group chat username <chat> <username>修改公开用户名;需要超级群组能力。tg group chat photo <chat> <path>从本地文件设置群头像。tg group chat slowmode <chat> <duration>设置慢速模式,支持off。tg group chat ttl <chat> <duration> --yes设置消息自动删除时间。tg group chat protect <chat> <enabled>开关内容保护。tg group chat join-requests <chat> <enabled>开关新成员审批。tg group chat join-to-send <chat> <enabled>开关加入后才能发言。tg group chat default-permissions <chat> <permissions> --yes设置成员默认权限。tg group chat sticker-set <chat> <sticker-or-off>设置或关闭群贴纸包。tg group chat leave <chat> --yes退出当前群组。tg group chat delete <chat> --yes --confirm-title "<exact title>"永久删除群组;仅群主可执行。
10 个操作
invite · 邀请与入群申请
tg group invite list <chat>只读:列出邀请链接。tg group invite show <chat> <invite>只读:查看一个邀请链接。tg group invite create <chat> [--title ...] [--expire ...]创建邀请链接,可设置次数与审批。tg group invite edit <chat> <invite> [options]修改邀请链接。tg group invite revoke <chat> <invite> --yes撤销邀请链接。tg group invite members <chat> <invite>只读:列出通过该链接加入的成员。tg group invite approve <chat> <user>批准一条入群申请。tg group invite decline <chat> <user>拒绝一条入群申请。tg group invite approve-all <chat> --yes批准全部待处理申请。tg group invite decline-all <chat> --yes拒绝全部待处理申请。
10 个操作
topic · 论坛话题
tg group topic list <chat>只读:列出论坛话题。tg group topic create <chat> <title...>创建话题。tg group topic edit <chat> <id> <title...>修改话题标题。tg group topic close <chat> <id>关闭话题。tg group topic reopen <chat> <id>重新打开话题。tg group topic pin <chat> <id>置顶话题。tg group topic unpin <chat> <id>取消置顶话题。tg group topic reorder <chat> <ids...>重排置顶话题。tg group topic delete <chat> <id> --yes删除话题及其中消息。tg group topic general-hidden <chat> <hidden>开关“常规”话题的可见性。
4 个操作
message · 消息
tg group message pin <chat> <id>置顶一条消息。tg group message unpin <chat> <id>取消置顶一条消息。tg group message unpin-all <chat> --yes取消全部置顶。tg group message delete <chat> <ids...> --yes删除一条或多条群消息。
在监听模式使用斜杠命令
在交互式 listen 中输入 /,即可打开统一命令菜单。回复消息或执行群组操作时,无需重复当前聊天:
/reply <message-id> <content>
/member mute @alice 2h
命令依次匹配完整路径、前缀和有序模糊结果。/rep 和 /rpy 会找到 /reply,/ban 会找到 /member ban。
监听多个聊天时,执行群组操作前必须设置 --send-to <chat>。权限与可用性检查仍然生效,有风险的操作会打开确认弹窗。
07 · Automation
结构化输出与自动化
有限结果命令提供稳定信封和错误码;不要解析人类表格,也不要把流式 listen 当作有限结果命令。
显式选择格式
tg stats --account work --json
tg stats --account work --yaml
tg inbox --account work --markdown
OUTPUT=markdown tg recent --account work
--json、--yaml、--markdown 三选一,显式参数优先。环境变量 OUTPUT=json|yaml|markdown|rich 可设置默认值。未指定时,TTY 使用富文本,非 TTY 默认 YAML。
按退出状态和错误码分支
成功的有限结果写入 stdout。JSON/YAML 结构化失败按请求格式写入 stdout;格式冲突也在 stdout 返回稳定 YAML 信封。人类可读和 Markdown 失败写入 stderr。所有失败都设置非零退出状态。
成功信封
{
"ok": true,
"schema_version": "2",
"data": {}
}
失败信封
{
"ok": false,
"schema_version": "2",
"error": {
"code": "archive_partial_failure",
"message": "Some chats or media could not be archived",
"details": {
"completed": [],
"failed": [],
"warnings": []
}
}
}
自动化检查清单
- 始终传入
--account <name>。 - 机器处理优先用 JSON 或 YAML。
- 先看进程退出状态,再看
ok与error.code。 archive_partial_failure仍可能包含已完成结果。refresh顶层成功时继续检查data.failures。- 不要用 Markdown 还原完整
error.details。
交互仍然是交互
给 account add 或 account login 加 --json,只会结构化最终结果,不会绕过手机号、验证码或 2FA 输入。收到 interaction_required 后,把任务交给人类 TTY。
08 · Safety
远端写入与本地隐私
写入总开关是一道本地技术闸门,不是授权。打开闸门后,仍要在执行每个具体远端修改前取得明确许可。
tg config write-access status --json
tg config write-access off --json
tg config write-access on --json
Telegram 远端修改
send、edit、delete、通知 mute/unmute、文件夹 chat add/remove,以及所有非只读群操作。关闭时会在执行远端修改前返回 write_access_disabled。
读取、持久化和本地维护
Telegram 读取、本地查询、导出、purge、同步、历史、归档、账号生命周期和配置修改仍可运行。开启总开关本身也需要授权,但它不会授权下一条远端写命令。
确认规则
- 标记为高风险的群命令缺少
--yes时会拒绝执行,不会为了该修改而连接 Telegram。 - 永久删除群组还必须传入
--confirm-title "<exact title>",内容与当前群名完全一致。 - 没有内置确认提示的操作仍是远端写入;不要把“无需
--yes”理解为“无需授权”。 - Telegram 自身的管理员权限、群主身份、超级群组或论坛能力和速率限制始终适用。
09 · Recovery
故障排查
v0.6.1 的自动化应匹配 error.code,不要匹配可能变化的消息文本。先判断账号与数据范围,再决定是否重试。
account_required / account_not_found
没有可用账号时运行 tg account add;名称错误时先运行 tg account list --json,再修正 --account。自动化不要依赖交互式账号选择。
account_logged_out / interaction_required
已登出的账号仍可做本地查询,但 Telegram 命令需要在人类 TTY 运行 tg account login <name>。不要用 stdin 管道传验证码或 2FA 密码。
telegram_account_session_expired / AUTH_KEY_UNREGISTERED
远端会话已经失效。确认账号名后运行 tg account remove <name> --force,再交互式重新认证。删除前先确认不需要保留该账号本地数据。
account_identity_mismatch
重新登录得到的 Telegram 身份与已注册账号不一致。停止覆盖会话,核对账号选择,并保留错误返回的恢复路径。
chat_not_found / ambiguous_chat
本地命令只认识所选账号数据库中的聊天。先同步正确账号;如果名称匹配多个聊天,改用 tg chats --json 返回的数字 ID。
本地搜索为空
确认 --account 和 --chat,再运行 tg sync <chat>。在线 read、search-online 和发送操作不会自动更新 SQLite。
contact_not_found
Telegram 无法用所给数字 ID、用户名或手机号解析联系人。检查格式;chats --type user 列出的是私聊对话,不等同于 contact list 通讯录。
invalid_notification_duration
静音时长使用正整数加 s/m/h/d/w,或使用 forever;省略时默认永久静音。
folder_not_found / ambiguous_folder
文件夹标题可以重复。运行 tg folder list --json,再把数字文件夹 ID 用于 info、chat add 或 chat remove。收到 folder_operation_unsupported 后不要盲目重试不受支持的修改。
archive_account_mismatch / archive_partial_failure
归档根目录属于另一账号时,选择独立输出目录。部分失败时保留已完成文件,检查 completed、failed 和 warnings;单个附件警告码是 archive_media_failed。
password_required / password_invalid
群所有权转移必须由群主在交互式终端重新输入 2FA 密码。password_too_fresh 或 session_too_fresh 会带等待信息;不要提前重试。
write_access_disabled
先确认用户确实授权了当前具体写操作,再单独取得修改写入开关的授权。打开总开关后仍需重新确认目标聊天、账号和操作参数。
flood_wait / FLOOD_WAIT
停止密集重试,遵守错误中报告的等待时间,保留 --delay,并考虑配置个人 API 凭据。全局在线搜索、大量历史和媒体下载更容易触发限制。
invalid_output_format
不要组合 --json、--yaml 与 --markdown。脚本若通过 OUTPUT 设置默认格式,显式参数仍会覆盖它。