SPB Git forge

spb/auto-ka

Public
61commits 1branches 0releases
14.4 MBsize
maindefault branch
12 days agolast push
Python 61.6% TypeScript 20.9% CSS 11.4% JavaScript 5.1% HTML 1.1%
ZIP tar.gz
NameLast commitUpdated
autoka [ka4] fix connecteur cargurus: retry des erreurs réseau Scrapfly dans... 12 days ago
data [ka4] fix connecteur baiecomeautoyota: migration magnetis-dealer → D2C... 15 days ago
docs [ka4] fix connecteur cargurus: retry des erreurs réseau Scrapfly dans... 12 days ago
frontend feat(fiche): refonte premium mobile-first de la fiche véhicule... 19 days ago
scripts Vague 3 : grands portails — AutoTrader.ca/AutoHebdo, Otogo.ca,... 1 mo ago
.gitignore README : métriques à jour (15 970 véhicules, 124 sources) + ignore WAL... 1 mo ago
README.md docs: README ultra détaillé + visite guidée en 10 captures 28 days ago
requirements.txt Page /stats refaite : tableau de bord analytique Groupe KA + rapport... 1 mo ago
run.py Auto-Ka — agrégateur de voitures usagées du Québec 1 mo ago
README.md source

Auto·Ka — Les voitures usagées du Québec

Auto·Ka

Les voitures usagées du Québec

Site Documentation PDF Nœud Port PM2

Véhicules Sources actives Concessionnaires Rappels Doublons VIN masqués Régions

Python FastAPI React Vite SQLite PM2 ngrok Groupe KA spbgit

Les pastilles de la deuxième rangée sont dynamiques : elles interrogent /api/stats en direct.

Auto-Ka est un agrégateur indépendant de véhicules usagés couvrant la province de Québec. Chercher une auto usagée, c'est normalement ouvrir des dizaines de sites de concessionnaires — chacun avec sa navigation, ses filtres, son format. Auto-Ka retourne le problème : un connecteur dédié par commerce visite chaque site à la source (aucune plateforme d'annonces revendue), normalise chaque véhicule vers un schéma unique et détecte les changements en continu.

Les sites de concessionnaires n'offrent pas de webhooks ; Auto-Ka en reproduit l'équivalent : synchronisation périodique + hash de contenu → arrivages, baisses de prix et ventes détectés automatiquement. Un véhicule qui disparaît du site source est marqué vendu — et sa page renvoie alors un vrai 410 Gone aux moteurs de recherche. Au 2026-08-28, le parc compte 46 687 véhicules (dont 624 motos et 28 scooters) provenant de 138 concessionnaires (129 sources livrant actuellement, sur un registre de 143 sources) répartis dans les 18 régions du Québec — prix moyen ≈ 30 001 $, ≈ 89 626 km, année moyenne ≈ 2020 — avec 16 969 rappels de sécurité croisés et 12 445 doublons VIN masqués.

# Visite guidée

Le tour du site en production en 10 captures — 2026-08-28, www.auto-ka.com (desktop, DA v3 « magazine automobile »).

Accueil
1 · Accueil — masthead encre, hero éditorial, recherche unifiée sur tout le parc (46 687 véhicules) et filtres pupitre
Motos
2 · Motos — verticale dédiée (kind=moto, 624 motos) : mêmes filtres, mêmes fiches, onglet propre
Scooters
3 · Scooters — troisième verticale du moteur (kind=scooter), alimentée par les 13 concessionnaires moto
Statistiques
4 · Statistiques — tableau de bord du marché de l'occasion : gros chiffres tabulaires, distributions de prix, répartitions par région/marque/carrosserie, rapports PDF
Sources
5 · Sources — le registre en toute transparence : 143 sources, fraîcheur de synchronisation et volume par concessionnaire/portail
Contact
6 · Contact — page contact commune Groupe KA (retraits de sources, signalements, partenariats)
Page marque Acura
7 · Page marque (/usagees/acura) — SEO programmatique : une page SSR par marque, title/meta uniques, JSON-LD, inventaire filtré
Page région Abitibi-Témiscamingue
8 · Page région (/region/abitibi-temiscamingue) — l'inventaire d'une des 18 régions administratives du Québec
Page ville Acton Vale
9 · Page ville (/ville/acton-vale) — maillage local : chaque ville desservie a sa page (géolocalisation data/villes_gps.json)
Page carrosserie berline
10 · Page carrosserie (/carrosserie/berline) — navigation par type de carrosserie normalisé (berline, VUS, camionnette…)

