baoyu-danger-x-to-markdown について
Xの投稿、スレッド、記事を、YAML front matter付きのMarkdownに変換するスキルです。メディアのローカル保存に対応し、リバースエンジニアリングされたX APIの利用前に同意を求めます。
主な機能
- 01投稿とスレッドのMarkdown変換
- 02X Articleの全文抽出
- 03YAML front matterでのメタデータ保存
- 04画像と動画の任意ダウンロード
- 05出力先とメディア設定の指定
活用シーン
- 01XのスレッドをMarkdownファイルに保存
- 02メタデータ付きX Articleのアーカイブ
- 03投稿メディアのローカルフォルダー保存
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jimliu/ baoyu-skills --skill baoyu-danger-x-to-markdownインストール後、Claude Code で/baoyu-danger-x-to-markdownを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/config/first-time-setup.mdscripts/bun.lockconstants.tscookie-file.tscookies.tsgraphql.tshttp.tsmain.tsmarkdown.test.tsmarkdown.tsmedia-localizer.tspackage.jsonpaths.tsreferenced-tweets.tsthread-markdown.tsthread.tstweet-article.tstweet-to-markdown.tstypes.ts詳細
X から Markdown へ
X のコンテンツを Markdown に変換します:
- ツイート/スレッド → YAML フロントマター付きの Markdown
- X の記事 → 全文を抽出
ユーザー入力ツール
このスキルがユーザーに質問する場合は、次の優先順位でツールを選択してください。
- 組み込みのユーザー入力ツールを優先します。現在のエージェントランタイムが提供する
AskUserQuestion、request_user_input、clarify、ask_userなど、または同等のツールを使用します。 - 代替手段:該当するツールがない場合は、番号付きのプレーンテキストメッセージを出力し、各質問について選択した番号または回答を返信するようユーザーに依頼します。
- まとめて質問:1 回の呼び出しで複数の質問に対応できる場合は、該当する質問をすべてまとめて呼び出します。質問が 1 つずつしかできない場合は、優先順位に沿って順番に質問します。
以下の AskUserQuestion の例は参考です。他のランタイムでは、ローカル環境に対応する同等のものを使用してください。
スクリプトディレクトリ
スクリプトは scripts/ サブディレクトリにあります。
パスの解決方法:
{baseDir}= この SKILL.md があるディレクトリ- スクリプトのパス =
{baseDir}/scripts/main.ts ${BUN_X}ランタイムを解決します:bunがインストールされている場合はbun、npxが利用できる場合はnpx -y bun、それ以外の場合は bun のインストールを提案します
同意の要件
変換を行う前に、同意を確認して取得してください。
同意のフロー
ステップ 1:同意ファイルを確認します
# macOS
cat ~/Library/Application\ Support/baoyu-skills/x-to-markdown/consent.json
# Linux
cat ~/.local/share/baoyu-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)
優先順位に従って EXTEND.md を確認します。最初に見つかったものを使用します。
| 優先順位 | パス | スコープ |
|---|---|---|
| 1 | .baoyu-skills/baoyu-danger-x-to-markdown/EXTEND.md | プロジェクト |
| 2 | ${XDG_CONFIG_HOME:-$HOME/.config}/baoyu-skills/baoyu-danger-x-to-markdown/EXTEND.md | XDG |
| 3 | $HOME/.baoyu-skills/baoyu-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 — ヘッダー:「保存先」、質問:「設定をどこに保存しますか?」
- 「ユーザー(推奨)」— ~/.baoyu-skills/(すべてのプロジェクト)
- 「プロジェクト」— .baoyu-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
- スキルのデフォルト値
使い方
${BUN_X} {baseDir}/scripts/main.ts <url>
${BUN_X} {baseDir}/scripts/main.ts <url> -o output.md
${BUN_X} {baseDir}/scripts/main.ts <url> --download-media
${BUN_X} {baseDir}/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}/{content-slug}.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を使用します:- ヘッダー:"Media"、質問:"N images/videos to local files?"
- "Yes" — ローカルディレクトリにダウンロードします
- "No" — リモート URL をそのまま使用します
- ユーザーが確認した場合 →
--download-mediaを付けてスクリプトを再度実行します(Markdown をローカルパスに書き換えます)
認証
- 環境変数(推奨):
X_AUTH_TOKEN、X_CT0 - Chrome ログイン(代替手段):Chrome を自動で開き、Cookie をローカルにキャッシュします
拡張機能のサポート
EXTEND.md でカスタム設定が可能です。パスとサポートされているオプションについては、設定セクションを参照してください。