Introduction | 15 minutes | Maîtrisez la collecte d'informations multiplateformes et doublez votre efficacité de recherche
TIP
last30days-Skill est actuellement le Skill de recherche IA le plus complet sur ClawHub, prenant en charge la recherche parallèle sur plus de 10 sources de signaux, avec dédoublonnage automatique, notation et génération de rapports factuels avec citations.
GitHub: mvanhorn/last30days-skill
Profil des lecteurs visés
- Développeurs ayant 1 à 5 ans d'expérience
- Professionnels ayant besoin de choisir des outils IA, d'effectuer une veille concurrentielle ou de suivre les tendances technologiques
- Utilisateurs ayant des bases en ligne de commande, familiers avec Claude Code ou Codex CLI
- Personnes souhaitant s'affranchir du processus fragmenté consistant à "scroller Reddit/HN pour trouver l'info"
Dépendances et environnement de base
| Dépendance | Description | Requis |
|---|---|---|
| Node.js 18+ | Environnement d'exécution du Skill | Oui |
| Python 3.10+ | Langage du script principal | Oui |
| ScrapeCreators API Key | Reddit/TikTok/Instagram 3-en-1 | Oui |
| Claude Code ou Codex CLI | Support d'exécution du Skill | Oui |
| X AUTH_TOKEN / CT0 | Authentification recherche X (optionnel) | Non |
| Bluesky App Password | Recherche Bluesky (optionnel) | Non |
| Polymarket Gamma API | Données du marché de prédiction (gratuit) | Non |
Arborescence complète du projet
last30days-skill/
├── SKILL.md # Fichier de définition du Skill (à déployer dans ~/.claude/skills/)
├── SPEC.md # Documentation complète des spécifications techniques
├── CLAUDE.md # Guide de développement Claude Code
├── scripts/
│ ├── last30days.py # Entrée principale Python (moteur de recherche)
│ ├── sync.sh # Script de synchronisation du déploiement
│ └── lib/
│ ├── __init__.py # Entrée du package (importations paresseuses)
│ ├── env.py # Chargement des variables d'environnement
│ ├── dates.py # Plages de dates et calcul de confiance
│ ├── cache.py # Cache avec TTL de 24h
│ ├── http.py # Client HTTP de la bibliothèque standard
│ ├── models.py # Sélection automatique du modèle OpenAI/xAI
│ ├── openai_reddit.py # Recherche Reddit (OpenAI Responses API)
│ ├── xai_x.py # Recherche X (xAI Responses API)
│ ├── reddit_enrich.py # Extraction de métriques approfondies Reddit
│ ├── hackernews.py # Hacker News (API gratuite Algolia)
│ ├── polymarket.py # Marché de prédiction Polymarket (Gamma API)
│ ├── bluesky.py # Recherche Bluesky/AT Protocol
│ ├── truthsocial.py # Recherche Truth Social
│ ├── normalize.py # Réponse brute → Schema normalisé
│ ├── score.py # Modèle de notation multi-signaux
│ ├── dedupe.py # Détection de doublons approximatifs
│ ├── render.py # Rendu des rapports Markdown / JSON
│ └── schema.py # Définition et validation des types
├── skills/last30days/
│ └── last30days.sh # Wrapper Shell (Entrée du Skill Claude Code)
└── fixtures/ # Données de test (fixtures)
Étape 1 : Installation et configuration de l'authentification
1.1 Installation via plugin Claude Code (Recommandé)
Si vous utilisez déjà Claude Code, installez-le directement avec les commandes de plugin :
/plugin marketplace add mvanhorn/last30days-skill
/plugin install last30days@last30days-skill
Ou utilisez l'outil officiel ClawHub :
clawhub install last30days-official
WARNING
La méthode par plugin nécessite que votre version de Claude Code supporte la commande /plugin. Vérifiez d'abord que claude --version >= 1.0.
1.2 Installation manuelle par Git Clone
Vous préférez ne pas utiliser de plugin ? Clonez directement le projet localement :
# Cloner dans le répertoire des skills de Claude Code
git clone https://github.com/mvanhorn/last30days-skill.git \
~/.claude/skills/last30days
# Accéder au répertoire pour vérifier les fichiers
cd ~/.claude/skills/last30days
ls -la scripts/
1.3 Configurer la clé API ScrapeCreators (Requis)
C'est le point d'entrée unifié pour Reddit, TikTok et Instagram. Une seule clé suffit pour tout :
- Visitez scrapecreators.com pour vous inscrire et obtenir une clé API.
- Créez le fichier de configuration :
mkdir -p ~/.config/last30days
cat > ~/.config/last30days/.env << 'EOF'
# REQUIS : Clé 3-en-1 pour Reddit + TikTok + Instagram
SCRAPECREATORS_API_KEY=sc_xxxxxxxxxxxxxxxxxxxx
# OPTIONNEL : OpenAI API (peut être omis après connexion Codex)
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx
EOF
chmod 600 ~/.config/last30days/.env # Protéger les fichiers sensibles
1.4 Configurer l'authentification optionnelle X / Bluesky
Recherche X (Méthode recommandée) :
# 1. Connectez-vous à x.com, ouvrez les DevTools (F12)
# 2. Application → Cookies → Copiez les valeurs de auth_token et ct0
# 3. Écrivez dans le fichier .env
cat >> ~/.config/last30days/.env << 'EOF'
# Authentification recherche X (via cookies)
AUTH_TOKEN=xxxxxxxxxxxxxxxxxxxx
CT0=xxxxxxxxxxxxxxxxxxxx
# Alternative X : xAI API (ne nécessite pas de cookies)
XAI_API_KEY=xai-xxxxxxxxxxxxxxxxxxxx
EOF
Recherche Bluesky :
# 1. Allez sur bsky.app/settings/app-passwords pour créer un mot de passe d'application
# 2. Écrivez dans le fichier .env
cat >> ~/.config/last30days/.env << 'EOF'
# Bluesky/AT Protocol
BSKY_HANDLE=votre-identifiant.bsky.social
BSKY_APP_PASSWORD=xxxx-xxxx-xxxx-xxxx
EOF
TIP
Les cookies X et le mot de passe Bluesky sont facultatifs. Si vous ne voulez pas vous compliquer la tâche, les sources gratuites Polymarket, Hacker News et Reddit suffisent pour la plupart des scénarios.
1.5 Vérifier l'installation
# Exécuter un test simple (l'option --mock utilise des données locales, n'utilise pas de quota API)
python3 ~/.claude/skills/last30days/scripts/last30days.py "Claude Code tips" --mock --emit=compact
Si vous voyez une sortie similaire, tout fonctionne correctement :
=== last30days Report: Claude Code tips ===
Sources: reddit, hackernews | Time: 2026-03-25 | Mode: mock
[results...]
Étape 2 : Utilisation de base
2.1 Commande /last30days
Dans Claude Code, tapez directement la commande :
/last30days best Claude Code prompts
Via Codex CLI :
python3 ~/.claude/skills/last30days/scripts/last30days.py "best Claude Code prompts" --emit=compact
TIP
Par défaut, l'outil recherche les contenus populaires des 30 derniers jours sur plus de 10 sources (Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, Bluesky, etc.). Une recherche prend généralement 2 à 8 minutes, un peu plus pour les sujets de niche.
2.2 Interprétation de la structure du rapport
Après exécution, vous recevrez un rapport structuré qui ressemble à ceci :
# last30days Report: best Claude Code prompts
## Sources Searched (6 active)
reddit | x | hackernews | polymarket | youtube | reddit_threads
## Top Findings
...
## Best Practices (Méthodes validées par la communauté)
...
## Prompt Pack (Copie directe possible)
...
## Recent Developments
...
## References (Avec liens vers les sources)
...
Le rapport effectue automatiquement :
- Détection de convergence : Les contenus mentionnés sur plusieurs plateformes reçoivent un poids plus important.
- Dédoublonnage : Les posts sémantiquement similaires ne conservent que la meilleure occurrence.
- Décroissance temporelle : Les contenus les plus récents sont mieux classés.
- Citations : Chaque conclusion est accompagnée de son lien d'origine.
2.3 Mode rapide --quick
Pressé ? Ajoutez --quick pour ignorer certaines recherches approfondies :
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"Cursor AI vs Windsurf" \
--quick \
--emit=compact
2.4 Fenêtre temporelle personnalisée --days=N
Pas seulement 30 jours, vous pouvez personnaliser la durée :
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"OpenClaw latest news" \
--days=7 \
--emit=compact
2.5 Forcer le rafraîchissement --refresh
Les résultats sont mis en cache pendant 24 heures. Pour relancer la recherche :
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"AI code editors comparison" \
--refresh \
--emit=compact
Étape 3 : Mécanisme de recherche parallèle multi-sources
3.1 Principe de la recherche Reddit
Reddit est la source de signaux la plus importante. Le Skill procède en deux étapes :
# scripts/lib/openai_reddit.py (version simplifiée)
def search_reddit(query: str, days: int = 30) -> list[dict]:
# Étape 1 : Découverte initiale via OpenAI Responses API + web_search
response = openai.responses.create(
model="gpt-4o",
input=f"Find active Reddit discussions about: {query}",
tools=[{"type": "web_search"}],
max_tokens=2000
)
# Étape 2 : Extraction du JSON brut des posts pour obtenir les scores réels d'upvotes/commentaires
enriched = reddit_enrich.fetch_threads(response.urls, days)
return enriched
TIP
Depuis la v2.9, Reddit utilise par défaut ScrapeCreators. Une seule clé couvre Reddit + TikTok + Instagram, offrant une meilleure stabilité que les solutions indépendantes précédentes.
3.2 Intégration Hacker News
Accès gratuit, sans aucune clé API nécessaire :
# scripts/lib/hackernews.py
def search_hackernews(query: str, days: int = 30) -> list[dict]:
# L'API Algolia de HN est ouverte et gratuite
url = "https://hn.algolia.com/api/v1/search"
params = {
"query": query,
"tags": "story",
"numericFilters": f"created_at_i>{cutoff_timestamp(days)}"
}
resp = requests.get(url, params=params)
items = resp.json()["hits"]
# Tri combiné par points + nombre de commentaires
return sorted(items, key=lambda x: x["points"] + x["num_comments"] * 2, reverse=True)
3.3 Données des marchés de prédiction Polymarket
C'est le point fort de last30days par rapport aux autres outils de recherche : il ne regarde pas seulement ce que "les gens disent", mais aussi ce que "les gens parient" :
# scripts/lib/polymarket.py
def search_polymarket(query: str) -> list[dict]:
# Accès gratuit via Gamma API
url = "https://gamma-api.polymarket.com/markets"
resp = requests.get(url, params={"topic": query, "limit": 20})
markets = resp.json()
# Modèle de notation à cinq facteurs
for m in markets:
m["composite_score"] = (
m["text_relevance"] * 0.30 +
m["volume_24h"] * 0.30 +
m["liquidity"] * 0.15 +
m["price_velocity"] * 0.15 +
m["outcome_competitiveness"] * 0.10
)
return sorted(markets, key=lambda x: x["composite_score"], reverse=True)
Effet concret : en cherchant "OpenClaw", vous verrez non seulement des posts Reddit, mais aussi des données de prédiction Polymarket sur le "nombre d'utilisateurs actifs mensuels d'OpenClaw". Les probabilités sur lesquelles les gens misent de l'argent réel sont souvent plus convaincantes que n'importe quel post.
3.4 Analyse du modèle de notation multi-signaux
Tous les résultats convergent vers un pipeline de notation unifié :
# scripts/lib/score.py
def compute_composite_score(item: dict, query: str, days: int) -> float:
# 1. Pertinence textuelle (similarité bidirectionnelle + extension par synonymes)
text_score = bidirectional_similarity(item["text"], query)
# 2. Normalisation de la popularité (engagement)
engagement_score = normalize_velocity(item["engagement"])
# 3. Pondération par autorité de la source (HN > Reddit > X > TikTok)
authority_score = SOURCE_WEIGHTS[item["source"]]
# 4. Bonus de convergence multiplateforme
convergence_score = detect_convergence(item, all_results)
# 5. Décroissance temporelle (0.98 exponentiel par jour)
recency_score = 0.98 ** days_since_post(item["timestamp"])
return (
text_score * 0.35 +
engagement_score * 0.25 +
authority_score * 0.20 +
convergence_score * 0.10 +
recency_score * 0.10
)
Le score lors des tests à l'aveugle est passé de 3,73/5,0 en v1 à 4,38/5,0 en v2.5, soit une amélioration d'environ 17%.
Étape 4 : Mode Comparatif (X vs Y)
4.1 Cas pratique : "Cursor vs Windsurf"
L'une des fonctionnalités les plus puissantes de last30days — comparer directement deux outils :
/last30days cursor vs windsurf
Ou via la ligne de commande :
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"cursor vs windsurf" \
--emit=compact
4.2 Mécanisme de recherche parallèle à trois voies
Le mode comparatif déclenche trois recherches indépendantes :
# scripts/lib/score.py (branche mode comparatif)
def run_comparative_mode(query_a: str, query_b: str, base_query: str):
# Recherche parallèle trois voies
results_a = run_research(query_a) # Voie 1 : Uniquement Cursor
results_b = run_research(query_b) # Voie 2 : Uniquement Windsurf
results_base = run_research(base_query) # Voie 3 : Discussions comparant les deux
# Génération du rapport de comparaison côte à côte
return render_comparison(results_a, results_b, results_base)
4.3 Lecture du rapport comparatif
Le format du rapport de sortie ressemble à ceci :
## Analyse Comparative : Cursor vs Windsurf
### Forces
| Dimension | Cursor | Windsurf |
|---|---|---|
| Vitesse autocomplétion | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| Compréhension contexte | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Édition multi-fichiers | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| Écosystème communauté | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
### Faiblesses
| Dimension | Cursor | Windsurf |
|---|---|---|
| Consommation RAM | Élevée | Moyenne |
| Support hors-ligne | Faible | Bon |
### Sentiment de la communauté (30 jours)
- Cursor : 78% positif (1 240 discussions)
- Windsurf : 65% positif (890 discussions)
### Verdict basé sur les données
Cursor domine en termes d'engagement communautaire et de qualité d'autocomplétion.
Windsurf excelle dans la compréhension contextuelle pour les refactorisations complexes.
**Recommandation** : Utilisez Cursor pour le code quotidien ; Windsurf pour la planification d'architecture.
Étape 5 : Intégration dans d'autres Skills / Pipelines CI
5.1 Injection comme contexte
D'autres Skills peuvent directement citer les résultats de recherche de last30days :
## Recent Research Context
!python3 ~/.claude/skills/last30days/scripts/last30days.py \
"votre sujet de recherche" \
--emit=context
5.2 Lire le contexte depuis un fichier
## Research Context
!cat ~/.local/share/last30days/out/last30days.context.md
5.3 Intégration JSON dans CI/CD
Injectez les résultats de recherche dans un pipeline automatisé :
# Sortie au format JSON pour utilisation par programme
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"best LLM for code review 2026" \
--emit=json > research.json
# Vérifier le Top 3 des modèles recommandés
python3 -c "
import json
data = json.load(open('research.json'))
for r in data['top_results'][:3]:
print(f\"- {r['title']} (score: {r['score']:.2f})\")
"
5.4 Surcharge .env au niveau du projet
Vous ne voulez pas de configuration globale ? Placez un fichier .claude/last30days.env à la racine de votre projet, il écrasera la configuration globale :
mkdir -p .claude
cat > .claude/last30days.env << 'EOF'
# Clés API spécifiques à ce projet
SCRAPECREATORS_API_KEY=sc_project_specific_key
OPENAI_API_KEY=sk-project-specific-key
EOF
TIP
C'est particulièrement utile pour le travail en équipe — chacun peut utiliser sa propre clé, tout en maintenant un comportement du Skill cohérent.
5.5 Vérification automatique au lancement de la session
La v2.9.5 a ajouté une vérification de configuration au lancement de la session. Chaque démarrage de Claude Code validera automatiquement si votre configuration .env est complète :
# Déclencher manuellement la vérification
python3 ~/.claude/skills/last30days/scripts/last30days.py \
--validate-config
En cas de clé manquante, une alerte claire s'affiche :
❌ SCRAPECREATORS_API_KEY is missing (required)
✅ OPENAI_API_KEY found
⚠️ BSKY_HANDLE is missing (optional)
Dépannage des problèmes courants
Q1 : Erreur indiquant que SCRAPECREATORS_API_KEY est manquante
Cause : Les variables d'environnement ne sont pas chargées correctement.
Solution :
# Vérifier que la clé existe
cat ~/.config/last30days/.env | grep SCRAPECREATORS_API_KEY
# Si installé via plugin, tentez une synchronisation manuelle
bash ~/.claude/skills/last30days/scripts/sync.sh
Q2 : La recherche X retourne toujours des résultats vides
Cause : Les cookies AUTH_TOKEN / CT0 ont expiré ou sont invalides.
Solution :
# 1. Reconnectez-vous à x.com
# 2. Copiez à nouveau les derniers auth_token et ct0
# 3. Mettez à jour le fichier .env
# Ou utilisez l'alternative xAI API (ne nécessite pas de cookies)
echo "XAI_API_KEY=xai-votre-cle" >> ~/.config/last30days/.env
Q3 : La recherche est très lente (plus de 10 minutes)
Cause : Par défaut, 10 sources sont interrogées en parallèle ; les sujets de niche nécessitent plus de tentatives API.
Solution :
# 1. Utilisez --quick pour ignorer la recherche profonde
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"niche topic" \
--quick
# 2. Vérifiez si une source est constamment en timeout
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"topic" \
--sources=reddit # Chercher uniquement sur Reddit pour déboguer
Q4 : Polymarket retourne des marchés non pertinents
Cause : La correspondance des sujets Polymarket est basée sur des mots-clés, certains sujets n'ont pas de marchés actifs.
Solution :
# Spécifier manuellement des extensions de mots-clés
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"AI coding assistant" \
--polymarket-tags="artificial intelligence,llm,gpt" \
--emit=compact
Q5 : Claude Code affiche Permission denied sur les scripts
Cause : Les scripts shell n'ont pas les droits d'exécution.
Solution :
chmod +x ~/.claude/skills/last30days/skills/last30days.sh
chmod +x ~/.claude/skills/last30days/scripts/last30days.py
Q6 : Trop peu de posts Reddit dans le rapport alors qu'il y en a beaucoup en ligne
Cause : Depuis la v2.9, l'outil passe par ScrapeCreators ; la clé est configurée mais le format est peut-être incorrect.
Solution :
# Vérifier si la clé ScrapeCreators est valide
curl -H "x-api-key: sc_votre_cle" \
https://api.scrapecreators.com/v1/reddit/search?q=test
# Si la clé est valide mais toujours pas de données, forcer l'usage de ScrapeCreators dans .env
echo "FORCE_SCRAPECREATORS=1" >> ~/.config/last30days/.env
Lectures complémentaires / Directions avancées
1. Ajustement fin du modèle de notation
Les poids dans scripts/lib/score.py sont écrits en dur. Si vous avez une préférence pour une source, vous pouvez modifier votre fork :
# Faire passer le poids d'autorité de Hacker News de 0.20 à 0.35
SOURCE_WEIGHTS = {
"hackernews": 0.35, # ↑ Modifié depuis 0.20
"reddit": 0.25,
"x": 0.15,
"polymarket": 0.15,
"youtube": 0.10,
}
2. Intégration de sources personnalisées
Vous voulez ajouter GitHub Issues ou LinkedIn ? Inspirez-vous de l'interface de hackernews.py, créez un nouveau module dans scripts/lib/, puis enregistrez-le dans last30days.py. Le fichier SPEC.md contient la définition complète de l'interface.
3. Automatisation de la veille périodique
Utilisez cron pour lancer des recherches régulières et mettre à jour votre base de connaissances :
# Lancer une veille "AI tools weekly" chaque matin à 8h
0 8 * * * python3 ~/.claude/skills/last30days/scripts/last30days.py \
"AI developer tools weekly" \
--days=7 \
--emit=md \
--output ~/Documents/Last30Days/ai-tools-weekly-$(date +\%Y-\%m-\%d).md
4. Liaison avec une base de connaissances
Injectez directement les résultats de recherche dans votre base de connaissances personnelle (pipeline RAG) :
# Générer un contexte avec citations pour un autre Skill
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"Claude Code advanced techniques" \
--emit=context > ~/.knowledge/last30_context.md
Ressources associées
- GitHub: mvanhorn/last30days-skill
- ClawHub: last30days-official
- ScrapeCreators API: scrapecreators.com
- Site officiel OpenClaw: openclaw.ai
- Hacker News Algolia API: hn.algolia.com/api
- Polymarket Gamma API: gamma-api.polymarket.com