Back to skills
extension
Category: Data & AnalyticsAPI key required

X长文抓取

抓取 X (Twitter) 长文章(article/note)输出为 Markdown,含图片嵌入原文正确位置、支持下载图片到本地。通过 X 的 GraphQL API(TweetResultByRestId)无需浏览器自动化。触发场景:(1) 用户提供 x.com 文章链接要求抓取/导出/保存,(2) 用户说"抓取 X 文章""导出 Twitter 文章""保存这篇 X 长文",(3) 用户想把 X 文章转 Markdown/本地存档。前置要求:用户必须从浏览器 DevTools → Application → Cookies 复制 auth_token 和 ct0 两个值。

personAuthor: user_760e259ahubcommunity

X Article Fetcher

通过 X.com 的 GraphQL API 抓取长文章(article),解析 Draft.js 内容模型,输出带图片的 Markdown 文件。

前置条件

用户必须提供 X 登录态的 auth_tokenct0 两个 cookie 值。引导用户按以下步骤获取:

  1. 在浏览器中打开 https://x.com(确保已登录)
  2. 按 F12 → Application(应用程序)→ Cookies → https://x.com
  3. 找到 auth_token,双击值列,Ctrl+C 复制
  4. 找到 ct0,双击值列,Ctrl+C 复制
  5. 将两个值告知(用于当次抓取,不存储)

⚠️ 这相当于临时借用用户登录态。抓取完成后提醒用户可以去 X 安全设置刷新 token。脚本通过命令行参数传入,不持久化凭证。

工作流

1. 确认文章 URL

从用户消息中提取 X 文章链接。支持的格式:

  • https://x.com/{user}/article/{id}
  • https://x.com/i/article/{id}

提取 tweet/article ID(末尾数字)。

2. 获取凭证

如果用户尚未提供 auth_tokenct0,引导用户按上述步骤获取。

3. 运行脚本

执行 scripts/fetch_x_article.py,传入文章 URL 和 cookie 值:

python scripts/fetch_x_article.py "<article_url>" \
  --auth-token "<token>" --ct0 "<ct0>"

可选项:

  • --download-images:下载图片到本地 ./images/ 目录
  • --output <path>:指定输出文件路径(默认 ./article.md

4. 呈现结果

脚本输出:

  • article.md:带图片嵌入的完整 Markdown 文件
  • 若开启 --download-images,还会生成 images/ 目录(含所有图片原始文件)和 gallery.html(图片浏览页)

加载 present_filesarticle.md 呈现给用户。

5. (可选) 自动生成 PDF

如需将文章转为精美 PDF(含封面、目录、分页、图片原位嵌入),执行:

python scripts/x_article_to_pdf.py --dir <article_dir>

其中 <article_dir> 是包含 article.mdimages/ 目录的文章文件夹。脚本将:

  • 读取 frontmatter 中的 title: 作为 PDF 标题
  • 自动生成深蓝渐变封面 + 目录页
  • 用 Edge headless 模式渲染 A4 PDF,图片在原文位置
  • 输出 article.pdf 到文章目录

此脚本依赖 markdownpygments 和本机 Edge 浏览器。

依赖

抓取

  • Python 3.7+,requests

PDF 生成(可选)

  • Python 3.7+,markdownpygments
  • Microsoft Edge 浏览器(Windows 自带)

技术细节

脚本内部流程:

  1. 从 x.com 主页动态提取最新的 TweetResultByRestId queryId(正则匹配 main.xxx.js
  2. 构造 GraphQL GET 请求,携带变量(tweetId, features, fieldToggles)和认证 headers
  3. 解析响应中的 Draft.js content_state
    • blocks → 按 type 渲染(header/code/ordered-list/unstyled)
    • inlineStyleRanges → Markdown 粗体/斜体
    • entityRanges → 链接(LINK)+ 图片(MEDIA/IMAGE)
  4. 通过 media_entities 数组建立 mediaId → 图片 URL 映射
  5. 将图片 ![图片](url) 嵌入原文正确的 block 位置
  6. (可选)下载所有图片到本地