# Parcours mobile & desktop (DA v3, 2026-08-25)

Mobile 390×844 · desktop 1440×900.

# Mobile

Accueil mobile
Accueil — masthead encre, KA Tabbar
Résultats mobile
Résultats — barre compacte + bottom sheet de filtres
Fiche mobile
Fiche véhicule v2 — badge marché

# Desktop

Accueil desktop
Accueil — hero éditorial, filtres pupitre sans boîte
Résultats desktop
Résultats — cartes sans cadre, spec-line mono
Fiche véhicule
Fiche v2 — prix vs marché, caractéristiques, KA Score
Analyse marché
Fiche v2 — analyse marché, fiche VIN (NHTSA), historique de prix
Stats
Statistiques — 46 600+ véhicules, gros chiffres tabulaires

# Nouveautés front-end (2026-08-25)

  • DA v3 « magazine automobile » — masthead encre, hero éditorial, filtres pupitre sans boîte, cartes véhicules sans cadre (spec-line mono), fiche à filets.
  • Fiche véhicule v2 — analyse marché (nuage de points prix/km), KA Score composite, fiche VIN décodée (NHTSA), rappels, lightbox photos.
  • Refonte UX des filtres — barre compacte (« N véhicules · Trier · Filtres »), bottom sheet mobile / tiroir desktop, sliders min-max prix/année/km, chips actifs supprimables, CTA sticky avec compteur en direct.
  • KA Tabbar v1 — barre de navigation mobile commune Groupe KA.
  • Widget ka-agent v4 — cartes de véhicules cliquables et choix en boutons.

🗄️ Les captures d'époque sont conservées dans docs/archive/.

# Fonctionnalités

  • Recherche unifiée — filtres marque / modèle / année / prix / km / carburant / motricité / carrosserie / région / ville / concessionnaire, facettes dynamiques et tris multiples.
  • Fiches véhicule complètes — galerie photos, caractéristiques standardisées, VIN, équipements, historique de prix, véhicules similaires toutes sources confondues, et lien direct vers l'annonce originale du concessionnaire, toujours.
  • Trois verticales, un moteur — le champ kind (auto / moto / scooter) traverse tout le pipeline ; motos et scooters ont leurs onglets dédiés.
  • Suivi des baisses de prix — le diff engine (upsert par hash de contenu) détecte nouveau / modifié / vendu, avec délai de grâce et détection de dérive.
  • Rappels de sécurité — croisement avec les rappels constructeurs (autoka/recalls.py), 16 969 rappels référencés (au 2026-08-28).
  • Déduplication par VIN — les annonces multi-sites d'un même véhicule sont détectées et masquées (autoka/dedup.py).
  • Statistiques du marché en direct — tuiles de synthèse, distributions de prix, répartitions par région / marque / carrosserie, et rapports PDF personnalisés (stats v3 : catalogue, rendu au choix, ReportBuilder — autoka/pdfgen.py, kapdf.py).
  • SEO programmatique massif — rendu serveur complet (autoka/seo.py) : title/meta uniques, canonical, Open Graph, hreflang fr-CA, JSON-LD Car/Motorcycle + Offer + BreadcrumbList, pages programmatiques (/usagees/{marque}, /region/…, /ville/…, /carrosserie/…, /motos/…), sitemaps dynamiques avec lastmod réels, vendu → 410, inconnu → 404.
  • Compte KA ID — SSO « Se connecter avec KA ID » via le hub groupe-ka.com : même compte partout, page profil, favoris « Mon univers Ka » centralisés.
  • Connecteurs auto-découvrants — ajouter un concessionnaire = une sous-classe de BaseConnector (~6 lignes) déposée dans autoka/connectors/ (familles D2C Media, SM360, AMVOQ/AutoUsagee, EvalAuto, Convertus, PowerGo, HGrégoire…).
  • Fidélité — aucun prix inventé : si la source n'affiche pas de prix, price = null (« Prix sur demande ») ; politesse de crawl (délai entre requêtes, backoff, User-Agent identifié).

# Démarrage rapide

bash
ssh M4M64b && cd ~/auto-ka                      # source de vérité : le nœud (aucune copie laptop)

