1实现原理 · 为什么它能做到
核心是走 X 的逆向 API:SKILL.md 自述使用 reverse-engineered X API,并据此把推文/线程/Article 抽出为 markdown。
This tool uses a reverse-engineered X API, NOT official.
三类内容各有抽取路径:普通推文与线程转成带 YAML front matter 的 markdown,X Article 走全文实体抽取。
- Tweets/threads → Markdown with YAML front matter
Article 全文抽取的实现:先尝试推文内嵌的 article 实体,取不到再从 URL 解析 article id 并单独 fetchXArticle 拉取。
const fetched = await fetchXArticle(articleId, cookieMap, false);
鉴权靠用户账号 cookie:优先用环境变量 X_AUTH_TOKEN / X_CT0,其次回落到 Chrome 登录并本地缓存 cookie。
1. **Environment variables** (preferred): `X_AUTH_TOKEN`, `X_CT0`
读到的 cookie 会被落盘成 cookies.json:cookie-file.ts 以 version/updatedAt/cookieMap 结构写 JSON,路径由 paths.ts 跨平台解析。
await writeFile(p, JSON.stringify(payload, null, 2), "utf8");
媒体本地化是可选项:开启 --download-media 后把图片/视频下载到 markdown 同级的 imgs/ 与 videos/,并把链接改写成相对路径。
| `--download-media` | Download image/video assets to local `imgs/` and `videos/`, and rewrite markdown links to local relative paths |
媒体处理默认“先出 markdown 再问”:先不带下载参数跑一次,若产出仍有远端媒体 URL 才询问,确认后再次运行覆盖链接。
5. If user confirms → run script **again** with `--download-media` (overwrites markdown with localized links)
EXTEND.md 首次设置被写成阻塞操作:不存在时必须先交互问偏好(媒体策略/输出目录/保存位置),禁止静默用默认值。
**CRITICAL**: When EXTEND.md is not found, you **MUST use `AskUserQuestion`** to ask the user for their preferences before creating EXTEND.md.
逆向使用还需一句同意门禁:没有 consent 文件或版本不符时展示免责声明,用户拒绝即输出退出信息并停止。
**Step 5**: On decline → output "User declined. Exiting." and stop.
数据目录按平台解析:paths.ts 在 Linux 用 XDG_DATA_HOME(或 ~/.local/share),macOS 用 Application Support,Windows 用 APPDATA。
return process.env.XDG_DATA_HOME ?? path.join(os.homedir(), ".local", "share");
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| network | x.com(登录流程与逆向 API 请求) |
| network | pbs.twimg.com(推文图片资源,出现在输出样例 coverImage) |
| cli | bun / npx(以 npx -y bun 运行脚本) |
| cli | 本机 Chrome/Chromium(回落到浏览器登录时 spawn 以取 cookie) |
4风险提醒 风险提醒:红色 · 谨慎使用
- 账号风险(逆向 API + 冒充网页客户端) — 用账号 cookie 请求 X 私有接口,SKILL.md 明确风险含 “Possible account restrictions”;建议用小号或专用 cookie。
- cookie 处理与存放 — X_AUTH_TOKEN/CT0 会被读入并入请求头,脚本会把 cookie 落盘成 cookies.json;这些值等价于账号登录态,需按密钥对待。
- 文本与媒体外发/落盘 — 推文正文原样写成 markdown(可能含跟踪链接与远端媒体 URL);--download-media 会从 pbs.twimg.com 拉文件到本地。
- 输出路径由远端数据参与决定 — 目录用 username/tweet-id 命名,username 来自抓取结果;异常字符可能导致路径不如预期(必要时用 -o 固定)。
- 接口随时可能失效 — 依赖逆向私有接口,X 改前端即可能失效,且无官方支持渠道。
- 内容合规 — 把 X 内容抓成本地归档涉及转载/版权与平台条款,使用者需自行确认授权范围。
5第二遍独立确认
- [ok] 逆向 API 而非官方 API(red 主因之一) — SKILL.md 有 DISCLAIMER「This tool uses a reverse-engineered X API, NOT official.」,并据此设 consent 门禁。
- [ok] 读取账号 cookie(red 主因之二) — SKILL.md 列出环境变量 X_AUTH_TOKEN/X_CT0 为首选来源、Chrome 登录为兜底;cookies.ts 内含 child_process spawn。
- [ok] 媒体下载范围受限 — --download-media 为显式开关,ask 流程要求先出 markdown 再询问,非默认批量下载。
- [ok] 两道用户门禁 — consent.json(accepted + disclaimerVersion)与 EXTEND.md 首次设置(BLOCKING,禁止静默默认)均在 SKILL.md 写明。
- [ok] 数据目录跨平台解析 — paths.ts 按 win32/darwin/其他分派 APPDATA / Application Support / XDG_DATA_HOME,并支持 X_DATA_DIR 等覆盖。
- [unlocatable] GraphQL 与媒体模块内部实现 — graphql.ts / media-localizer.ts 正文未在证据包展开,仅依据 §1 文件清单与 §3 扫描行定位其存在与职责;未据此提升或降低档位。
6结论
f839fffff58e69c9…dd0bf35595