1仕組みと動作原理
中核となるのはXのGraphQL APIのリバースエンジニアリングです。まずx.comページのHTMLからqueryIdとfeatureSwitchesを取得し、変数を/i/api/graphql/<queryId>/<Operation>リクエストに組み込みます。
const url = new URL(`https://x.com/i/api/graphql/${queryInfo.queryId}/TweetResultByRestId`);
リクエストにはX Web版の公開Bearerトークンと固定User-Agentが付与されます。これは「公式Webクライアントへのなりすまし」を実現する手法であり、公式APIキーの申請が不要な理由でもあります。
export const DEFAULT_BEARER_TOKEN =
認証はCookieに依存します。環境変数X_AUTH_TOKEN / X_CT0(任意でX_GUEST_TOKEN / X_TWID)を最優先で読み込み、次にローカルのCookieファイル、最後にChromeからCDP経由で読み込みます。
const authToken = process.env.X_AUTH_TOKEN?.trim();
取得したポスト/記事はMarkdownに変換されます。スレッドはTweetDetailの会話構造に従って連結され、ArticleはarticleEntityの全文を使用し、引用ポストは個別に解析されて、最終的にYAMLフロントマター付きファイルが出力されます。
**File structure**: `x-to-markdown/{username}/{tweet-id}/{content-slug}.md`
メディアのローカル保存はオプション手順です。--download-mediaを有効にすると、画像/動画をMarkdownと同階層のimgs/およびvideos/にダウンロードし、リンクをローカル相対パスに書き換えます。
if (hostname.includes("video.twimg.com")) return "video";
同意ゲートは必須要件です。consent.json(accepted + disclaimerVersion 1.0)が存在しない場合、事前にユーザーへ免責事項を提示して同意を得る必要があり、拒否された場合は終了します。
This tool uses a reverse-engineered X API, NOT official.
初回設定も同様に必須です。EXTEND.mdが存在しない場合、対話型ツールを用いて設定(メディア処理ポリシー、デフォルト出力ディレクトリ、保存場所)を確認する必要があり、確認なしでデフォルト値を書き込むことは明確に禁止されています。
**CRITICAL**: When EXTEND.md is not found, you **MUST use `AskUserQuestion`** to ask the user for their preferences before creating EXTEND.md.
メディア処理のデフォルトは「先にMarkdownを出力してから確認」です。初回はメディアダウンロード引数なしで実行し、出力にリモートメディアURLが含まれているか確認した上で、ダウンロードするかを問い合せてリンクを上書き再実行します。
5. If user confirms → run script **again** with `--download-media` (overwrites markdown with localized links)
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| network | x.com(GraphQL /i/api/graphql/… 与首页 HTML 抓 queryId) |
| network | pbs.twimg.com(图片媒体下载) |
| network | video.twimg.com(视频媒体下载) |
| package | baoyu-chrome-cdp ^0.1.1(npm,CDP 取 cookie) |
| cli | bun / npx(${BUN_X} 运行时) |
4推奨統制措置と判定根拠
- 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で指定したパス)
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結論
bb27420994157cc5…