obsidian-to-x について
Obsidian ユーザー向けの X 投稿スキルで、通常投稿、動画、引用投稿、長文記事を実際の Chrome ブラウザーから公開できます。アクティブなノートを検出し、Obsidian Markdown を X の形式に変換します。
主な機能
- 01テキスト、画像、動画、記事の投稿
- 02アクティブな Obsidian ファイルの取得
- 03Obsidian Markdown と画像記法の変換
- 04frontmatter に基づく記事・通常投稿の選択
- 05ブラウザーで確認してから手動投稿
活用シーン
- 01アクティブな Obsidian ノートを X Article として公開
- 02Markdown ノートを画像付きの通常投稿に変換
- 03動画投稿やコメント付き引用投稿の作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ libukai/ awesome-agent-skills --skill obsidian-to-xインストール後、Claude Code で/obsidian-to-xを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/articles.mdbrowser-automation-lessons.mdobsidian-conversion.mdobsidian-integration.mdregular-posts.mdtroubleshooting.mdscripts/bun.lockcheck-editor-content.tscheck-paste-permissions.tscopy-to-clipboard.tsinsert-code-blocks.tsmd-to-article.tsmd-to-post.tsobsidian-resolver.tspackage.jsonpaste-from-clipboard.tspublish-active.shtest-annotation-debug.tstest-code-insertion.tsx-article.tsx-post.tsx-quote.tsx-utils.tsx-video.ts詳細
X(Twitter)に投稿
実際の Chrome ブラウザーを介して、テキスト、画像、動画、長文記事を X に投稿します(ボット対策検出を回避します)。
デフォルトの動作(追加の指示がない場合)
ユーザーが公開する内容を指定せずにこのスキルを呼び出した場合(たとえば「X に投稿して」とだけ言う場合や、スラッシュコマンドを使う場合):
-
まず Chrome CDP プロセスをクリーンアップします(以下のCDP のクリーンアップを参照)
-
現在アクティブなファイルを取得します。次の優先順位で試します:
優先順位 1:
<current_note>タグ(Claudian が挿入。最も正確) ユーザーメッセージの末尾に<current_note>タグがあるか確認し、パスを直接抽出します。コマンドの実行は不要です。優先順位 2:workspace.json(ローカルのフォールバック)
jq -r '.lastOpenFiles[] | select(endswith(".md"))' .obsidian/workspace.json | head -1優先順位 3:Obsidian CLI(最後の手段)
obsidian file active -
Read ツールを使用してファイルの内容を読み取ります
-
投稿の種類を自動検出します:
- ファイルに
是否长文: trueを含むフロントマターがあるか確認します 是否长文: true→ X Articles(長文)として投稿します是否长文: false、是否长文がない、またはフロントマターがない → 通常の投稿(短文)として投稿します
- ファイルに
-
検出した種類をユーザーに伝え、投稿を進めます
-
適切なワークフローを実行します:
- X Articles の場合:
x-article.tsで投稿します(Obsidian からの変換を内部で処理します) - 通常の投稿の場合:
md-to-post.tsで変換し、x-post.tsで投稿します
- X Articles の場合:
-
Bash のバックグラウンドプロセスで投稿スクリプトを実行します(必須 — Agent の
run_in_background=trueは使用しないでください):- 必ず Bash の
&を使用し、ログを vault にリダイレクトします:bun ... > .temp/x-article-output.log 2>&1 & run_in_background=trueを指定して Agent ツールを使用しないでください — 出力ファイルが/private/tmp/に作成されますが、vault の権限フックによってブロックされるため、TaskOutput が失敗し、処理が重複して実行されます.temp/x-article-output.logをsleep N && cat .temp/x-article-output.log | tail -30で読み取り、進捗を確認します
- 必ず Bash の
-
成功の検出:
.temp/x-article-output.logで成功を示すマーカーを確認します:- 最適な方法:想定される画像数と一致する
Image upload verifiedの出現回数を数えます - 代替方法:
Post composed (preview mode)またはBrowser remains openを探します - X Articles の場合:
Article composedまたはBrowser remains openを探します - 進捗確認には
sleep 15 && cat .temp/x-article-output.log | tail -30を使用します - マーカーが検出されたら、タスクの完了を待たずにすぐ成功を報告します
- 最適な方法:想定される画像数と一致する
例:
User: "发到 X"
AI: ✓ Detected current file: Articles/news/my-article.md
✓ Found `是否文章: true` → Publishing as X Article
[proceeds with article publishing workflow]
CDP のクリーンアップ
「Chrome debug port not ready」エラーを防ぐため、投稿スクリプトを実行する前に毎回実行します。自動で行い、ユーザーに確認する必要はありません。
pkill -f "Chrome.*remote-debugging-port"; pkill -f "Chromium.*remote-debugging-port"; sleep 2
コンテンツの種類
X Articles と通常の投稿の比較:
| 機能 | X Articles | 通常の投稿 |
|---|---|---|
| コンテンツ | リッチテキスト(Markdown) | プレーンテキストのみ |
| 書式設定 | ✅ 太字、斜体、見出し、リスト | ❌ すべて削除 |
| コードブロック | ✅ 構文ハイライト | ❌ 非対応 |
| 画像 | ✅ 複数の画像 | ✅ 最大 4 枚 |
| 長さ | 長文(無制限) | 短文(280 文字) |
| 要件 | X Premium | 無料 |
| スクリプト | x-article.ts | x-post.ts |
| 変換 | md-to-article.ts | md-to-post.ts |
使用する場面:
- X Articles:ブログ記事、チュートリアル、コードを含む技術記事
- 通常の投稿:簡単な近況報告、お知らせ、テキストと画像だけの投稿
クイックスタート
現在アクティブな記事を公開したい Obsidian ユーザー向け:
bash ${SKILL_DIR}/scripts/publish-active.sh
これにより、次の処理が自動的に行われます:
- アクティブなファイルを検出します(workspace.json または Obsidian CLI 経由)
- Obsidian の構文を X 形式に変換します
- 内容を入力した状態で X Articles エディターを開きます
スクリプトディレクトリ
重要:すべてのスクリプトは、このスキルの scripts/ サブディレクトリにあります。
エージェントの実行手順:
- この SKILL.md ファイルのディレクトリパスを
SKILL_DIRとして特定します - スクリプトのパス =
${SKILL_DIR}/scripts/<script-name>.ts - このドキュメント内のすべての
${SKILL_DIR}を実際のパスに置き換えます ${BUN_X}のランタイムを解決します:bunがインストールされている場合はbun、npxが利用可能な場合はnpx -y bunを使用し、どちらも利用できない場合は bun のインストールを提案します
スクリプト一覧:
| スクリプト | 用途 |
|---|---|
| 投稿スクリプト | |
scripts/x-post.ts | 通常の投稿を公開(テキスト + 画像、最大 4 枚) |
scripts/x-video.ts | 動画付き投稿を公開(テキスト + 動画) |
scripts/x-quote.ts | コメント付きの引用ポストを公開 |
scripts/x-article.ts | X Articles を公開(リッチテキスト + 画像 + コード) |
| 変換スクリプト | |
scripts/md-to-post.ts | Obsidian Markdown をプレーンテキスト + 画像に変換(投稿用) |
scripts/md-to-article.ts | Obsidian Markdown を HTML + 画像に変換(Articles 用) |
| ユーティリティ | |
scripts/publish-active.sh | Obsidian でアクティブなファイルをワンコマンドで公開 |
前提条件
- Google Chrome または Chromium
bunランタイム- 初回実行時:X に手動でログインします(セッションは保存されます)
- Obsidian 連携の場合:
jqツール(macOS ではbrew install jq)
事前チェック(任意)
初回使用前に、環境チェックの実行を提案してください:
${BUN_X} ${SKILL_DIR}/scripts/check-paste-permissions.ts
チェック項目:Chrome、Bun、アクセシビリティ権限、クリップボード、貼り付けのキー操作。
いずれかのチェックに失敗した場合は、項目ごとに修正方法を案内してください:
| チェック項目 | 修正方法 |
|---|---|
| Chrome | Chrome をインストールするか、X_BROWSER_CHROME_PATH 環境変数を設定します |
| Bun ランタイム | brew install oven-sh/bun/bun(macOS)または npm install -g bun |
| アクセシビリティ(macOS) | システム設定 → プライバシーとセキュリティ → アクセシビリティ → ターミナルアプリを有効にします |
| 貼り付けのキー操作(Linux) | xdotool(X11)または ydotool(Wayland)をインストールします |
Obsidian 連携
Obsidian ユーザーは、このスキルを使って現在アクティブなファイルを自動検出し、Obsidian 固有の構文を変換できます。
簡単なワークフロー:
# One-command publish
bash ${SKILL_DIR}/scripts/publish-active.sh
手動のワークフロー:
# Step 1: Get active file (workspace.json method, 39x faster)
ACTIVE_FILE=$(jq -r '.lastOpenFiles[0]' .obsidian/workspace.json)
# Step 2: Publish (x-article.ts handles Obsidian conversion internally)
bun ${SKILL_DIR}/scripts/x-article.ts "$ACTIVE_FILE"
Obsidian 連携の詳細については、references/obsidian-integration.md を参照してください:
- アクティブなファイルの検出方法(workspace.json と CLI)
- パフォーマンスの比較(0.007 秒 対 0.274 秒)
- エラー処理とフォールバック戦略
Obsidian 構文の変換については、references/obsidian-conversion.md を参照してください:
![[]]画像構文の変換- 中国語の frontmatter フィールドの処理
- 手動での変換コマンド
通常の投稿
テキスト + 最大 4 枚の画像。プレーンテキストのみ(Markdown の書式はすべて削除されます)。
Obsidian Markdown からの投稿
ステップ 1:CDP のクリーンアップ(CDP のクリーンアップセクションを参照)
ステップ 2:Markdown をプレーンテキスト + 画像に変換
# Extract content from Markdown file
# Supports both standard Markdown  and Obsidian ![[path]] image syntax
# --output-dir keeps downloaded images inside the vault (.temp) to avoid permission issues
bun ${SKILL_DIR}/scripts/md-to-post.ts "Articles/my-post.md" --output-dir ".temp/x-post" > .temp/post-content.json
TEXT=$(jq -r '.text' .temp/post-content.json)
IMAGES=$(jq -r '.images[]' .temp/post-content.json)
対応する画像構文:
- ✅ 標準の Markdown:
 - ✅ Obsidian 構文:
![[path/to/image.png]] - ✅ ネットワーク URL:
または![[https://example.com/image.jpg]] - ローカルパスは絶対パスに変換されます
- ネットワーク上の画像は自動的に並列ダウンロードされます(逐次ダウンロードより 3~4 倍高速です)
ステップ 2.5:カバー画像を最初の画像として抽出
ファイルの frontmatter から 封面 プロパティを読み取り、存在する場合は、そのパスを最初の画像として使用します:
# 提取 封面 属性(支持 ![[path]] 和裸路径两种格式)
COVER_RAW=$(grep -m1 '^封面:' "Articles/my-post.md" | sed 's/^封面: *//' | tr -d '"')
# 解析 Obsidian wikilink 格式 ![[path]] → path
COVER_PATH=$(echo "$COVER_RAW" | sed 's/^!\[\[//;s/\]\]$//')
# 组合图片列表:封面优先,正文图片补充(总数上限 4 张)
IMAGE_ARGS=""
if [ -n "$COVER_PATH" ]; then
IMAGE_ARGS="--image \"$COVER_PATH\""
fi
for img in $IMAGES; do
IMAGE_ARGS="$IMAGE_ARGS --image \"$img\""
done
封面プロパティが空、または存在しない場合はスキップし、本文の画像のみを使用します- 画像の合計数は最大 4 枚です(x-post.ts の制限)。超過分は自動的に切り捨てられます
ステップ 3:投稿を公開
eval "${BUN_X} ${SKILL_DIR}/scripts/x-post.ts \"$TEXT\" $IMAGE_ARGS"
直接使用
${BUN_X} ${SKILL_DIR}/scripts/x-post.ts "Hello!" --image ./photo.png
パラメーター:
| パラメーター | 説明 |
|---|---|
<text> | 投稿内容(プレーンテキスト、位置引数) |
--image <path> | 画像ファイル(複数指定可能、最大4件) |
--profile <dir> | カスタム Chrome プロファイル |
コンテンツ処理:
- ✅ プレーンテキスト(すべての書式が削除されます)
- ✅ 画像(最大4件)
- ❌ リッチテキストの書式には対応していません
- ❌ コードブロックには対応していません
- ❌ HTML には対応していません
ブラウザーの動作:
- スクリプトがコンテンツを入力した状態でブラウザーを開きます
- ブラウザーは手動で確認できるよう、開いたままになります
- ユーザーは自分のペースで確認、編集、公開できます
- 作業が完了したら、ユーザーが手動でブラウザーを閉じます
--submitフラグを追加すると自動で公開します(2秒後に閉じます)
AI による成功検出(バックグラウンド実行の場合):
- タスクの完了を待たないでください(ブラウザーは無期限に開いたままになります)
- 最適な方法:出力内の
Image upload verifiedの数が想定される画像数と一致するか確認します - 代替方法:
Post composed (preview mode)またはBrowser remains openがあるか確認します - 短いタイムアウト(10~15秒)を設定してから、出力内容を確認します
- マーカーが検出されたら、すぐに成功を報告します
- ワークフローの例:
1. Know you're uploading 3 images 2. Wait 10-15s for uploads 3. Check output: grep "Image upload verified" | wc -l 4. If count == 3 → Report success immediately
動画投稿
テキストと動画ファイルを投稿します。
ステップ1:CDP のクリーンアップ(CDP Cleanup セクションを参照)
ステップ2:動画投稿を公開
${BUN_X} ${SKILL_DIR}/scripts/x-video.ts "Check this out!" --video ./clip.mp4
パラメーター:
| パラメーター | 説明 |
|---|---|
<text> | 投稿内容(位置引数) |
--video <path> | 動画ファイル(MP4、MOV、WebM) |
--profile <dir> | カスタム Chrome プロファイル |
制限:通常アカウントは最大140秒、Premium は最大60分です。処理時間:30~60秒。
引用ポスト
既存のツイートにコメントを添えて引用します。
ステップ1:CDP のクリーンアップ(CDP Cleanup セクションを参照)
ステップ2:引用ポストを公開
${BUN_X} ${SKILL_DIR}/scripts/x-quote.ts https://x.com/user/status/123 "Great insight!"
パラメーター:
| パラメーター | 説明 |
|---|---|
<tweet-url> | 引用する URL(位置引数) |
<comment> | コメントテキスト(位置引数、省略可能) |
--profile <dir> | カスタム Chrome プロファイル |
X Articles
長文の Markdown 記事(X Premium が必要です)。
ステップ1:CDP のクリーンアップ(CDP Cleanup セクションを参照)
ステップ2:記事を公開
${BUN_X} ${SKILL_DIR}/scripts/x-article.ts article.md
${BUN_X} ${SKILL_DIR}/scripts/x-article.ts article.md --cover ./cover.jpg
パラメーター:
| パラメーター | 説明 |
|---|---|
<markdown> | Markdown ファイル(位置引数) |
--cover <path> | カバー画像 |
--title <text> | タイトルを上書き |
フロントマター:YAML フロントマターでは、title / 标题、cover_image / 封面 / 配图 に対応しています。
タイトルの決定方法(X Articles の場合):
# 优先读 frontmatter 的 `标题` 属性,为空则 fallback 到文件名
TITLE=$(obsidian property:read name="标题" path="$NOTE_PATH" 2>/dev/null | tr -d '[:space:]')
if [ -z "$TITLE" ]; then
TITLE=$(basename "$NOTE_PATH" .md)
fi
# 传入脚本
${BUN_X} ${SKILL_DIR}/scripts/x-article.ts "$NOTE_PATH" --title "$TITLE"
注:スクリプトは記事を入力した状態でブラウザーを開きます。ユーザーが確認して手動で公開します。
コードブロックのサポート
Markdown 内のコードブロックは自動的に抽出され、X Articles のエディターに挿入されます。すべての言語(JavaScript、Python、TypeScript、Rust、Go、Shell など)に対応しています。手動での操作は不要です。
トラブルシューティング
よくある問題:
- Chrome のデバッグポートが準備できていない → まず CDP プロセスを必ずクリーンアップしてください(上記を参照)
- macOS のアクセシビリティ権限エラー → システム設定で有効にしてください
- コードブロックが挿入されない → 自動処理されます。コンソールでエラーを確認してください
- 画像の一時パスが Vault の外にある →
md-to-post.tsはデフォルトで画像をシステムの/tmpにダウンロードします。Vault 内に制限するフックによってブロックされる場合があります。解決策:画像を Vault 内に保存するため、常に--output-dir ".temp/x-post"を指定してください:bun ${SKILL_DIR}/scripts/md-to-post.ts "Articles/my-post.md" --output-dir ".temp/x-post"
詳しいトラブルシューティングについては、references/troubleshooting.md を参照してください。
参考資料
references/obsidian-integration.md- Obsidian ファイルの検出と統合references/obsidian-conversion.md- Obsidian の構文を標準 Markdown に変換references/regular-posts.md- 通常の投稿のワークフローとトラブルシューティングreferences/articles.md- X Articles の詳細ガイドreferences/troubleshooting.md- よくある問題と解決策references/browser-automation-lessons.md- ブラウザー自動化のパターンと学んだ教訓(CDP、DraftJS、バックグラウンドタブ)
拡張機能のサポート
EXTEND.md でカスタム設定を指定できます。以下のパスを優先順に確認します:
.libukai-skills/obsidian-to-x/EXTEND.md(プロジェクトディレクトリ)$HOME/.libukai-skills/obsidian-to-x/EXTEND.md(ユーザーホーム)
EXTEND.md がサポートするもの:デフォルトの Chrome プロファイル
注意事項
- 初回実行時は手動でのログインが必要です(セッションは保持されます)
- すべてのスクリプトはブラウザーにコンテンツを入力し、手動で確認できるよう開いたままにします
- (
--submitフラグを使用する場合を除き)ユーザーが手動で閉じるまでブラウザーは開いたままです - クロスプラットフォーム:macOS、Linux、Windows