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

baoyu-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 JimLiuGitHub JimLiu/baoyu-skills ↗Stars 25926License MIT(仓库根 LICENSE,Copyright (c) 2026 Jim Liu;GitHub API license.spdx_id=MIT)Commit 1567581c26
管控等级描述 skill 的能力与建议配套的管控措施,不代表质量或安全认证,也不表示可用或不可用。是否使用由用户和管理者决定。不同 agent 宿主对权限的约束各不相同,请勿假定宿主一定会提供安全兜底。第三方 skill 版权归原作者,使用风险由使用者自行承担。

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

核心是逆向 X 的 GraphQL 接口:先抓 x.com 页面 HTML 里的 queryId 与 featureSwitches,再把变量拼进 /i/api/graphql/<queryId>/<Operation> 请求。

skills/baoyu-danger-x-to-markdown/scripts/graphql.ts
const url = new URL(`https://x.com/i/api/graphql/${queryInfo.queryId}/TweetResultByRestId`);
三种操作各有抓取逻辑与兜底常量:TweetResultByRestId(单推)、TweetDetail(线程)、ArticleEntityResultByRestId(X Article);抓不到就用 FALLBACK_QUERY_ID 与 FALLBACK_FEATURE_SWITCHES。

请求带的是 X 网页端公开 bearer token 与固定 UA——这是“冒充官方 Web 客户端”的实现手段,也是它不需要申请 API Key 的原因。

skills/baoyu-danger-x-to-markdown/scripts/constants.ts
export const DEFAULT_BEARER_TOKEN =
同一文件还固化了 Chrome 130 的 User-Agent(DEFAULT_USER_AGENT);featureSwitches 是上百个开关名的常量列表(FALLBACK_*_FEATURE_SWITCHES)。

鉴权靠 cookie:优先读环境变量 X_AUTH_TOKEN / X_CT0(可加 X_GUEST_TOKEN / X_TWID),其次本地 cookie 文件,最后经 CDP 从 Chrome 读。

skills/baoyu-danger-x-to-markdown/scripts/cookies.ts
const authToken = process.env.X_AUTH_TOKEN?.trim();
必需 cookie 只有 auth_token 与 ct0(X_REQUIRED_COOKIES),另外会挑 x.com 域下 path=/ 的同名 cookie 优先;加载来源都会打印日志。

抓到的推文/文章被转成 markdown:线程按 TweetDetail 的会话结构串联,Article 走 articleEntity 全文,引用推文另有解析,最终产出带 YAML front matter 的文件。

skills/baoyu-danger-x-to-markdown/SKILL.md
**File structure**: `x-to-markdown/{username}/{tweet-id}/{content-slug}.md`
front matter 含 url/author/tweetCount/coverImage;线程页由 thread.ts/thread-markdown.ts、引用推文由 referenced-tweets.ts、Article 由 tweet-article.ts 分别处理。

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

skills/baoyu-danger-x-to-markdown/scripts/media-localizer.ts
if (hostname.includes("video.twimg.com")) return "video";
下载走 fetch(toHighResUrl(url)):pbs.twimg.com 的图片会被改写为高分辨率并补 format 参数;写盘用 mkdir + writeFile。

同意门禁是硬要求:没有 consent.json(accepted + disclaimerVersion 1.0)时必须先向用户展示免责声明并取得同意,拒绝即退出。

skills/baoyu-danger-x-to-markdown/SKILL.md
This tool uses a reverse-engineered X API, NOT official.
同意文件路径按平台写在 SKILL.md(macOS ~/Library/Application Support、Linux ~/.local/share 下的 baoyu-skills/x-to-markdown/consent.json)。

首次设置同样强制:EXTEND.md 不存在时必须用交互工具问偏好(媒体处理策略、默认输出目录、保存位置),明确禁止静默写默认值。

skills/baoyu-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 只支持两个键:download_media(ask/1/0)与 default_output_dir;优先级 CLI > EXTEND.md > 默认。

媒体处理默认“先出 markdown 再问”:先不带下载参数跑一次,检查产出里是否还有远端媒体 URL,有才询问是否下载并二次运行覆盖链接。

skills/baoyu-danger-x-to-markdown/SKILL.md
5. If user confirms → run script **again** with `--download-media` (overwrites markdown with localized links)
脚本侧只看 --download-media 布尔开关,ask 流程完全由 agent 按文档执行。

2核心能力

01单推 / 长线程 → markdown(TweetResultByRestId + TweetDetail)
02X Article 全文抽取(ArticleEntityResultByRestId)
03YAML front matter 输出(url/author/tweetCount/coverImage)
04媒体本地化(imgs/ 与 videos/ + 链接改写 + 高分辨率图 URL 重写)
05cookie 三路获取(env → 本地文件 → Chrome CDP)与 --login 刷新
06同意门禁与首次设置强交互(consent.json + EXTEND.md 三问)
07--json 结构化输出与 -o 指定输出
08queryId/featureSwitches 动态抓取 + 兜底常量(抗 X 前端变更)

