首页 / 全部技能 / 内容创作 / canghe-danger-x-to-markdown
内容创作 · freestylefly/canghe-skills

canghe-danger-x-to-markdown

Converts X (Twitter) tweets and articles to markdown with YAML front matter. Uses reverse-engineered API requiring user consent. Use when user mentions "X to markdown", "tweet to markdown", "save tweet", or provides x.com/twitter.com URLs for conversion.

L5 严管 · 隔离环境与严格审计V2 已复核逆向接口条款/合规凭据/登录态执行命令联网读写文件Dual-pass Audit
Author freestyleflyGitHub freestylefly/canghe-skills ↗License MIT(仓库根 LICENSE)Commit dd0bf35595
管控等级描述 skill 的能力与建议配套的管控措施,不代表质量或安全认证,也不表示可用或不可用。是否使用由用户和管理者决定。不同 agent 宿主对权限的约束各不相同,请勿假定宿主一定会提供安全兜底。第三方 skill 版权归原作者,使用风险由使用者自行承担。

1实现原理 · 为什么它能做到

核心是走 X 的逆向 API:SKILL.md 自述使用 reverse-engineered X API,并据此把推文/线程/Article 抽出为 markdown。

skills/canghe-danger-x-to-markdown/SKILL.md
This tool uses a reverse-engineered X API, NOT official.
这里在做什么:不申请官方 API,直接用网页端能力抓取;脚本入口 scripts/main.ts,含 graphql/cookies/media-localizer 等模块。

三类内容各有抽取路径:普通推文与线程转成带 YAML front matter 的 markdown,X Article 走全文实体抽取。

skills/canghe-danger-x-to-markdown/SKILL.md
- Tweets/threads → Markdown with YAML front matter
这里在做什么:front matter 含 url/author/tweetCount/coverImage;Article 由 tweet-article.ts 的 resolveArticleEntityFromTweet 解析。

Article 全文抽取的实现:先尝试推文内嵌的 article 实体,取不到再从 URL 解析 article id 并单独 fetchXArticle 拉取。

skills/canghe-danger-x-to-markdown/scripts/tweet-article.ts
const fetched = await fetchXArticle(articleId, cookieMap, false);
这里在做什么:extractArticleIdFromTweet 会从 note_tweet/legacy 的 urls 里用正则 /\/(?:i\/)?article\/(\d+)/ 挖出 id,再按 id 拉全文。

鉴权靠用户账号 cookie:优先用环境变量 X_AUTH_TOKEN / X_CT0,其次回落到 Chrome 登录并本地缓存 cookie。

skills/canghe-danger-x-to-markdown/SKILL.md
1. **Environment variables** (preferred): `X_AUTH_TOKEN`, `X_CT0`
这里在做什么:cookies.ts 负责三源加载与必需项校验,必要时 spawn 本机 Chrome(脚本内 child_process)。

读到的 cookie 会被落盘成 cookies.json:cookie-file.ts 以 version/updatedAt/cookieMap 结构写 JSON,路径由 paths.ts 跨平台解析。

skills/canghe-danger-x-to-markdown/scripts/cookie-file.ts
await writeFile(p, JSON.stringify(payload, null, 2), "utf8");
这里在做什么:默认落在用户数据目录 canghe-skills/x-to-markdown/cookies.json,可用 X_COOKIE_PATH 覆盖。

媒体本地化是可选项:开启 --download-media 后把图片/视频下载到 markdown 同级的 imgs/ 与 videos/,并把链接改写成相对路径。

skills/canghe-danger-x-to-markdown/SKILL.md
| `--download-media` | Download image/video assets to local `imgs/` and `videos/`, and rewrite markdown links to local relative paths |
这里在做什么:下载逻辑在 media-localizer.ts;不开该开关时保留远端 URL。

媒体处理默认“先出 markdown 再问”:先不带下载参数跑一次,若产出仍有远端媒体 URL 才询问,确认后再次运行覆盖链接。

skills/canghe-danger-x-to-markdown/SKILL.md
5. If user confirms → run script **again** with `--download-media` (overwrites markdown with localized links)
这里在做什么:download_media 三态(ask/1/0)由 SKILL.md 规定,脚本侧只认 --download-media 布尔开关。

EXTEND.md 首次设置被写成阻塞操作:不存在时必须先交互问偏好(媒体策略/输出目录/保存位置),禁止静默用默认值。

skills/canghe-danger-x-to-markdown/SKILL.md
**CRITICAL**: When EXTEND.md is not found, you **MUST use `AskUserQuestion`** to ask the user for their preferences before creating EXTEND.md.
这里在做什么:详细问卷与 EXTEND.md 模板另存于 references/config/first-time-setup.md。

逆向使用还需一句同意门禁:没有 consent 文件或版本不符时展示免责声明,用户拒绝即输出退出信息并停止。

