Communitygithub.com

soia-team/soia-open-skills

エージェントによる日次ナレッジ管理スキル。X のツイート/スレッド/記事を Obsidian vault にアーカイブし、Telegram の保存メッセージとの同期も可能。Claude Code / Codex / Cursor で動作。

soia-open-skills とは?

soia-pkm-clip-x は、X(Twitter)上の価値あるコンテンツを Obsidian vault に取り込み、検索可能なナレッジ資産として蓄積するための AI エージェントスキルです。fxtwitter.com の公開 API を利用して、X API キーやログイン不要でツイート本文、スレッドの全展開、X Article の完全なブロックコンテンツ、メタデータ(作者、メトリクス、メディア直リンク、作成日時)を取得できます。取得したコンテンツは、frontmatter 付きのマークダウンファイルとして Obsidian vault に保存され、自動的に重複チェックを行います。さらに、Telegram の保存メッセージを JSON エクスポートまたは MTProto API 経由で同期し、URL ベースの重複排除も行います。日本語、英語、中国語、韓国語など複数言語に対応し、非中国語コンテンツには自動で意訳による中国語翻訳を追加します。Claude Code、Codex、Cursor などの主要な AI エージェントプラットフォームで動作します。

対応✓Claude Code✓Codex CLI✓Cursor
npx skills add soia-team/soia-open-skills

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

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.titleX Article のタイトル
tweet.article.content.blocks[]Article の長文ブロック
tweet.replying_to_status前のツイート(スレッド逆追跡)
tweet.quote引用ツイート
tweet.media[]メディア(画像/動画の直リンク)
tweet.created_timestampUNIX タイムスタンプ
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

ワークフロー(デフォルトのアーカイブ)

  1. URL を解析 → handle + status_id
  2. スクリプト archive_x.py <URL> を実行
  3. スクリプトが vault 内に既にアーカイブ済みかチェック(frontmatter の url: フィールドで判定)
    • 既に存在する場合 → SKIP を出力して終了
    • それ以外の場合 → fxtwitter から取得し、vault に書き込む
  4. AI が以下を補完:
    • 簡潔な中国語の ## 摘要
    • 1〜3 個の topics 双方向リンクと people 双方向リンク
    • 非中国語コンテンツ(language が zh 以外): デフォルトで ## 中文译文 セクションを完全な翻訳として補完。ユーザーが別途「翻訳」と言う必要はありません。意訳であり直訳ではないことが求められます——人間が書いたような自然な中国語であること、機械翻訳っぽくならないこと。固有名詞、製品名、コード/コマンド/API パラメータは英語原文のままにし、叙述的なテキストと説明のみを翻訳します。
  5. 「我的看法」セクションは常にユーザー記入用に空欄のまま

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.md
  • 2026-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

関連スキル