# Backend
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python run.py sync                     # synchroniser toutes les sources
.venv/bin/python run.py sync desmeules kijiji    # ...ou seulement certaines (id du registre data/sources.json)
.venv/bin/python run.py serve 8080               # API + frontend + SSR en local

# Frontend (build servi ensuite par FastAPI)
cd frontend && npm install && npm run build && cd ..
cd frontend && npm run dev                       # ...ou serveur de dev Vite

# Boucle de synchronisation continue (ce que fait PM2 en prod)
.venv/bin/python run.py watch 120                # re-parcourt les sources, cycle ≈ 2 h

run.py est le seul point d'entrée : sync [source ...] · watch [minutes] (défaut 120) · serve [port] (défaut 8080).

# Variables d'environnement

Noms seulement — les valeurs vivent dans .env sur le nœud (jamais versionnées).

Variable Rôle
AUTOKA_BASE_URL URL publique canonique (SEO, sitemaps, SSO)
SESSION_SECRET Secret de session (cookies signés)
KA_SSO_SECRET · KA_HUB_URL SSO KA ID via le hub groupe-ka.com
FIRECRAWL_API_KEY · SCRAPFLY_API_KEY Escalade anti-bot des connecteurs (_resilient.py)
AUTOKA_MAX_PAGES · AUTOKA_MAX_DETAILS Bornes générales de crawl (optionnelles)
AUTOKA_AUTOTRADER_MAX · AUTOKA_CARGURUS_MAX · AUTOKA_OTOGO_MAX · AUTOKA_AUTOUSAGEE_MAX Bornes par portail (optionnelles)

# Architecture

