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

canghe-danger-x-to-markdown

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

L5 厳格管理 · 隔離環境と厳格な監査V2 人間監査済リバースAPI規約/コンプライアンス認証情報/セッションコマンド実行ネットワーク通信ファイル書き込みDual-pass Audit
Author freestyleflyGitHub freestylefly/canghe-skills ↗License MIT(仓库根 LICENSE)Commit dd0bf35595
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

中核は X のリバースエンジニアリング API の利用:SKILL.md にて reverse-engineered X API の使用を明記しており、これに基づきツイート/スレッド/Article を Markdown として抽出します。

skills/canghe-danger-x-to-markdown/SKILL.md
This tool uses a reverse-engineered X API, NOT official.
処理内容:公式 API は申請せず、Web 版の機能を直接用いて取得します。スクリプトのエントリポイントは scripts/main.ts であり、graphql/cookies/media-localizer などのモジュールを含みます。

3 つのコンテンツ種別に応じた抽出パス:通常のツイートやスレッドは YAML front matter 付き Markdown に変換し、X Article は全文エンティティ抽出を行います。

skills/canghe-danger-x-to-markdown/SKILL.md
- Tweets/threads → Markdown with YAML front matter
処理内容:front matter には url/author/tweetCount/coverImage が含まれます。Article は tweet-article.ts の resolveArticleEntityFromTweet により解析されます。

Article 全文抽出の実装:まずツイートに埋め込まれた article エンティティを試行し、取得できない場合は URL から article id を解析して個別に fetchXArticle で取得します。

skills/canghe-danger-x-to-markdown/scripts/tweet-article.ts
const fetched = await fetchXArticle(articleId, cookieMap, false);
処理内容:extractArticleIdFromTweet が note_tweet/legacy の urls から正規表現 /\/(?:i\/)?article\/(\d+)/ を使って ID を抽出し、その ID で全文を取得します。

ユーザーアカウントの Cookie による認証:環境変数 X_AUTH_TOKEN / X_CT0 を最優先し、次いで Chrome ログインとローカル Cookie キャッシュへフォールバックします。

skills/canghe-danger-x-to-markdown/SKILL.md
1. **Environment variables** (preferred): `X_AUTH_TOKEN`, `X_CT0`
処理内容:cookies.ts が 3 つのソースからの読み込みと必須項目の検証を担当し、必要に応じてローカルの Chrome を起動(スクリプト内の child_process)します。

読み取った Cookie は cookies.json に保存:cookie-file.ts が version/updatedAt/cookieMap の構造で JSON を書き込み、パスは paths.ts がクロスプラットフォームで解決します。

skills/canghe-danger-x-to-markdown/scripts/cookie-file.ts
await writeFile(p, JSON.stringify(payload, null, 2), "utf8");
処理内容:デフォルトではユーザーデータディレクトリ canghe-skills/x-to-markdown/cookies.json に保存され、X_COOKIE_PATH で上書き可能です。

メディアのローカル保存はオプション:--download-media を有効にすると、画像や動画を Markdown と同階層の imgs/ および videos/ にダウンロードし、リンクを相対パスに書き換えます。

skills/canghe-danger-x-to-markdown/SKILL.md
| `--download-media` | Download image/video assets to local `imgs/` and `videos/`, and rewrite markdown links to local relative paths |
処理内容:ダウンロード処理は media-localizer.ts に実装されています。このフラグを無効にしている場合はリモート URL が維持されます。

メディア処理のデフォルトは「先に Markdown を生成してから確認」:初回はダウンロード引数なしで実行し、生成結果にリモートメディア URL が残っている場合のみ確認を求め、同意後に再実行してリンクを上書きします。

skills/canghe-danger-x-to-markdown/SKILL.md
5. If user confirms → run script **again** with `--download-media` (overwrites markdown with localized links)
処理内容:download_media の 3 つの状態(ask/1/0)は SKILL.md で定義されており、スクリプト側は --download-media のブール値フラグのみを認識します。

EXTEND.md の初回セットアップはブロック処理として実装:ファイルが存在しない場合は、対話形式で設定(メディア方針/出力ディレクトリ/保存場所)を尋ねる必要があり、暗黙的にデフォルト値を使用することは禁止されています。

skills/canghe-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 テンプレートは references/config/first-time-setup.md に別途保存されています。

リバースエンジニアリングの利用には同意ゲートが必要:consent ファイルが存在しない、またはバージョンが一致しない場合は免責事項を表示し、ユーザーが拒否した場合は終了メッセージを出力して停止します。

skills/canghe-danger-x-to-markdown/SKILL.md
**Step 5**: On decline → output "User declined. Exiting." and stop.
処理内容:同意ファイルには accepted/acceptedAt/disclaimerVersion が含まれ、パスは ~/.local/share/canghe-skills/x-to-markdown/consent.json です。