3外部依赖

KindDependency / Endpoint
networkx.com(GraphQL /i/api/graphql/… 与首页 HTML 抓 queryId)
networkpbs.twimg.com(图片媒体下载)
networkvideo.twimg.com(视频媒体下载)
packagebaoyu-chrome-cdp ^0.1.1(npm,CDP 取 cookie)
clibun / npx(${BUN_X} 运行时)

4管控建议与判定依据

建议配套管控措施
面向 Agent
隔离环境,逐次授权
面向管理者
严格授权、全量审计、合规确认
判定依据(文件路径与关键语句摘要)
  • SKILL.md / 脚本: 调用未公开或逆向工程的私有 API / 伪造客户端标识
  • SKILL.md / 脚本参数: 包含绕过自动化检测、关闭宿主沙箱或跳过 SSL 证书校验
  • SKILL.md / 会话存储: 读取或复用浏览器用户登录态与会话 Cookie
  • 本地凭据 / 浏览器配置: 读取用户登录 Cookie/会话/密钥环: cookie:auth_token、ct0(必需),另可带 gt、twid;来源=env(X_AUTH_TOKEN / X_CT0 / X_GUEST
  • scripts/: 执行本地脚本或命令: scripts/main.ts(bun 运行;会按需启动/接管 Chrome 调试会话读 cookie)
  • 网络端点: 声明外部网络访问: https://x.com/i/api/graphql/<queryId>/<Operation>(TweetResultByRestId / Twe
  • 本地工作目录: 文件读写与工件输出: x-to-markdown/{username}/{tweet-id}/{content-slug}.md(或 -o 指定路径)
审计说明: (属能力/策略级判定,非恶意植入)。(a) 逆向工程接口 + 冒充官方客户端:不使用官方 API,而是抓 x.com 页面里的 queryId 与 featureSwitches,再直接请求私有的 /i/api/graphql 端点,并附带硬编码 Web 端 bearer token 与固定 Chrome UA(constants.ts 的 DEFAULT_BEARER_TOKEN / DEFAULT_USER_AGENT)。(b) 凭证面:为让请求通过,读取并使用用户账号 cookie auth_token + ct0(env 或本地 cookie 文件,或经 baoyu-chrome-cdp 用 CDP 从本机 Chrome 读取),README 明确警告 'Account restrictions possible if API usage detected'。(c) 路线差异:同仓库 baoyu-post-to-x 走真实 UI + CDP 自动化(另行定级),本 skill 走私有 API 伪造请求,等价于绕过官方接口与访问控制,故落 red。程度说明:未发现 TLS 校验降级、未发现 navigator.webdriver 之类反自动化伪装、不做批量定向采集、无任意代码执行;媒体下载仅在 --download-media 时发生。

5第二遍独立确认

  • [ok] 逆向 GraphQL 请求 + 客户端冒充(red 主因) — graphql.ts 从首页 HTML 抓 queryId/featureSwitches,拼 https://x.com/i/api/graphql/${queryId}/Operation;constants.ts 提供 FALLBACK_QUERY_ID 与硬编码 bearer/UA。
  • [ok] 浏览 cookie 读取 — cookies.ts:buildInlineCookiesFromEnv 读 X_AUTH_TOKEN/X_CT0/X_GUEST_TOKEN/X_TWID;loadXCookiesFromFile 读本地文件;loadXCookiesFromCdp 经 CDP 取;hasRequiredXCookies 校验 auth_token 与 ct0。
  • [ok] 媒体下载范围 — media-localizer.ts 仅对 pbs.twimg.com / video.twimg.com 判定类型并 fetch 下载,且只在 --download-media 路径调用(SKILL.md 的三态策略)。
  • [ok] 两道用户门禁 — SKILL.md:consent.json(accepted + disclaimerVersion 1.0)与 EXTEND.md 首次设置(三问,禁止静默默认),后者被单独标为 BLOCKING。
  • [ok] 无 TLS 降级 / 无 stealth 伪装 / 无任意代码执行 — 相关 token 全目录零命中;入口是单个 URL;无 eval/动态 import 远程模块。
  • [ok] 与 baoyu-post-to-x 的路线差异(避免档位观感不一致) — post-to-x 走真实 UI + CDP 自动化(另行定级);本 skill 走私有 API 伪造请求 → red。差异来源是技术路线,已在 reason 写明。
  • [ok] meta 元数据 — GitHub API:MIT、25926 stars、pushed_at 2026-09-10T15:13:43Z;本地 HEAD 与 pin 1567581c26ec… 一致。

6结论

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