canghe-danger-x-to-markdown について
Xの投稿、スレッド、ArticlesをYAMLフロントマター付きMarkdownに変換するスキルです。メディアの任意ダウンロードに対応し、リバースエンジニアリングされたX APIを使うため、変換前に同意が必要です。
主な機能
- 01投稿とスレッドのMarkdown変換
- 02X Articlesの本文抽出
- 03画像・動画の任意ダウンロード
- 04JSON出力とパス指定
- 05リバースエンジニアリングAPIの同意フロー
活用シーン
- 01XスレッドのMarkdownアーカイブ
- 02X Articlesの参照用保存
- 03投稿メディアとMarkdownの同時保存
- 04メディア取得と出力先の設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ freestylefly/ canghe-skills --skill canghe-danger-x-to-markdownインストール後、Claude Code で/canghe-danger-x-to-markdownを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/config/first-time-setup.mdscripts/constants.tscookie-file.tscookies.tsgraphql.tshttp.tsmain.tsmarkdown.tsmedia-localizer.tspaths.tsthread-markdown.tsthread.tstweet-article.tstweet-to-markdown.tstypes.ts詳細
X から Markdown へ
X のコンテンツを Markdown に変換します:
- ツイート/スレッド → YAML フロントマター付きの Markdown
- X Articles → コンテンツ全体を抽出
スクリプトディレクトリ
スクリプトは scripts/ サブディレクトリにあります。
パスの解決:
SKILL_DIR= この SKILL.md があるディレクトリ- スクリプトのパス =
${SKILL_DIR}/scripts/main.ts
同意の要件
変換の前に必ず、同意を確認して取得してください。
同意のフロー
ステップ 1:同意ファイルを確認
# macOS
cat ~/Library/Application\ Support/canghe-skills/x-to-markdown/consent.json
# Linux
cat ~/.local/share/canghe-skills/x-to-markdown/consent.json
ステップ 2:accepted: true かつ disclaimerVersion: "1.0" の場合 → 警告を表示して続行します:
Warning: Using reverse-engineered X API. Accepted on: <acceptedAt>
ステップ 3:ファイルがない場合、またはバージョンが一致しない場合 → 免責事項を表示します:
DISCLAIMER
This tool uses a reverse-engineered X API, NOT official.
Risks:
- May break if X changes API
- No guarantees or support
- Possible account restrictions
- Use at your own risk
Accept terms and continue?
選択肢に「はい、同意します」|「いいえ、同意しません」を指定して AskUserQuestion を使用します。
ステップ 4:同意した場合 → 同意ファイルを作成します:
{
"version": 1,
"accepted": true,
"acceptedAt": "<ISO timestamp>",
"disclaimerVersion": "1.0"
}
ステップ 5:同意しない場合 → 「User declined. Exiting.」を出力して終了します。
環境設定(EXTEND.md)
Bash を使用して EXTEND.md の有無を確認します(優先順位順):
# Check project-level first
test -f .canghe-skills/canghe-danger-x-to-markdown/EXTEND.md && echo "project"
# Then user-level (cross-platform: $HOME works on macOS/Linux/WSL)
test -f "$HOME/.canghe-skills/canghe-danger-x-to-markdown/EXTEND.md" && echo "user"
┌────────────────────────────────────────────────────────────┬───────────────────┐ │ パス │ 場所 │ ├────────────────────────────────────────────────────────────┼───────────────────┤ │ .canghe-skills/canghe-danger-x-to-markdown/EXTEND.md │ プロジェクトディレクトリ │ ├────────────────────────────────────────────────────────────┼───────────────────┤ │ $HOME/.canghe-skills/canghe-danger-x-to-markdown/EXTEND.md │ ユーザーホーム │ └────────────────────────────────────────────────────────────┴───────────────────┘
┌───────────┬───────────────────────────────────────────────────────────────────────────┐ │ 結果 │ アクション │ ├───────────┼───────────────────────────────────────────────────────────────────────────┤ │ 見つかった │ 設定を読み込み、解析して適用します │ ├───────────┼───────────────────────────────────────────────────────────────────────────┤ │ 見つからない │ 必ず初回セットアップを実行します(以下を参照)。デフォルト設定を黙って作成してはいけません │ └───────────┴───────────────────────────────────────────────────────────────────────────┘
EXTEND.md で設定できる項目:メディアのデフォルトのダウンロード設定 | デフォルトの出力ディレクトリ
初回セットアップ(ブロッキング)
重要:EXTEND.md が見つからない場合、EXTEND.md を作成する前に、ユーザーに設定を尋ねるため必ず AskUserQuestion を使用してください。尋ねずにデフォルト設定で EXTEND.md を作成することは絶対にしないでください。これはブロッキング操作です。セットアップが完了するまで、変換を続行してはいけません。
すべての質問を 1 回の呼び出しで AskUserQuestion に渡します。
質問 1 — ヘッダー:「メディア」、質問:「ツイート内の画像や動画をどのように扱いますか?」
- 「毎回確認する(推奨)」— Markdown の保存後に、メディアをダウンロードするか確認します
- 「常にダウンロードする」— メディアをローカルの imgs/ および videos/ ディレクトリに常にダウンロードします
- 「ダウンロードしない」— Markdown 内の元のリモート URL を保持します
質問 2 — ヘッダー:「出力」、質問:「デフォルトの出力ディレクトリはどこですか?」
- 「x-to-markdown(推奨)」— ./x-to-markdown/{username}/{tweet-id}.md に保存します
- (ユーザーは「その他」を選択してカスタムパスを入力できます)
質問 3 — ヘッダー:「保存」、質問:「設定をどこに保存しますか?」
- 「ユーザー(推奨)」— ~/.canghe-skills/(すべてのプロジェクト)
- 「プロジェクト」— .canghe-skills/(このプロジェクトのみ)
ユーザーの回答後、選択した場所に EXTEND.md を作成し、「設定を [path] に保存しました」と確認してから続行します。
詳細なリファレンス:references/config/first-time-setup.md
対応するキー
| キー | デフォルト | 値 | 説明 |
|---|---|---|---|
download_media | ask | ask / 1 / 0 | ask = 毎回確認、1 = 常にダウンロード、0 = ダウンロードしない |
default_output_dir | 空 | パスまたは空 | デフォルトの出力ディレクトリ(空 = ./x-to-markdown/) |
値の優先順位:
- CLI 引数(
--download-media、-o) - EXTEND.md
- スキルのデフォルト設定
使用方法
npx -y bun ${SKILL_DIR}/scripts/main.ts <url>
npx -y bun ${SKILL_DIR}/scripts/main.ts <url> -o output.md
npx -y bun ${SKILL_DIR}/scripts/main.ts <url> --download-media
npx -y bun ${SKILL_DIR}/scripts/main.ts <url> --json
オプション
| オプション | 説明 |
|---|---|
<url> | ツイートまたは記事の URL |
-o <path> | 出力先のパス |
--json | JSON 出力 |
--download-media | 画像・動画のアセットをローカルの imgs/ と videos/ にダウンロードし、Markdown のリンクをローカルの相対パスに書き換えます |
--login | Cookie のみを更新します |
対応 URL
https://x.com/<user>/status/<id>https://twitter.com/<user>/status/<id>https://x.com/i/article/<id>
出力
---
url: "https://x.com/user/status/123"
author: "Name (@user)"
tweetCount: 3
coverImage: "https://pbs.twimg.com/media/example.jpg"
---
Content...
ファイル構造:x-to-markdown/{username}/{tweet-id}.md
--download-media が有効な場合:
- 画像は Markdown ファイルと同じ場所の
imgs/に保存されます - 動画は Markdown ファイルと同じ場所の
videos/に保存されます - Markdown のメディアリンクはローカルの相対パスに書き換えられます
メディアのダウンロードワークフロー
EXTEND.md の download_media 設定に基づきます:
| 設定 | 動作 |
|---|---|
1(常に) | --download-media フラグを付けてスクリプトを実行します |
0(しない) | --download-media フラグを付けずにスクリプトを実行します |
ask(デフォルト) | 以下の毎回確認するフローに従います |
毎回確認するフロー
--download-mediaを付けずにスクリプトを実行 → Markdown を保存- 保存した Markdown にリモートメディア URL(画像・動画リンク内の
https://)があるか確認 - リモートメディアが見つからない場合 → 完了。確認は不要です
- リモートメディアが見つかった場合 →
AskUserQuestionを使用します:- header: "Media"、question: "Download N images/videos to local files?"
- "Yes" — ローカルディレクトリにダウンロードします
- "No" — リモート URL のままにします
- ユーザーが確認した場合 →
--download-mediaを付けてスクリプトを再度実行します(ローカルパスに置き換えたリンクで Markdown を上書きします)
認証
- 環境変数(推奨):
X_AUTH_TOKEN、X_CT0 - Chrome ログイン(フォールバック):Chrome を自動的に開き、Cookie をローカルにキャッシュします
拡張機能のサポート
EXTEND.md でカスタム設定を行えます。パスと対応オプションについては設定のセクションを参照してください。