プラットフォームに応じたデータディレクトリの解決:paths.ts は Linux では XDG_DATA_HOME(または ~/.local/share)、macOS では Application Support、Windows では APPDATA を使用します。

skills/canghe-danger-x-to-markdown/scripts/paths.ts
return process.env.XDG_DATA_HOME ?? path.join(os.homedir(), ".local", "share");
処理内容:cookie/consent/chrome-profile の各パスは同一のデータディレクトリから派生し、それぞれ環境変数による上書きキーを持っています。

2コア機能

01単一ツイート/長文スレッド → Markdown 変換
02X Article の全文抽出(埋め込みエンティティ → ID 指定による再取得)
03YAML front matter の出力(url/author/tweetCount/coverImage)
04メディアのローカル保存(imgs/ および videos/ への保存とリンクの書き換え)
053 系統の Cookie 取得(環境変数 → ローカルファイル → Chrome ログイン)と --login による更新
06同意ゲートおよび初回セットアップの強制対話(consent.json + EXTEND.md の確認)
07--json による構造化出力と -o による出力パス指定
08決定論的なアーカイブディレクトリ構造

3外部依存関係

KindDependency / Endpoint
networkx.com(登录流程与逆向 API 请求)
networkpbs.twimg.com(推文图片资源,出现在输出样例 coverImage)
clibun / npx(以 npx -y bun 运行脚本)
cli本机 Chrome/Chromium(回落到浏览器登录时 spawn 以取 cookie)

4推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
隔離環境で実行、都度明示的な認可
管理者向け
厳格な認可、全量監査、コンプライアンス確認
判定根拠(ファイルパスと抜粋)
  • 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 で指定したパス)
監査ノート: (機能およびポリシーレベルの判定であり、悪意あるコードの混入ではありません)。(a) リバースエンジニアリングと公式クライアントの偽装:SKILL.md にて reverse-engineered X API を使用していると記載されており、公式 API は使用せず、graphql.ts が X のプライベートエンドポイントに直接リクエストを送りアカウント Cookie で認証しています。(b) 認証情報の取り扱い:ユーザーのアカウント Cookie である X_AUTH_TOKEN/X_CT0 を読み取って使用します(環境変数、ローカル Cookie ファイル、または cookies.ts 経由で Chrome ログインにフォールバックして CDP/ブラウザから取得)。SKILL.md には「Possible account restrictions(アカウント制限の可能性)」のリスクが自述されています。(c) コマンド実行:フォールバック処理においてローカルの Chrome/Chromium を spawn して Cookie を取得します。影響度の補足:TLS 検証の無効化や対自動化検知の偽装処理は確認されておらず、特定対象の一括スクレイピングや任意コードの実行も行いません。メディアのダウンロードは --download-media 指定時のみ実行されます。本判定は「プライベートエンドポイントのリバースエンジニアリング + Web クライアントの偽装 + プライベート認証情報の利用」に基づいています。

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結論

  • アーカイブに適した設計:固定のディレクトリ構造と YAML front matter を出力するため、X コンテンツの長期保存や静的サイト生成に適しています。
  • 選択可能なメディアのローカル保存:画像や動画をワンクリックでローカルの相対パスとして取得できるため、オフラインアーカイブでもメディアを保持できます。
  • 柔軟な認証情報の取得:環境変数の直接指定、Cookie ファイル、ブラウザログインの 3 つの方法に対応し、CI とローカル環境の双方で利用可能です。
  • 厳格なゲート処理:リバースエンジニアリングに関する免責事項の同意や初期設定において強制的に対話を行い、暗黙的にデフォルト値を適用しません。
  • Article 抽出のフォールバック:埋め込みエンティティから取得できない場合でも、article id に基づいて個別に補完取得します。
  • 最適な用途: 個人のコンテンツアーカイブや素材収集に最適:長文スレッドや X Article を検索可能な Markdown に変換する用途(--download-media と組み合わせた完全なオフライン複製の作成)や、執筆前の素材ストック手順としての利用に適しています。
    不向きな用途: 企業のコンプライアンス要件がある環境や、メインアカウントでの高頻度な利用には不向きです。公式サポートや安定した SLA が求められる大規模な一括収集(単一 URL を入力とする仕様であり、バッチ処理には非対応)には適していません。また、ローカルマシンに Cookie、同意ファイル、アーカイブファイルを残したくない環境にも適していません。
    Install Agent-Ready
    ① Verified Mirror 2026-10-10
    Option A · Direct DownloadDownload canghe-danger-x-to-markdown.tar.gz
    sha256: f839fffff58e69c9…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit dd0bf35595.