soia-pkm-clip-x
X 上の価値あるコンテンツを Obsidian vault に蓄積し、検索可能なナレッジ資産を構築します。
位置づけ
X のネイティブ UI は長期的な再確認には不向きです。スレッドはタイムラインに散在し、Article のレイアウトは乱れ、リンクは切れやすく、検索機能も貧弱です。このスキルは、X 上の優れた長文コンテンツをワンクリックで Obsidian に取り込みます。
- スレッドを完全に展開(unroll)
- X Article の全
content.blocksを取得 - メタデータを完備(作者、メトリクス、メディア直リンク、created_at)
- frontmatter にトピックの双方向リンクを設定し、MOC での集約を容易に
- 多言語対応(zh / en / ja / ko)
前提条件
-
Obsidian vault(任意の構造)
-
Python 3、標準ライブラリのみ(サードパーティ依存なし、単一ツイートのアーカイブ)
-
オプション:
pip install telethon(MTProto 同期のみに必要) -
環境変数の設定:
export OBSIDIAN_VAULT=~/Documents/MyVault # オプション: カスタムアーカイブサブディレクトリ(デフォルトは "Articles") export OBSIDIAN_ARTICLES="Articles" # オプション: セクション見出しの言語、デフォルトは zh(中国語)。en を設定すると英語の見出しになります export X_ARCHIVE_LANG=zh
コア API: fxtwitter
X の URL 内の x.com を api.fxtwitter.com に置き換え、GET リクエストで直接 JSON を取得します。X API キー、ログイン、コストは一切不要。
| キーフィールド | 用途 |
|---|---|
tweet.text / tweet.raw_text.text | ツイート本文 |
tweet.article.title | X Article のタイトル |
tweet.article.content.blocks[] | Article の長文ブロック |
tweet.replying_to_status | 前のツイート(スレッド逆追跡) |
tweet.quote | 引用ツイート |
tweet.media[] | メディア(画像/動画の直リンク) |
tweet.created_timestamp | UNIX タイムスタンプ |
tweet.views / likes / bookmarks / retweets | メトリクス |
フォールバック: fxtwitter が失敗した場合 → cdn.syndication.twimg.com の公開エンドポイント。
トリガー用語
| ユーザーの発言 | 呼び出すもの |
|---|---|
| 「この X をアーカイブ: URL」 / 「archive this: URL」 | archive_x.py <URL>、非中国語コンテンツの場合はデフォルトで自動翻訳が補完されます(以下のワークフローステップ 4 参照)。別途「翻訳」と言う必要はありません |
| 「このスレッドを整理: URL」 | 同上、スレッド逆追跡を強制 |
| 「Telegram のお気に入りを同期」 + JSON パス | sync_telegram_export.py <path> --dry-run でプレビュー、確認後に本実行 |
| 「API で Telegram を同期」(認証情報あり) | sync_telegram_saved.py |
ワークフロー(デフォルトのアーカイブ)
- URL を解析 → handle + status_id
- スクリプト
archive_x.py <URL>を実行 - スクリプトが vault 内に既にアーカイブ済みかチェック(frontmatter の
url:フィールドで判定)- 既に存在する場合 → SKIP を出力して終了
- それ以外の場合 → fxtwitter から取得し、vault に書き込む
- AI が以下を補完:
- 簡潔な中国語の
## 摘要 - 1〜3 個の
topics双方向リンクとpeople双方向リンク - 非中国語コンテンツ(
languageが zh 以外): デフォルトで## 中文译文セクションを完全な翻訳として補完。ユーザーが別途「翻訳」と言う必要はありません。意訳であり直訳ではないことが求められます——人間が書いたような自然な中国語であること、機械翻訳っぽくならないこと。固有名詞、製品名、コード/コマンド/API パラメータは英語原文のままにし、叙述的なテキストと説明のみを翻訳します。
- 簡潔な中国語の
- 「我的看法」セクションは常にユーザー記入用に空欄のまま
Telegram 同期の 2 つの方法
A. JSON エクスポート(推奨、リスクゼロ)
Telegram Desktop
→ 設定 → 詳細設定 → Telegram データのエクスポート
→ 「プライベートチャット」にチェック + JSON 形式を選択
→ result.json を取得
python3 sync_telegram_export.py <result.json> --dry-run # リストを確認
python3 sync_telegram_export.py <result.json> # 本実行
自動的に URL ベースで重複排除し、既にアーカイブ済みのものはスキップします。月に 1 回エクスポートすれば増分同期が可能です。
B. MTProto API(上級者向け、中国国内では注意)
必要なもの:
https://my.telegram.org/authで api_id / api_hash を申請generate_telegram_session.pyを実行して session_string を取得- 住居用 IP(中国本土のユーザーは HK/JP の住居用セグメントが必要。データセンター IP は必ず ERROR をトリガーします)
⚠️ 中国国内ユーザーは方法 A を優先してください。my.telegram.org でのアプリ作成は中国本土ではほぼ確実に IP のリスク管理に引っかかり、試行を繰り返すとアカウントレベルで 24〜72 時間の凍結が発生する可能性があります。
ファイル命名規則
<YYYY-MM-DD>-X-<handle>-<タイトル先頭50文字>.md
例:
2026-05-24-X-cyrilXBT-How-to-Organize-Your-Obsidian-Vault.md2026-05-29-X-ObsidianOtaku-保存版AIエージェントのためのObsidian活用術.md
同日・同著者の複数ツイートの場合 → 末尾に -<status_id の下6桁> を追加。
出力 frontmatter
---
tags: [文章摘抄]
source: X
url: https://x.com/<handle>/status/<id>
author: <表示名>
handle: "@<handle>"
published_at: YYYY-MM-DD HH:mm
captured_at: YYYY-MM-DD HH:mm
language: zh / en / ja / ko
type: tweet / thread / article
topics: ["[[xxx]]", ...] # AI が記入
people: ["[[xxx]]", ...] # AI が記入
media: [...] / 0
content_complete: true
metrics:
views: N
likes: N
bookmarks: N
---
境界条件と例外
| シナリオ | 処理 |
|---|---|
| fxtwitter が 404 を返す | ツイートが削除済み/非公開。archive.org での確認を推奨 |
| fxtwitter が 5xx を返す | 1 回リトライし、失敗した場合は syndication エンドポイントにフォールバック |
| URL が x.com / twitter.com 以外 | 拒否。Web Clipper の使用を推奨 |
| ツイート本文が空、かつ article も media もなし | 警告: 「純粋なリツイート/純粋な返信、独立したコンテンツがない可能性があります」 |
| 同日・同著者でファイル名が重複 | 末尾に -<status_id の下6桁> を追加 |
| 動画メディア | frontmatter media[] に mp4 直リンクを記録。埋め込みは行わない |
コマンドラインリファレンス
# 単一ツイートのアーカイブ
python3 archive_x.py <URL>
python3 archive_x.py <URL> --force # 既存のアーカイブを上書き
python3 archive_x.py <URL> --vault /path/to/vault # 環境変数を上書き
# Telegram JSON エクスポートの同期
python3 sync_telegram_export.py <result.json>
python3 sync_telegram_export.py <result.json> --dry-run
python3 sync_telegram_export.py <result.json> --since 2026-06-01
python3 sync_telegram_export.py <result.json> --limit 30
# MTProto 同期(事前セットアップが必要)
python3 generate_telegram_session.py # 初回のみ
python3 sync_telegram_saved.py --dry-run
python3 sync_telegram_saved.py --days 30
python3 sync_telegram_saved.py --all