Objectif produit
Resell Radar est un système de veille automatisée sur les annonces publiques de seconde main. Il détecte des opportunités d'achat/revente sur des articles de mode, les score selon plusieurs critères métier, filtre les articles suspects et alerte en temps réel via Telegram.
- Surveiller en continu les annonces publiques de plusieurs plateformes (Vinted, Leboncoin)
- Calculer un score d'opportunité métier (marge, état, marque, liquidité)
- Détecter les risques de contrefaçon avant achat
- Alerter uniquement sur les deals à fort potentiel
- Générer des messages de négociation personnalisés via LLM
Architecture fonctionnelle
Le pipeline s'exécute automatiquement via APScheduler selon une fréquence configurable.
Pipeline complet — scraping → scoring → alertes Telegram
Collecte les annonces avec Playwright headless. Pipeline idempotent — annonces déjà en base ignorées.
Normalise les données brutes vers un format uniforme avant scoring.
Récupère le prix moyen marché via l'API eBay pour calculer la marge réelle.
Orchestre automatiquement l'enchaînement des agents avec fréquence configurable.
Scrapers multi-sources
Architecture généralisée : chaque plateforme implémente une stratégie indépendante (pattern Strategy), paramétrable par marque et volume.
Pipeline sans authentification : uniquement des pages et annonces publiques accessibles sans login. Aucun contournement de mesures de protection.
- Playwright (navigation headless) — pour les plateformes sans API publique
- Collecte contrôlée — volumes limités et intervalles configurés
- Idempotent — déduplication par plateforme + identifiant externe, aucun doublon
- Généralisable — nouvelle plateforme = nouvelle stratégie, pipeline central inchangé
Scoring métier (0 – 100)
Score calculé par algorithme custom, sans LLM. Chaque critère contribue à un total de 0 à 100.
| Critère | Poids | Barème |
|---|---|---|
| Marge | 40 pts | Écart prix annoncé / prix marché eBay |
| État | 20 pts | Neuf (20), TBE (15), BE (8), Correct (0) |
| Marque | 10 pts | Ultra-premium (10), Premium (6), Autre (0) |
| Liquidité | 20 pts | Taille standard = liquide = score max |
| Photos | 10 pts | 6+ photos (10), 1+ (5), aucune (0) |
Barème visuel
Seuils d'action
- Score ≥ 70 — 🔥 Excellent : alerte Telegram + affichage dashboard
- Score ≥ 50 — ✅ Bon : affichage dashboard uniquement
- Score < 30 — ignoré
Agent authenticité — anti-contrefaçon
Un agent spécialisé évalue le risque de contrefaçon avant toute alerte. Une annonce avec un score d'authenticité en dessous du seuil est exclue des alertes Telegram même si son score d'opportunité est excellent.
Signaux analysés
- Mots-clés suspects dans titre/description (
replica,inspired,sans facture…) - Écart de prix anormal par rapport au marché (trop bas = signal suspect)
- Absence de photos ou photos génériques
- Mots rassurants en facteur positif (
facture,boutique,étiquette présente…)
| Score authenticité | Statut | Action |
|---|---|---|
| 80 – 100 | ✅ Probablement authentique | Alerte normale si score opp. OK |
| 50 – 79 | ⚠️ Vérifier avant achat | Alerte avec flag ⚠️ |
| 20 – 49 | 🚨 Suspect — risque élevé | Bloqué de l'alerte Telegram |
| 0 – 19 | 🚫 Probablement contrefait | Bloqué + flag rouge dashboard |
Agent négociation — Mistral mistral-small
Après identification d'une opportunité, l'agent LLM génère un message de négociation personnalisé, prêt à envoyer au vendeur.
Logique de prix proposé
- Marge > 50% → proposer −20% du prix vendeur
- Marge 30–50% → proposer −15%
- Marge < 30% → proposer −10%
- Arrondi "humain" (ex : 47 € plutôt que 50 €) pour éviter l'apparence automatisée
Comportement du LLM
- Message court, naturel et non agressif
- Adapte le ton à la plateforme (Vinted vs Leboncoin)
- Ne mentionne pas le prix marché ni la logique de revente
- Repli automatique sur un template statique si Mistral est indisponible
Négociation assistée uniquement : le message est généré, pas envoyé automatiquement. La décision reste humaine.
Alertes Telegram
Chaque deal qualifié déclenche une alerte structurée. Condition : score ≥ seuil_telegram ET score_authenticite ≥ seuil_auth.
| Champ de l'alerte | Exemple |
|---|---|
| Marque + titre | Nike Air Force 1 — Taille 42 |
| Prix annoncé / Prix marché | 45 € / 90 € |
| État | Très Bon État |
| Score opportunité | 82 / 100 |
| Score authenticité | 88 / 100 |
| Lien annonce | → vinted.fr/items/... |
Résultat mesuré : ~7 alertes Telegram par cycle de 15 min sur le périmètre configuré.
Dashboard Streamlit
Interface locale pour visualiser et analyser les annonces collectées.
- Filtres par score, plateforme, marque, état
- Détail du score d'opportunité et d'authenticité par annonce
- Accès aux messages de négociation générés
- Historique et suivi des deals dans le temps
Le dashboard Streamlit est local — pas encore déployé publiquement. Accès : streamlit run dashboard/app.py → http://localhost:8501.
Base de données — SQLite via SQLAlchemy
Chaque annonce est stockée une seule fois (déduplication par plateforme + identifiant externe). Les scores et flags sont persistés. Architecture légère adaptée à un usage local.
- SQLite — fichier local, aucune infrastructure requise
- SQLAlchemy ORM — migrations automatiques au premier run
- Déduplication —
(platform, external_id)comme clé unique - Historique complet — scores, flags, messages de négociation persistés
Ce que ce projet démontre
- Architecture multi-agents Python avec séparation claire des responsabilités
- Algorithme de scoring métier custom — transparent, explicable, sans LLM
- Intégration LLM (Mistral) pour génération contextuelle avec fallback robuste
- Détection de contrefaçons par analyse de signaux faibles
- Orchestration automatique via APScheduler
- Scrapers généralisables par plateforme (pattern Strategy)
- Pipeline idempotent et résilient (pas de doublons, fallback sans LLM)
Limites & posture éthique
Posture : Resell Radar opère uniquement sur des annonces publiques accessibles sans authentification. Collecte contrôlée : volumes limités, intervalles configurés, aucun contournement de mesures de protection. Objectif : veille et aide à la décision — pas automatisation de l'achat ou de l'envoi de messages.
Limites actuelles
- Pas encore de métriques produit publiques (volume traité, taux d'alertes, ROI)
- Négociation assistée uniquement — message généré, pas envoyé automatiquement
- Prix marché eBay peut ne pas refléter exactement le marché français
- Dashboard Streamlit local, pas encore déployé