Communitygithub.com

soia-pkm-clip-x

Un skill pour capturer les tweets, threads et articles X dans votre coffre Obsidian, avec synchronisation des messages Telegram sauvegardés. Fonctionne avec Claude Code, Codex et Cursor.

Qu'est-ce que soia-pkm-clip-x ?

Ce skill d'agent permet d'archiver facilement le contenu précieux de X (Twitter) directement dans un coffre Obsidian, en produisant des fichiers Markown structurés avec frontmatter, métadonnées complètes et résumés automatiques. Il s'appuie sur l'API gratuite fxtwitter (sans clé ni authentification) pour récupérer les données des tweets, threads et articles X, puis les enregistre sous forme de notes Obsidian organisées par date, auteur et titre. Le skill gère la déduplication (vérifie si l'URL est déjà archivée), le déroulement des threads, l'extraction des articles longs (content.blocks), et la classification de la langue (zh, en, ja, ko). Après l'archivage, l'agent ajoute automatiquement un résumé en chinois, des topics et des liens vers les personnes mentionnées ; pour les contenus non chinois, une traduction complète est générée de manière idiomatique (pas littérale). Deux modes de synchronisation Telegram sont disponibles : l'export JSON (recommandé, sans risque) via Telegram Desktop, et l'API MTProto (avancé, avec des précautions pour la Chine). Le skill est compatible avec Claude Code, Codex, Cursor, et ne nécessite que Python 3 sans dépendances tierces pour l'archivage simple (seulement telethon pour la synchro MTProto).

Compatible avec✓Claude Code✓Codex CLI✓Cursor
npx skills add soia-team/soia-open-skills

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait soia-pkm-clip-x ?

Capturez le contenu de valeur sur X et versez-le dans votre coffre Obsidian pour construire des connaissances réutilisables.

Positionnement

L'interface native de X n'est pas adaptée à une relecture à long terme : les threads se perdent dans la timeline, la mise en page des articles est confuse, les liens se brisent et la recherche est faible. Ce skill permet d'archiver en un clic le meilleur contenu long de X dans Obsidian :

  • déroulement complet des threads
  • extraction intégrale du content.blocks des X Articles
  • métadonnées complètes (auteur, métriques, liens directs média, created_at)
  • frontmatter et liens bidirectionnels vers les topics, pour une agrégation facile via MOC
  • détection multilingue (zh / en / ja / ko)

Prérequis

  • Un coffre Obsidian (structure libre)

  • Python 3, avec stdlib uniquement (aucune dépendance tierce pour un tweet simple)

  • Optionnel : pip install telethon (uniquement pour la synchro MTProto)

  • Définir les variables d'environnement :

    export OBSIDIAN_VAULT=~/Documents/MonCoffre
    # Optionnel : sous-répertoire d'archivage (par défaut "Articles")
    export OBSIDIAN_ARTICLES="Articles"
    # Optionnel : langue des titres de section, par défaut zh (chinois), mettre en pour titres en anglais
    export X_ARCHIVE_LANG=zh
    

API principale : fxtwitter

Remplacez x.com par api.fxtwitter.com dans l'URL X, et faites un GET pour obtenir du JSON. Pas de clé d'API X, pas de connexion, zéro coût.

Champ cléUsage
tweet.text / tweet.raw_text.textCorps du tweet
tweet.article.titleTitre de l'article X
tweet.article.content.blocks[]Blocs de texte long de l'article
tweet.replying_to_statusTweet précédent (remontée de thread)
tweet.quoteTweet cité
tweet.media[]Médias (liens directs image/vidéo)
tweet.created_timestampTimestamp UNIX
tweet.views / likes / bookmarks / retweetsMétriques

Fallback : si fxtwitter échoue → endpoint public cdn.syndication.twimg.com.

Mots déclencheurs

Ce que dit l'utilisateurAction
« Archive ce X : URL » / « archive this : URL »archive_x.py <URL>. Pour les contenus non chinois, une traduction complète est ajoutée automatiquement (voir étape 4 du workflow ci-dessous), sans avoir à demander « traduis ».
« Déroule ce thread : URL »Idem, forcer la remontée du thread
« Synchronise mes messages Telegram sauvegardés » + chemin JSONsync_telegram_export.py <path> --dry-run pour prévisualiser, puis exécution après confirmation
« Synchronise Telegram via API » (si déjà configuré)sync_telegram_saved.py

Workflow (archivage par défaut)

  1. Analyser l'URL → handle + status_id
  2. Lancer le script archive_x.py <URL>
  3. Le script vérifie si l'URL existe déjà dans le coffre (via le champ url: du frontmatter)
    • Déjà présent → affiche SKIP, sortie
    • Sinon → récupère fxtwitter, écrit dans le coffre
  4. L'IA ajoute ensuite :
    • 1 phrase de résumé en chinois sous ## 摘要
    • 1 à 3 liens bidirectionnels topics + people
    • Contenu non chinois (quand language n'est pas zh) : traduire intégralement le texte en chinois sous la section ## 中文译文, sans que l'utilisateur ait à demander « traduis ». Exiger une traduction idiomatique, pas littérale — le résultat doit sembler écrit par un humain, sans aura de traduction automatique ; les noms propres, noms de produits, code/commandes/paramètres d'API restent en anglais, seuls les textes narratifs et explicatifs sont traduits.
  5. La section « Mon avis » reste toujours vide, à la main de l'utilisateur

Synchronisation Telegram : deux méthodes

A. Export JSON (recommandé, zéro risque)

Telegram Desktop
  → Paramètres → Avancé → Exporter les données Telegram
  → Cocher « Discussions privées » + choisir le format JSON
  → Obtenir le fichier result.json
python3 sync_telegram_export.py <result.json> --dry-run   # Voir la liste
python3 sync_telegram_export.py <result.json>             # Exécuter

Déduplication automatique par URL, ignore les contenus déjà archivés. Une exportation par mois suffit pour une synchronisation incrémentale.

B. API MTProto (avancé, à utiliser avec prudence en Chine)

Nécessite :

  • Aller sur https://my.telegram.org/auth pour obtenir api_id / api_hash
  • Lancer generate_telegram_session.py pour obtenir la session_string
  • Une IP résidentielle (les utilisateurs en Chine continentale doivent utiliser une IP résidentielle HK/JP ; les IP de datacenter déclenchent obligatoirement une ERREUR)

⚠️ Les utilisateurs chinois privilégient la méthode A. Créer une application sur my.telegram.org depuis la Chine continentale déclenche presque à coup sûr le filtrage IP, et les tentatives répétées peuvent geler le compte pendant 24 à 72 heures.

Nommage des fichiers

<YYYY-MM-DD>-X-<handle>-<50 premiers caractères du titre>.md

Exemples :

  • 2026-05-24-X-cyrilXBT-Comment-Organiser-Votre-Coffre-Obsidian.md
  • 2026-05-29-X-ObsidianOtaku-保存版AIエージェントのためのObsidian活用術.md

Pour plusieurs entrées du même auteur le même jour → ajouter -<6 derniers caractères du status_id> à la fin.

Frontmatter de sortie

---
tags: [文章摘抄]
source: X
url: https://x.com/<handle>/status/<id>
author: <Nom affiché>
handle: "@<handle>"
published_at: AAAA-MM-JJ HH:mm
captured_at: AAAA-MM-JJ HH:mm
language: zh / en / ja / ko
type: tweet / thread / article
topics: ["[[xxx]]", ...]   # Rempli par l'IA
people: ["[[xxx]]", ...]   # Rempli par l'IA
media: [...] / 0
content_complete: true
metrics:
  views: N
  likes: N
  bookmarks: N
---

Limites et exceptions

ScénarioTraitement
fxtwitter retourne 404Tweet supprimé/privé → suggérer archive.org
fxtwitter 5xxRéessayer 1 fois, fallback sur l'endpoint syndication
URL non x.com / twitter.comRefus, suggérer un Web Clipper
Texte du tweet vide, pas d'article, pas de médiaAvertir : « Simple retweet / simple réponse, peut-être sans contenu propre »
Nom de fichier en conflit (même auteur, même jour)Ajouter -<6 derniers caractères du status_id> en fin
Vidéo médiaNoter le lien mp4 dans le frontmatter media[], sans intégration

Référence en ligne de commande

# Archiver un tweet simple
python3 archive_x.py <URL>
python3 archive_x.py <URL> --force                  # Écraser un archivage existant
python3 archive_x.py <URL> --vault /chemin/vers/coffre   # Surcharger la variable d'environnement

# Synchronisation export JSON Telegram
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

# Synchro MTProto (nécessite configuration préalable)
python3 generate_telegram_session.py    # Une fois
python3 sync_telegram_saved.py --dry-run
python3 sync_telegram_saved.py --days 30
python3 sync_telegram_saved.py --all

Skills associés