Composant Technologie Rôle
Backend Python 3.14 · FastAPI · Uvicorn API /api/*, rendu serveur SEO, service du frontend (autoka/web.py, autoka/seo.py)
Base de données SQLite (data/autoka.db) Diff engine : hash de contenu, historique de prix, cycle de vie des annonces, rappels, dédup VIN
Connecteurs requests · BeautifulSoup · Firecrawl/Scrapfly (sites derrière anti-bot) 1 adaptateur par plateforme de concessionnaires, 1 sous-classe par commerce
Frontend React 18 · Vite · TypeScript Design « éditorial sharp », accent orange racing — filtres, fiches, stats (build → frontend/dist/)
PDF reportlab · fpdf2 Rapports « Le marché de l'occasion » personnalisables

# Processus PM2

Processus Commande de démarrage Rôle
auto-ka-web pm2 start .venv/bin/python --name auto-ka-web -- run.py serve 8095 Sert l'API /api/*, le frontend buildé et le rendu serveur SEO — le seul processus exposé (via ngrok)
auto-ka-sync pm2 start .venv/bin/python --name auto-ka-sync -- run.py watch 120 Watcher de resynchronisation : reparcourt les sources actives en boucle, cycle complet ≈ 2 h, alimente le diff engine
auto-ka-ngrok pm2 start ~/bin/ngrok --name auto-ka-ngrok -- http --url=www.auto-ka.com 8095 Tunnel public vers le domaine www.auto-ka.com

# API principale

Méthode Endpoint Rôle
GET /api/vehicles Recherche paginée : filtres marque/modèle/année/prix/km/carburant/motricité/carrosserie/région/ville/concessionnaire + tris
GET /api/vehicles/{uid} Fiche complète d'un véhicule (photos, VIN, équipements, historique de prix, similaires)
GET /api/vehicles/{uid}/recalls Rappels de sécurité croisés pour ce véhicule
GET /api/facets Facettes dynamiques (compteurs par marque, région, carrosserie…) pour les filtres
GET /api/dealers · /api/sources Registre des concessionnaires / état des sources
GET /api/stats Tuiles de synthèse JSON (total, sources, régions, prix/km/année moyens, rappels, doublons VIN, répartitions) — alimente les pastilles dynamiques ci-dessus
GET /api/stats/dashboard · /api/stats/detailed Tableau de bord analytique (distributions, ajouts, fraîcheur, fenêtre ?syncs_since_h pour la supervision api-ka)
GET /api/stats/catalog · /api/stats/report · /api/stats/rapport.pdf Catalogue stats v3 + rapports PDF
POST /api/stats/report/custom Rapport PDF personnalisé (ReportBuilder)
POST /api/sync Déclencher une synchronisation
GET /ka/login · /ka/callback · /me · POST /logout SSO KA ID (hub groupe-ka.com)

S'y ajoutent les routes SSR SEO (/vehicule/{uid}/{slug}, /usagees/{marque}[/{modèle}], /region/…, /ville/…, /carrosserie/…, /motos/…, /scooters/…, sitemaps, robots.txt) et les pages /stats, /sources, /doc, /contact, /profil.

# Connecteurs et sources

31 modules dans autoka/connectors/ (+ socle base.py / _resilient.py) couvrent le registre data/sources.json : 143 sources au 2026-08-28 — 142 actives, 1 en pause (albioccasion, rate-limit 429, connecteur prêt) — soit 138 concessionnaires géolocalisés et 129 sources livrant actuellement des véhicules. Un module = soit un commerce, soit une famille de plateforme dont chaque concessionnaire est une sous-classe (~6 lignes).

Type Modules (nombre de sources couvertes)
Familles multi-concessionnaires d2c_dealers (D2C Media, 65), sm360_dealers (SM360, 15), moto_dealers (motos/scooters, 13), central_dealers (AMVOQ theme_central, 9), gatsby_dealers (EvalAuto/autoroot, 6), magnetis_dealers (SyncAuto, 5), vvu_dealers (4), convertus_fc (Convertus, 3)
Regroupements & bannières (1 source chacun) autousagee (AMVOQ/AutoUsagée), hgregoire, automobileendirect, leprixdugros, megacentre, clubautozone
Portails & inventaires (1 source chacun) autotrader, cargurus, kijiji, otogo, okaze, classeauto, ototr
Commerces individuels (1 source chacun) desmeules, dupontford, stefoychrysler, montjolichrysler, albioccasion, occasionbeaucage, occasioncharlevoix, jlkauto, yannicklaberge, autodurocher

Infrastructure commune : base.py (classe BaseConnector, normalisation, politesse de crawl) et _resilient.py (retries/backoff, escalade anti-bot Oxylabs → Scrapfly → Bright Data). La documentation générée des connecteurs vit dans docs/ (scripts/gen_connector_docs.py).

# Diff engine & déduplication VIN

  1. Chaque annonce normalisée reçoit un hash de contenu ; l'upsert dans SQLite classe le véhicule nouveau / modifié / inchangé.
  2. Tout changement de prix est journalisé → l'historique de prix affiché sur la fiche.
  3. Une annonce absente du site source est marquée vendue après un délai de grâce (tolère les ratés de crawl), avec détection de dérive pour éviter les faux positifs quand une source change de structure ; sa page publique renvoie alors 410 Gone.
  4. La déduplication par VIN (autoka/dedup.py) détecte le même véhicule annoncé sur plusieurs sites et masque les doublons (12 445 masqués au 2026-08-28) — le VIN sert aussi au croisement des rappels (autoka/recalls.py).

# Données & conformité

  • Provenance — chaque véhicule est lu directement sur le site du concessionnaire (ou du portail), jamais via une plateforme d'annonces revendue ; le lien vers l'annonce originale est toujours affiché sur la fiche.
  • Cadence — le watcher auto-ka-sync reparcourt les sources actives en continu, cycle complet ≈ 2 heures ; chaque passage est horodaté (fraîcheur visible sur /sources et via ?syncs_since_h).
  • Fidélité — aucun prix inventé (price = null → « Prix sur demande »), aucun champ deviné ; un véhicule disparu de la source est marqué vendu, jamais falsifié.
  • Politesse de crawl — délai entre requêtes, retries avec backoff, User-Agent identifié ; l'escalade anti-bot (_resilient.py) n'est utilisée que là où le site le rend nécessaire.
  • Avertissement — Auto-Ka est un index indépendant, sans affiliation avec les concessionnaires référencés ; les prix et disponibilités sont indicatifs et font foi chez le commerçant. Les rappels proviennent des données publiques de Transports Canada.

# Structure du repo

Répertoire / fichier Rôle
run.py Point d'entrée CLI : sync · watch · serve
requirements.txt Dépendances backend (FastAPI, uvicorn, requests, bs4, reportlab, fpdf2, pillow)
autoka/ Backend Python : schéma, normalisation, ingestion, db, web, seo, auth KA ID, favoris, stats, PDF, rappels, dédup + connectors/
frontend/ SPA React 18 + Vite + TypeScript (build servi par FastAPI) — inclut la page /doc (frontend/public/doc/)
data/ autoka.db (SQLite), sources.json (registre des 143 sources), villes_gps.json
docs/ Visite guidée (screenshots/ — 10 captures 2026-08-28 + parcours mobile/desktop), archives (archive/) et documentation générée des connecteurs (connecteurs/)
scripts/ Outillage (gen_connector_docs.py)

# Documentation

  • Guide d'utilisation en ligne : www.auto-ka.com/doc — visite guidée pas à pas (accueil, recherche, fiche, historique de prix) avec captures d'écran.
  • Guide PDF téléchargeable : auto-ka-documentation.pdf.
  • Le guide est aussi lié depuis le pied de page du site ; ses captures vivent dans frontend/public/doc/img/.

# Historique

Date Commit Jalon
2026-08-12 f840db2 Naissance d'Auto-Ka — agrégateur de voitures usagées du Québec
2026-08-12 a41549d Verticales motos et scooters : onglets dédiés + 13 concessionnaires
2026-08-18 bbc070b Vague 2 : dédup VIN inter-sources, Kijiji particuliers, rappels Transports Canada
2026-08-18 4a7b276 Vague 3 : grands portails — AutoTrader.ca/AutoHebdo, Otogo.ca, CarGurus.ca
2026-08-23 19b54a5 Connecteur AutoUsagee.ca (portail AMVOQ) : +11 924 annonces (367 marchands, 157 villes)
2026-08-23 dab7d55 Stats v3 : rapports PDF personnalisés (catalogue, ReportBuilder)
2026-08-24 c1f8843 Page documentation /doc (guide + captures) + PDF téléchargeable
2026-08-26 4243c4b→b32324e KA ID v2 : recommandations personnalisées (modèle collaboratif ALS, pilules « Sauvegarder cette recherche » / « Pas pour moi »)
2026-08-27 4937c46 Gardien ka4 : migration du connecteur groupepaquin D2C Media → SyncAuto (magnetis_dealers) après refonte du site source

# Développement (remote-first)

La source de vérité est le repo git sur le nœud M4M64b (~/auto-ka) — il n'existe aucune copie laptop. Toute modification se fait sur le nœud via SSH ; le remote origin = spbgit (git perso https://git.spboucher.ai), via l'alias SSH gitsrv configuré sur le nœud → gitsrv:srv/git/auto-ka.git (bare repos hébergés sur M3U96a). Pas GitHub.

bash
ssh M4M64b
cd ~/auto-ka

# Backend
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python run.py sync            # synchroniser toutes les sources (ou : run.py sync <source_id>)
.venv/bin/python run.py serve 8080      # servir en local

# Frontend
cd frontend && npm install && npm run build && cd ..

# Après un changement en production
pm2 restart auto-ka-web                 # (ou auto-ka-sync selon le changement)

# Versionner depuis le nœud (agent forwarding actif)
git add <fichiers> && git commit -m "..." && git push origin main

# Déploiement

  • Nœud : M4M64b (Mac Studio, cluster MacLustr) — répertoire ~/auto-ka
  • Port local : 8095
  • Processus PM2 : auto-ka-web (API + frontend + SSR), auto-ka-sync (watcher de synchronisation, cycle ≈ 2 h), auto-ka-ngrok (tunnel)
  • Exposition publique : tunnel ngrok → https://www.auto-ka.com

Philosophie d'exploitation : on ne pousse que le code — le serveur maintient ses données lui-même.

# Écosystème Groupe KA

Plateforme Rôle
groupe-ka.com Portail
lou-ka.com Logements à louer
immo-ka.com Propriétés à vendre
vrai-prix.com Estimation immobilière
auto-ka.com Véhicules
fabri-ka.com Produits québécois
food-ka.com Épicerie / alimentation
resto-ka.com Restaurants
sorti-ka.com Sorties et événements
job-ka.com Emplois
crea-ka.com Créateurs
trouve-ka.com Petites annonces
api-ka.com API de données

# Contact

Simon-Pierre Boucher — fondateur, Groupe KA 📧 contact@spboucher.ai


© Groupe KA — Simon-Pierre Boucher · contact@spboucher.ai

Ce repo vit sur spbgit (git.spboucher.ai) — la source de vérité est le clone sur le nœud M4M64b.