1仕組みと動作原理
中核は X のリバースエンジニアリング API の利用:SKILL.md にて reverse-engineered X API の使用を明記しており、これに基づきツイート/スレッド/Article を Markdown として抽出します。
This tool uses a reverse-engineered X API, NOT official.
3 つのコンテンツ種別に応じた抽出パス:通常のツイートやスレッドは YAML front matter 付き Markdown に変換し、X Article は全文エンティティ抽出を行います。
- Tweets/threads → Markdown with YAML front matter
Article 全文抽出の実装:まずツイートに埋め込まれた article エンティティを試行し、取得できない場合は URL から article id を解析して個別に fetchXArticle で取得します。
const fetched = await fetchXArticle(articleId, cookieMap, false);
ユーザーアカウントの Cookie による認証:環境変数 X_AUTH_TOKEN / X_CT0 を最優先し、次いで Chrome ログインとローカル Cookie キャッシュへフォールバックします。
1. **Environment variables** (preferred): `X_AUTH_TOKEN`, `X_CT0`
読み取った Cookie は cookies.json に保存:cookie-file.ts が version/updatedAt/cookieMap の構造で JSON を書き込み、パスは paths.ts がクロスプラットフォームで解決します。
await writeFile(p, JSON.stringify(payload, null, 2), "utf8");
メディアのローカル保存はオプション:--download-media を有効にすると、画像や動画を Markdown と同階層の imgs/ および videos/ にダウンロードし、リンクを相対パスに書き換えます。
| `--download-media` | Download image/video assets to local `imgs/` and `videos/`, and rewrite markdown links to local relative paths |
メディア処理のデフォルトは「先に Markdown を生成してから確認」:初回はダウンロード引数なしで実行し、生成結果にリモートメディア URL が残っている場合のみ確認を求め、同意後に再実行してリンクを上書きします。
5. If user confirms → run script **again** with `--download-media` (overwrites markdown with localized links)
EXTEND.md の初回セットアップはブロック処理として実装:ファイルが存在しない場合は、対話形式で設定(メディア方針/出力ディレクトリ/保存場所)を尋ねる必要があり、暗黙的にデフォルト値を使用することは禁止されています。
**CRITICAL**: When EXTEND.md is not found, you **MUST use `AskUserQuestion`** to ask the user for their preferences before creating EXTEND.md.
リバースエンジニアリングの利用には同意ゲートが必要:consent ファイルが存在しない、またはバージョンが一致しない場合は免責事項を表示し、ユーザーが拒否した場合は終了メッセージを出力して停止します。
**Step 5**: On decline → output "User declined. Exiting." and stop.
プラットフォームに応じたデータディレクトリの解決:paths.ts は Linux では XDG_DATA_HOME(または ~/.local/share)、macOS では Application Support、Windows では APPDATA を使用します。
return process.env.XDG_DATA_HOME ?? path.join(os.homedir(), ".local", "share");
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| network | x.com(登录流程与逆向 API 请求) |
| network | pbs.twimg.com(推文图片资源,出现在输出样例 coverImage) |
| cli | bun / npx(以 npx -y bun 运行脚本) |
| cli | 本机 Chrome/Chromium(回落到浏览器登录时 spawn 以取 cookie) |
4推奨統制措置と判定根拠
- SKILL.md / 脚本: 未公開またはリバースエンジニアリングされたプライベート API の呼び出し / クライアント識別子の偽装
- SKILL.md / 脚本参数: 自動検出の回避、ホストサンドボックスの無効化、または SSL 証明書検証のスキップを含む処理
- SKILL.md / 会话存储: ブラウザのユーザーログイン状態およびセッション Cookie の読み取りまたは再利用
- 本地凭据 / 浏览器配置: ユーザーのログイン Cookie/セッション/キーチェーンの読み取り: アカウント Cookie: X_AUTH_TOKEN / X_CT0(環境変数を優先)、次いでローカルの cookies.json、最終的に Chrome ログインを介した読み取り(sk
- scripts/: ローカルスクリプトまたはコマンドの実行: scripts/main.ts(npx -y bun で実行。ブラウザログインへフォールバックした際に Chrome を spawn して Cookie を読み取り)
- 网络端点: 外部ネットワークアクセスの宣言: https://x.com/home(ログインフロー、constants.ts の X_LOGIN_URL)
- 本地工作目录: ファイルの読み書きと成果物の出力: x-to-markdown/{username}/{tweet-id}.md(または -o で指定したパス)
5二重目の独立検証
- [ok] 逆向 API 而非官方 API(red 主因之一) — SKILL.md 有 DISCLAIMER「This tool uses a reverse-engineered X API, NOT official.」,并据此设 consent 门禁。
- [ok] 读取账号 cookie(red 主因之二) — SKILL.md 列出环境变量 X_AUTH_TOKEN/X_CT0 为首选来源、Chrome 登录为兜底;cookies.ts 内含 child_process spawn。
- [ok] 媒体下载范围受限 — --download-media 为显式开关,ask 流程要求先出 markdown 再询问,非默认批量下载。
- [ok] 两道用户门禁 — consent.json(accepted + disclaimerVersion)与 EXTEND.md 首次设置(BLOCKING,禁止静默默认)均在 SKILL.md 写明。
- [ok] 数据目录跨平台解析 — paths.ts 按 win32/darwin/其他分派 APPDATA / Application Support / XDG_DATA_HOME,并支持 X_DATA_DIR 等覆盖。
- [unlocatable] GraphQL 与媒体模块内部实现 — graphql.ts / media-localizer.ts 正文未在证据包展开,仅依据 §1 文件清单与 §3 扫描行定位其存在与职责;未据此提升或降低档位。
6結論
f839fffff58e69c9…