全部技能 / 内容创作 / 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.

风险提醒:红色 · 谨慎使用AI 侦查报告
作者 JimLiuGitHub JimLiu/baoyu-skills ↗Stars 25926许可 MIT(仓库根 LICENSE,Copyright (c) 2026 Jim Liu;GitHub API license.spdx_id=MIT)commit 1567581c26
agent 宿主通常会约束 skill 执行权限;风险提醒为 AI 侦查观点,不构成质量或安全保证。第三方 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外部依赖

类型依赖
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风险提醒 风险提醒:红色 · 谨慎使用

风险提醒:红色 · 谨慎使用
  • 账号风险(逆向 API + 冒充网页客户端) — 带硬编码 bearer 与固定 UA 请求私有 GraphQL,README 明确可能 'Account restrictions possible if API usage detected';建议用小号或专用 cookie。
  • cookie 处理与存放 — auth_token/ct0 会被读入内存并入请求头;脚本会把查到的 cookie 缓存/使用(本地文件与 CDP 两条路),这些值等价于账号登录态。
  • 文本与媒体外发/落盘 — 推文正文原样写成 markdown(可能含跟踪链接与远端媒体 URL);--download-media 会从 pbs/video.twimg.com 拉文件到本地,需注意磁盘与来源可信度。
  • 输出路径由远端数据参与决定 — 目录用 username/tweet-id/content-slug 命名,username 来自抓取结果;异常字符或非常规用户名可能导致路径不如预期(建议必要时用 -o 固定)。
  • 接口随时可能失效 — queryId/featureSwitches 抓取失败会回落到常量,常量过期即整体失败;无官方支持渠道。
  • 内容合规 — 把 X 内容抓成本地归档涉及转载/版权与平台条款,使用者需自行确认授权范围。
风险提醒:红色,谨慎使用(属能力/策略级判定,非恶意植入)。(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/归档文件的场景。
    安装 agent 直装可复制
    ① 本站镜像 更新 2026-09-15
    方式 A · 人下载镜像包下载 baoyu-danger-x-to-markdown.tar.gz
    sha256: bb27420994157cc5…
    方式 B · JSON 格式安装指南,复制给 agent
    安装指南
    agent 读 JSON 指南后会自动从本站下载安装,无需更多说明。
    ② 上游 GitHub · 原始来源
    能访问 GitHub?直接去上游安装(实时版,可能已更新)GitHub 原始 ↗
    本页镜像锁定 commit 1567581c26;上游为实时仓库。
    来源信息 GitHub 原始
    作者 / 仓库JimLiu / JimLiu/baoyu-skills
    Stars25926
    最近推送2026-09-10
    本 skill commit1567581c26
    许可MIT(仓库根 LICENSE,Copyright (c) 2026 Jim Liu;GitHub API license.spdx_id=MIT)
    本站信息
    收录日期2026-09-06
    分类内容创作
    侦查报告AI 侦查 · 2 遍 · 2026-09-06
    本站镜像与 GitHub 原始是不同来源:本站锁定 commit 快照经 /r2 分发;GitHub 为实时上游,内容可能已更新。
    同分类邻近