skills/canghe-danger-x-to-markdown/SKILL.md
**Step 5**: On decline → output "User declined. Exiting." and stop.
这里在做什么:同意文件含 accepted/acceptedAt/disclaimerVersion,路径在 ~/.local/share/canghe-skills/x-to-markdown/consent.json。

数据目录按平台解析:paths.ts 在 Linux 用 XDG_DATA_HOME(或 ~/.local/share),macOS 用 Application Support,Windows 用 APPDATA。

skills/canghe-danger-x-to-markdown/scripts/paths.ts
return process.env.XDG_DATA_HOME ?? path.join(os.homedir(), ".local", "share");
这里在做什么:cookie/consent/chrome-profile 路径都派生自同一数据目录,并各有 env 覆盖键。

2核心能力

01单推/长线程 → markdown
02X Article 全文抽取(内嵌实体→按 id 补抓)
03YAML front matter 输出(url/author/tweetCount/coverImage)
04媒体本地化(imgs/ 与 videos/ + 链接改写)
05cookie 三路获取(env → 本地文件 → Chrome 登录)与 --login 刷新
06同意门禁与首次设置强交互(consent.json + EXTEND.md 三问)
07--json 结构化输出与 -o 指定输出路径
08确定性的归档目录结构

3外部依赖

KindDependency / Endpoint
networkx.com(登录流程与逆向 API 请求)
networkpbs.twimg.com(推文图片资源,出现在输出样例 coverImage)
clibun / npx(以 npx -y bun 运行脚本)
cli本机 Chrome/Chromium(回落到浏览器登录时 spawn 以取 cookie)

4管控建议与判定依据

建议配套管控措施
面向 Agent
隔离环境,逐次授权
面向管理者
严格授权、全量审计、合规确认
判定依据(文件路径与关键语句摘要)
  • SKILL.md / 脚本: 调用未公开或逆向工程的私有 API / 伪造客户端标识
  • SKILL.md / 脚本参数: 包含绕过自动化检测、关闭宿主沙箱或跳过 SSL 证书校验
  • SKILL.md / 会话存储: 读取或复用浏览器用户登录态与会话 Cookie
  • 本地凭据 / 浏览器配置: 读取用户登录 Cookie/会话/密钥环: 账号 cookie:X_AUTH_TOKEN / X_CT0(env 优先),其次本地 cookies.json,最后经 Chrome 登录读取(sk
  • scripts/: 执行本地脚本或命令: scripts/main.ts(npx -y bun 运行;回落到浏览器登录时会 spawn Chrome 读 cookie)
  • 网络端点: 声明外部网络访问: https://x.com/home(登录流程,constants.ts 的 X_LOGIN_URL)
  • 本地工作目录: 文件读写与工件输出: x-to-markdown/{username}/{tweet-id}.md(或 -o 指定路径)
审计说明: (属能力/策略级判定,非恶意植入)。(a) 逆向工程 + 冒充官方客户端:SKILL.md 自述 reverse-engineered X API,不使用官方 API,而由 graphql.ts 直接请求 X 的私有接口并用账号 cookie 通过。(b) 凭证面:读取并使用用户账号 cookie X_AUTH_TOKEN/X_CT0(env、本地 cookie 文件,或经 cookies.ts 回落 Chrome 登录并经 CDP/浏览器读取),SKILL.md 自述风险含 “Possible account restrictions”。(c) 命令面:回落路径会 spawn 本机 Chrome/Chromium 取 cookie。程度说明:未发现 TLS 校验降级、未发现反自动化伪装、不做批量定向采集、无任意代码执行;媒体下载仅在 --download-media 时发生。定级依据是“逆向私有接口 + 冒充网页客户端 + 私有凭据”。

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结论

  • 归档友好:输出固定目录结构与 YAML front matter,适合把 X 内容长期留存/建站。
  • 媒体可选本地化:一键把图片视频抓成本地相对路径,离线归档不丢媒体。
  • 凭据获取灵活:env 直填、cookie 文件、浏览器登录三条路,CI 与本地都可用。
  • 门禁严:逆向免责同意与首次偏好设置都强制交互,不静默写默认值。
  • Article 抽取有兜底:内嵌实体取不到时按 article id 单独补抓。
  • 适合: 适合个人做内容归档/素材整理:把长线程、X Article 转成可检索的 markdown(配 --download-media 做完整离线副本),或作为写文章前的素材入库步骤。
    不适合: 不适合企业合规环境或主账号高频使用;不适合需要官方支持与稳定 SLA 的批量采集(入口是单 URL,不做批量);不适合不想在本机留下 cookie/consent/归档文件的场景。
    Install Agent-Ready
    ① Verified Mirror 2026-10-10
    Option A · Direct DownloadDownload canghe-danger-x-to-markdown.tar.gz
    sha256: f839fffff58e69c9…
    Option B · Copy Guide for Agent
    install.json
    agent 读 JSON 指南后会自动从本站下载安装,无需更多说明。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit dd0bf35595.