ホーム / 全スキル / コンテンツ制作 / baoyu-danger-x-to-markdown
コンテンツ制作 · JimLiu/baoyu-skills

baoyu-danger-x-to-markdown

X(Twitter)のポスト(ツイート)や記事をYAMLフロントマター付きのMarkdownに変換します。リバースエンジニアリングされたAPIを使用するため、ユーザーの同意が必要です。ユーザーが「X to markdown」「tweet to markdown」「save tweet」と言及した場合や、変換対象のx.com/twitter.comのURLを提供した際に使用します。

L5 厳格管理 · 隔離環境と厳格な監査V2 人間監査済リバースAPI規約/コンプライアンス認証情報/セッションコマンド実行ネットワーク通信ファイル書き込み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 APIのリバースエンジニアリングです。まず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`);
3つの操作それぞれに取得ロジックとフォールバック定数が存在します:TweetResultByRestId(単一ポスト)、TweetDetail(スレッド)、ArticleEntityResultByRestId(X Article)。取得できない場合はFALLBACK_QUERY_IDおよびFALLBACK_FEATURE_SWITCHESを使用します。

リクエストにはX Web版の公開Bearerトークンと固定User-Agentが付与されます。これは「公式Webクライアントへのなりすまし」を実現する手法であり、公式APIキーの申請が不要な理由でもあります。

skills/baoyu-danger-x-to-markdown/scripts/constants.ts
export const DEFAULT_BEARER_TOKEN =
同一ファイル内にはChrome 130のUser-Agent(DEFAULT_USER_AGENT)も固定化されています。featureSwitchesは100以上のスイッチ名からなる定数リストです(FALLBACK_*_FEATURE_SWITCHES)。

認証はCookieに依存します。環境変数X_AUTH_TOKEN / X_CT0(任意でX_GUEST_TOKEN / X_TWID)を最優先で読み込み、次にローカルのCookieファイル、最後にChromeからCDP経由で読み込みます。

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フロントマター付きファイルが出力されます。

skills/baoyu-danger-x-to-markdown/SKILL.md
**File structure**: `x-to-markdown/{username}/{tweet-id}/{content-slug}.md`
フロントマターには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の画像は高解像度URLに書き換えられ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の2つのキーのみをサポートします。優先順位は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フロー全体はドキュメントの指示に従ってエージェントが実行します。

2コア機能

01単一ポスト / 長文スレッド → Markdown(TweetResultByRestId + TweetDetail)
02X Article全文抽出(ArticleEntityResultByRestId)
03YAMLフロントマター出力(url/author/tweetCount/coverImage)
04メディアのローカル保存(imgs/ および videos/ + リンク書き換え + 高解像度画像URL再構築)
053系統のCookie取得(環境変数 → ローカルファイル → Chrome CDP)と--loginリフレッシュ
06同意ゲートと初回設定の対話強制(consent.json + EXTEND.md 3つの質問)
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。取得元 = 環境変数 (X_AUTH_TOKEN / X_CT0 / X_GUEST)
  • scripts/: ローカルスクリプトまたはコマンドの実行: scripts/main.ts (bunで実行。必要に応じてCookie読み取りのためChromeデバッグセッションを起動/接続)
  • 网络端点: 外部ネットワークアクセスの宣言: https://x.com/i/api/graphql/<queryId>/<Operation> (TweetResultByRestId / Twe)
  • 本地工作目录: ファイルの読み書きと成果物の出力: x-to-markdown/{username}/{tweet-id}/{content-slug}.md (または-oで指定したパス)
監査ノート: (機能・ポリシーレベルの判定であり、悪意あるコードの混入ではありません)。(a) リバースエンジニアリングAPI + 公式クライアントの偽装:公式APIを使用せず、x.comページからqueryIdとfeatureSwitchesを取得した上で、プライベートな/i/api/graphqlエンドポイントを直接叩き、ハードコードされたWeb版Bearerトークンと固定Chrome UA(constants.tsのDEFAULT_BEARER_TOKEN / DEFAULT_USER_AGENT)を付与しています。(b) 認証情報の扱い:リクエストを通過させるため、ユーザーアカウントのCookieであるauth_token + ct0を読み取って使用します(環境変数、ローカルCookieファイル、またはbaoyu-chrome-cdpを介してローカルChromeからCDP経由で取得)。READMEには「API利用が検知された場合、アカウント制限の可能性がある」と明記されています。(c) アプローチの相違:同リポジトリ内のbaoyu-post-to-xが実UI + CDP自動化を採用しているのに対し、本スキルはプライベート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フロントマターを出力し、Xコンテンツの長期保存や静的サイト構築に適しています。
  • フロントエンド変更への耐性:queryIdとfeatureSwitchesをリアルタイム取得しつつフォールバック定数も備えているため、Xのフロントエンド改修時にも復旧の余地があります。
  • メディアの任意ローカル保存:画像や動画をワンクリックでローカル相対パスに取得でき、オフラインアーカイブでも画像リンク切れを防げます。
  • 柔軟な認証情報取得:環境変数への直接設定、Cookieファイル、ブラウザログインの3経路に対応し、CI環境とローカル環境の双方で利用可能です。
  • 厳格な安全ゲート:リバースエンジニアリングに関する免責同意と初回設定はいずれも対話が必須であり、デフォルト値が勝手に適用されることはありません。
  • 最適な用途: 個人のコンテンツアーカイブや素材整理に最適です。長文スレッドやX Articleを検索可能なMarkdownに変換したり(--download-mediaを併用して完全なオフラインコピーを作成)、記事執筆前の素材ストック手順として活用できます。
    不向きな用途: 企業のコンプライアンス要件が厳しい環境や、メインアカウントでの高頻度利用には適していません。公式サポートや安定したSLAを求める一括収集には適していません(本スキルは単一URLを対象とし、バッチ処理には非対応です)。ローカルマシンにCookie、同意ファイル、アーカイブファイルを残したくない環境には適していません。
    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.