Docs connecteurs : générateur rejouable + 46 fiches standardisées (41 nommées, 4 familles dynamiques, INDEX)
Croise data/sources.json + registres d agences + introspection du code + BD live (complétude GPS/photos/prix/CAC/SDB/année-rôle/taxes, sync_log). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
47 changed files +2,977 −0
added
docs/connecteurs/INDEX.md
+85 −0
@@ -0,0 +1,85 @@ | ||
| 1 | +# Immo-Ka — Connecteurs (documentation standardisée) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +**92 connecteurs** enregistrés (auto-découverte `immoka/connectors/__init__.py`) : 41 connecteurs nommés (`data/sources.json`) + 4 familles dynamiques (RE/MAX sous-agences, Via Capitale, Century 21, source.immo). | |
| 6 | + | |
| 7 | +Base vivante `data/immoka.db` : 138 468 annonces, 122 797 actives, 77 668 visibles après dédup (45 129 masquées). | |
| 8 | + | |
| 9 | +## Mécanismes transverses (tous connecteurs) | |
| 10 | + | |
| 11 | +- **Enrichissements détail budgétés** : chaque connecteur qui visite les pages | |
| 12 | + détail plafonne le nombre de fiches par exécution via une variable | |
| 13 | + d'environnement `IMMOKA_*_DETAIL_LIMIT` (défauts dans le tableau des fiches). | |
| 14 | + Les fiches déjà en cache BD (`detail_cache`) sont réutilisées gratuitement ; | |
| 15 | + sur plusieurs cycles, tout le parc finit enrichi. | |
| 16 | +- **Dédup Centris + adresse** (`immoka/db.py`) : les doublons inter-sources | |
| 17 | + (même n° Centris via les sous-agences, ou même adresse normalisée) sont | |
| 18 | + marqués `dup_hidden=1` — 45 129 annonces masquées actuellement — et la | |
| 19 | + lecture filtre en `AND dup_hidden=0`. | |
| 20 | +- **Jointure rôle d'évaluation** (`immoka/vraiprix_local.py`) : appariement | |
| 21 | + local FTS par adresse contre `data/vraiprix.db` (3,7 M unités d'évaluation). | |
| 22 | + Remplit lat/lng manquants, l'estimation Vrai-Prix (P10-P90 + lien) et les | |
| 23 | + champs du rôle (année de construction, superficies, évaluations). Impact : | |
| 24 | + **year_built rempli à 67 %** des annonces visibles, dont | |
| 25 | + 71 % proviennent du rôle (`year_built_source: role`). | |
| 26 | +- **Historique — vagues du 2026-08-18** : | |
| 27 | + - `7911d58` Vague 1 : clé Algolia auto-extraite (Barnes), taxes/éval RE/MAX | |
| 28 | + (cache détail v4), specs Via Capitale, Kijiji étendu. | |
| 29 | + - `e9bc9d7` Vague 2 : jointure au rôle d'évaluation, fiches | |
| 30 | + Sutton/Royal LePage/LesPAC enrichies, days_on_market, dédup par adresse. | |
| 31 | + | |
| 32 | +## Familles dynamiques | |
| 33 | + | |
| 34 | +| Famille | Fiche | Membres | Visibles | | |
| 35 | +|---|---|---|---| | |
| 36 | +| Famille RE/MAX sous-agences | [famille-remax-ag](famille-remax-ag.md) | 50 | 3 349 | | |
| 37 | +| Famille Via Capitale agences | [famille-via-ag](famille-via-ag.md) | 4 | 82 | | |
| 38 | +| Famille Century 21 | [famille-c21-ag](famille-c21-ag.md) | 2 | 1 576 | | |
| 39 | +| Famille source.immo | [famille-source-immo](famille-source-immo.md) | 6 | 1 877 | | |
| 40 | + | |
| 41 | +## Connecteurs nommés | |
| 42 | + | |
| 43 | +| id | Nom | Type | Statut | Visibles | Année (dont rôle) | Dernier sync | OK | | |
| 44 | +|---|---|---|---|---|---|---|---| | |
| 45 | +| [`remax_quebec`](remax_quebec.md) | RE/MAX Québec | franchise | actif | 25 348 | 77.0 % | 2026-08-18 01:45 | ✅ | | |
| 46 | +| [`duproprio`](duproprio.md) | DuProprio (sans courtier) | fsbo | actif | 7 393 | 79.3 % | 2026-08-18 02:37 | ✅ | | |
| 47 | +| [`kijiji`](kijiji.md) | Kijiji Québec | — | actif | 7 104 | 4.2 % | 2026-08-18 02:59 | ✅ | | |
| 48 | +| [`via_capitale`](via_capitale.md) | Via Capitale | franchise | actif | 5 153 | 68.9 % | 2026-08-18 00:27 | ✅ | | |
| 49 | +| [`sutton`](sutton.md) | Groupe Sutton Québec | franchise | actif | 4 515 | 65.4 % | 2026-08-18 02:17 | ✅ | | |
| 50 | +| [`lespac`](lespac.md) | LesPAC Québec | — | actif | 2 720 | 57.5 % | 2026-08-18 03:10 | ✅ | | |
| 51 | +| [`proprio_direct`](proprio_direct.md) | Proprio Direct | agence | actif | 2 464 | 67.5 % | 2026-08-18 03:14 | ✅ | | |
| 52 | +| [`c21_ag_quebec`](c21_ag_quebec.md) | Century 21 Québec (All Quebec) | — | actif | 1 576 | 75.6 % | 2026-08-18 02:35 | ✅ | | |
| 53 | +| [`domicilia`](domicilia.md) | Domicilia Agence Immobilière | agence | actif | 1 445 | 73.4 % | 2026-08-18 02:27 | ✅ | | |
| 54 | +| [`cio_ag_outaouais`](cio_ag_outaouais.md) | Chambre immobilière de l'Outaouais | portail | actif | 1 394 | 69.6 % | 2026-08-18 02:35 | ✅ | | |
| 55 | +| [`engel_volkers`](engel_volkers.md) | Engel & Völkers Montréal / Québec | luxe | actif | 1 228 | 69.9 % | 2026-08-18 02:37 | ✅ | | |
| 56 | +| [`ubee`](ubee.md) | Ubee | — | actif | 1 176 | 100.0 % | 2026-08-18 00:23 | ✅ | | |
| 57 | +| [`vendirect`](vendirect.md) | Vendirect | agence | actif | 1 170 | 79.4 % | 2026-08-18 00:23 | ✅ | | |
| 58 | +| [`royal_lepage`](royal_lepage.md) | Royal LePage (Québec) | franchise | actif | 1 009 | 85.7 % | 2026-08-18 02:20 | ✅ | | |
| 59 | +| [`exp_ag_qc`](exp_ag_qc.md) | eXp Agence immobilière (Québec) | agence | actif | 888 | 55.6 % | 2026-08-18 02:40 | ✅ | | |
| 60 | +| [`charisma_ag_qc`](charisma_ag_qc.md) | Les Immeubles Charisma | agence | actif | 696 | 81.2 % | 2026-08-18 02:37 | ✅ | | |
| 61 | +| [`kw_urbain`](kw_urbain.md) | Keller Williams Urbain | franchise | actif | 351 | 68.7 % | 2026-08-18 02:59 | ✅ | | |
| 62 | +| [`profusion`](profusion.md) | Profusion Immobilier (Christie's) | luxe | actif | 351 | 61.5 % | 2026-08-18 03:14 | ✅ | | |
| 63 | +| [`barnes_quebec`](barnes_quebec.md) | BARNES Québec | luxe | actif | 336 | 81.5 % | 2026-08-18 02:35 | ✅ | | |
| 64 | +| [`kw_prestige`](kw_prestige.md) | Keller Williams Prestige | franchise | actif | 277 | 0.0 % | 2026-08-18 02:59 | ✅ | | |
| 65 | +| [`si_ag_theagency`](si_ag_theagency.md) | The Agency Montréal | agence | actif | 245 | 88.6 % | 2026-08-18 02:27 | ✅ | | |
| 66 | +| [`glmc_ag_qc`](glmc_ag_qc.md) | Les Immeubles GLMC | agence | actif | 176 | 36.4 % | 2026-08-18 02:40 | ✅ | | |
| 67 | +| [`kw_distinction`](kw_distinction.md) | Keller Williams Distinction | franchise | actif | 167 | 0.0 % | 2026-08-18 02:59 | ✅ | | |
| 68 | +| [`imcha_ag_qc`](imcha_ag_qc.md) | Les Immeubles Charlevoix | agence | actif | 107 | 0.0 % | 2026-08-18 02:40 | ✅ | | |
| 69 | +| [`immodev`](immodev.md) | Immodev Agence Immobilière | agence | actif | 92 | 64.1 % | 2026-08-18 02:27 | ✅ | | |
| 70 | +| [`bhhs_ag_qc`](bhhs_ag_qc.md) | Berkshire Hathaway HomeServices Québec | franchise | actif | 91 | 86.8 % | 2026-08-18 02:35 | ✅ | | |
| 71 | +| [`realta`](realta.md) | Réalta Agence Immobilière | agence | actif | 82 | 80.5 % | 2026-08-18 02:27 | ✅ | | |
| 72 | +| [`image_ag_qc`](image_ag_qc.md) | Image, l'agence immobilière | agence | actif | 77 | 0.0 % | 2026-08-18 02:27 | ✅ | | |
| 73 | +| [`m_immobilier`](m_immobilier.md) | M Immobilier | luxe | actif | 67 | 85.1 % | 2026-08-18 03:13 | ✅ | | |
| 74 | +| [`contact_ag_qc`](contact_ag_qc.md) | Les Immeubles Contact | agence | actif | 43 | 83.7 % | 2026-08-18 02:40 | ✅ | | |
| 75 | +| [`sothebys_quebec`](sothebys_quebec.md) | Sotheby's International Realty Québec | luxe | actif | 42 | 71.4 % | 2026-08-18 00:21 | ✅ | | |
| 76 | +| [`via_ag_acces`](via_ag_acces.md) | Via Capitale Acces | franchise | actif | 31 | 96.8 % | 2026-08-18 00:27 | ✅ | | |
| 77 | +| [`via_ag_select`](via_ag_select.md) | Via Capitale Select | franchise | actif | 17 | 100.0 % | 2026-08-18 00:28 | ✅ | | |
| 78 | +| [`gaillardetz`](gaillardetz.md) | Gaillardetz Agence Immobilière | agence | actif | 13 | 92.3 % | 2026-08-18 02:27 | ✅ | | |
| 79 | +| [`via_ag_elite`](via_ag_elite.md) | Via Capitale Elite | franchise | actif | 11 | 81.8 % | 2026-08-18 00:28 | ✅ | | |
| 80 | +| [`expert_immobilier_pm`](expert_immobilier_pm.md) | L'Expert Immobilier P.M. | agence | actif | 9 | 88.9 % | 2026-08-18 02:40 | ✅ | | |
| 81 | +| [`century21`](century21.md) | Century 21 (Québec) | franchise | actif | 0 | — | — | — | | |
| 82 | +| [`via_ag_dumontroyal`](via_ag_dumontroyal.md) | Via Capitale Dumontroyal | franchise | inactif | 0 | — | 2026-08-18 00:27 | ✅ | | |
| 83 | +| [`c21_ag_vision`](c21_ag_vision.md) | Century 21 Vision (Outaouais) | — | actif | 0 | — | 2026-08-18 02:35 | ✅ | | |
| 84 | +| [`niddamour`](niddamour.md) | Nid d'Amour Agence Immobilière | agence | a_faire | 0 | — | 2026-08-18 02:27 | ✅ | | |
| 85 | +| [`coldwell_banker`](coldwell_banker.md) | Coldwell Banker Québec | franchise | a_faire | 0 | — | — | — | | |
added
docs/connecteurs/barnes_quebec.md
+63 −0
@@ -0,0 +1,63 @@ | ||
| 1 | +# BARNES Québec (`barnes_quebec`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://barnes-quebec.com | |
| 8 | +- **Recherche** : https://barnes-quebec.com/property | |
| 9 | +- **Couverture** : Montréal + province — luxe international | |
| 10 | +- **Type** : luxe | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Algolia (App HCW55VIQNM, index quebec_all). ~344 propriétés, prix/MLS/chambres/sdb/superficie/géoloc. Images non indexées (viendront de la page détail). Dédoublonnage FR/EN par adresse. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/barnes_quebec.py` — classe `BarnesQuebecConnector` | |
| 18 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_BARNES_DETAIL_LIMIT` (défaut 400) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/barnes_quebec.py : BARNES Québec (barnes-quebec.com) | |
| 26 | +> Site WordPress indexé dans Algolia. La config expose l'App ID et une clé | |
| 27 | +> API dans le HTML (PHPVars) ; l'index « quebec_all » contient les propriétés | |
| 28 | +> (type "property") avec adresse, prix, MLS, chambres, salles de bains, | |
| 29 | +> superficie et géolocalisation. Les enregistrements sont dupliqués par | |
| 30 | +> langue → on dédoublonne par référence MLS. Les permaliens pointent vers le | |
| 31 | +> domaine de staging Kinsta ; on les réécrit vers le domaine de production. | |
| 32 | +> RÉSILIENCE : la clé Algolia a déjà été rotée (403 le 2026-08-15) — on | |
| 33 | +> l'extrait donc À CHAQUE FOIS du HTML public du site (avec cache process), | |
| 34 | +> avec repli sur la dernière clé connue si l'extraction échoue. | |
| 35 | + | |
| 36 | +## Mécanismes clés | |
| 37 | + | |
| 38 | +- **Clé Algolia auto-extraite** : App ID / admin key / préfixe d'index lus dans les PHPVars du plugin `barnes-algolia` (wp_localize_script), avec cache et repli sur les derniers identifiants connus — la clé a déjà été rotée (403 le 2026-08-15) et le connecteur s'auto-répare. | |
| 39 | +- Algolia ne contient pas les photos : elles sont récupérées sur la fiche détail. | |
| 40 | + | |
| 41 | +## Volumétrie & complétude (BD live) | |
| 42 | + | |
| 43 | +| Indicateur | Valeur | | |
| 44 | +|---|---| | |
| 45 | +| Annonces en base (toutes) | 351 | | |
| 46 | +| Actives | 336 | | |
| 47 | +| Visibles (après dédup) | 336 | | |
| 48 | +| Masquées par la dédup | 0 | | |
| 49 | +| GPS (lat/lng) | 99.4 % | | |
| 50 | +| Photos | 68.5 % | | |
| 51 | +| Prix | 99.7 % | | |
| 52 | +| CAC (chambres) | 92.0 % | | |
| 53 | +| SDB (salles de bains) | 91.1 % | | |
| 54 | +| Année de construction | 81.5 % (dont rôle : 100.0 %) | | |
| 55 | +| Taxes / évaluation municipale | 49.4 % | | |
| 56 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 57 | + | |
| 58 | +## Synchronisation | |
| 59 | + | |
| 60 | +- **Dernier sync** : 2026-08-18 02:35 — trouvé 336, +0 / ~0 / -0 — OK | |
| 61 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 62 | + | |
| 63 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/bhhs_ag_qc.md
+54 −0
@@ -0,0 +1,54 @@ | ||
| 1 | +# Berkshire Hathaway HomeServices Québec (`bhhs_ag_qc`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://bhhsquebec.ca | |
| 8 | +- **Recherche** : https://bhhsquebec.ca/proprietes/ | |
| 9 | +- **Couverture** : Grand Montréal, Laurentides, Montérégie, Outaouais | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> WordPress (MW Properties / marketingwebsites.ca), liste SSR paginée ?pages=N (~9/page, ~11 pages). Carte col-lg-4: no Centris (URL+image+property-meta), région, adresse, ville, prix ($US), chambres/sdb, photo. source_id _ag_ = dédup Centris. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/bhhs_quebec.py` — classe `BhhsQuebecConnector` | |
| 18 | +- Délai entre requêtes : 0.4 s ; cache détail BD : oui | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/bhhs_quebec.py : Berkshire Hathaway HomeServices Québec | |
| 25 | +> (bhhsquebec.ca) — Grand Montréal, Laurentides, Montérégie, Outaouais. | |
| 26 | +> Site WordPress (plugin « MW Properties » / realestate.marketingwebsites.ca), | |
| 27 | +> liste rendue SERVEUR sur /proprietes/, paginée par ?pages=N (~9/page, | |
| 28 | +> ~11 pages). Chaque carte porte : n° Centris (URL + image + property-meta), | |
| 29 | +> région, adresse, ville, prix ($US), chambres/sdb et photo. | |
| 30 | +> source_id « bhhs_ag_qc » : infixe _ag_ = dédup Centris (db.refresh_dedup). | |
| 31 | + | |
| 32 | +## Volumétrie & complétude (BD live) | |
| 33 | + | |
| 34 | +| Indicateur | Valeur | | |
| 35 | +|---|---| | |
| 36 | +| Annonces en base (toutes) | 97 | | |
| 37 | +| Actives | 93 | | |
| 38 | +| Visibles (après dédup) | 91 | | |
| 39 | +| Masquées par la dédup | 2 | | |
| 40 | +| GPS (lat/lng) | 90.1 % | | |
| 41 | +| Photos | 100.0 % | | |
| 42 | +| Prix | 67.0 % | | |
| 43 | +| CAC (chambres) | 93.4 % | | |
| 44 | +| SDB (salles de bains) | 93.4 % | | |
| 45 | +| Année de construction | 86.8 % (dont rôle : 100.0 %) | | |
| 46 | +| Taxes / évaluation municipale | 0.0 % | | |
| 47 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 48 | + | |
| 49 | +## Synchronisation | |
| 50 | + | |
| 51 | +- **Dernier sync** : 2026-08-18 02:35 — trouvé 93, +0 / ~0 / -4 — OK | |
| 52 | +- **Erreurs récentes** : 0 sur les 3 derniers syncs | |
| 53 | + | |
| 54 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/c21_ag_quebec.md
+59 −0
@@ -0,0 +1,59 @@ | ||
| 1 | +# Century 21 Québec (All Quebec) (`c21_ag_quebec`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://quebec.c21.ca | |
| 8 | +- **Recherche** : https://quebec.c21.ca | |
| 9 | +- **Plateforme** : source.immo | |
| 10 | +- **Rôle** : sous-agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Compte source.immo partagé (quebec/excel/immoplus) = inventaire provincial C21 complet (~1600 à vendre). Pagination st/nt. Dédup par n° Centris. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/century21_agences.py` — classe `C21AgQuebec` | |
| 18 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/century21_agences.py : Century 21 par SOUS-AGENCES (robuste) | |
| 25 | +> Le portail central c21.ca délègue à une iframe moxiworks verrouillée | |
| 26 | +> (503/WAF, même via Firecrawl). Mais les bureaux Century 21 du Québec tournent | |
| 27 | +> sur la plateforme source.immo (ID-3 Technologies) : quebec.c21.ca, | |
| 28 | +> excel.c21.ca et century21immoplus.com partagent un même compte | |
| 29 | +> « Century 21 - All Quebec » (inventaire provincial complet), et | |
| 30 | +> vision.c21.ca a son propre compte. L'API publique (api-v1.source.immo) | |
| 31 | +> est paginée par st/nt (voir sourceimmo.py) — inventaire complet accessible. | |
| 32 | +> Une classe par sous-agence est générée depuis data/century21_agencies.json | |
| 33 | +> (source_id « c21_ag_<slug> »). Le n° Centris sert de clé de déduplication | |
| 34 | +> (voir web.py, sources « %_ag_% ») — aucun double-comptage entre les skins | |
| 35 | +> partageant le même compte ni avec le reste du site. | |
| 36 | + | |
| 37 | +## Volumétrie & complétude (BD live) | |
| 38 | + | |
| 39 | +| Indicateur | Valeur | | |
| 40 | +|---|---| | |
| 41 | +| Annonces en base (toutes) | 1 663 | | |
| 42 | +| Actives | 1 603 | | |
| 43 | +| Visibles (après dédup) | 1 576 | | |
| 44 | +| Masquées par la dédup | 27 | | |
| 45 | +| GPS (lat/lng) | 99.9 % | | |
| 46 | +| Photos | 100.0 % | | |
| 47 | +| Prix | 100.0 % | | |
| 48 | +| CAC (chambres) | 75.1 % | | |
| 49 | +| SDB (salles de bains) | 72.8 % | | |
| 50 | +| Année de construction | 75.6 % (dont rôle : 10.0 %) | | |
| 51 | +| Taxes / évaluation municipale | 83.7 % | | |
| 52 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 53 | + | |
| 54 | +## Synchronisation | |
| 55 | + | |
| 56 | +- **Dernier sync** : 2026-08-18 02:35 — trouvé 1 603, +0 / ~0 / -0 — OK | |
| 57 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 58 | + | |
| 59 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/c21_ag_vision.md
+59 −0
@@ -0,0 +1,59 @@ | ||
| 1 | +# Century 21 Vision (Outaouais) (`c21_ag_vision`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://vision.c21.ca | |
| 8 | +- **Recherche** : https://vision.c21.ca | |
| 9 | +- **Plateforme** : source.immo | |
| 10 | +- **Rôle** : sous-agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Century 21 Vision (Gatineau) — compte source.immo distinct (~139 à vendre). | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/century21_agences.py` — classe `C21AgVision` | |
| 18 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/century21_agences.py : Century 21 par SOUS-AGENCES (robuste) | |
| 25 | +> Le portail central c21.ca délègue à une iframe moxiworks verrouillée | |
| 26 | +> (503/WAF, même via Firecrawl). Mais les bureaux Century 21 du Québec tournent | |
| 27 | +> sur la plateforme source.immo (ID-3 Technologies) : quebec.c21.ca, | |
| 28 | +> excel.c21.ca et century21immoplus.com partagent un même compte | |
| 29 | +> « Century 21 - All Quebec » (inventaire provincial complet), et | |
| 30 | +> vision.c21.ca a son propre compte. L'API publique (api-v1.source.immo) | |
| 31 | +> est paginée par st/nt (voir sourceimmo.py) — inventaire complet accessible. | |
| 32 | +> Une classe par sous-agence est générée depuis data/century21_agencies.json | |
| 33 | +> (source_id « c21_ag_<slug> »). Le n° Centris sert de clé de déduplication | |
| 34 | +> (voir web.py, sources « %_ag_% ») — aucun double-comptage entre les skins | |
| 35 | +> partageant le même compte ni avec le reste du site. | |
| 36 | + | |
| 37 | +## Volumétrie & complétude (BD live) | |
| 38 | + | |
| 39 | +| Indicateur | Valeur | | |
| 40 | +|---|---| | |
| 41 | +| Annonces en base (toutes) | 142 | | |
| 42 | +| Actives | 138 | | |
| 43 | +| Visibles (après dédup) | 0 | | |
| 44 | +| Masquées par la dédup | 138 | | |
| 45 | +| GPS (lat/lng) | — | | |
| 46 | +| Photos | — | | |
| 47 | +| Prix | — | | |
| 48 | +| CAC (chambres) | — | | |
| 49 | +| SDB (salles de bains) | — | | |
| 50 | +| Année de construction | — | | |
| 51 | +| Taxes / évaluation municipale | — | | |
| 52 | +| Estimation Vrai-Prix (rôle) | — | | |
| 53 | + | |
| 54 | +## Synchronisation | |
| 55 | + | |
| 56 | +- **Dernier sync** : 2026-08-18 02:35 — trouvé 138, +0 / ~0 / -0 — OK | |
| 57 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 58 | + | |
| 59 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/century21.md
+27 −0
@@ -0,0 +1,27 @@ | ||
| 1 | +# Century 21 (Québec) (`century21`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.c21.ca | |
| 8 | +- **Recherche** : https://listings.moxiworks.com/m214-1731446488/fr-ca | |
| 9 | +- **Couverture** : Toute la province — ~339 courtiers, ~22 agences | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Central c21.ca->moxiworks (company_uuid=3341197) : même flux search_v2 anonyme accessible, MAIS données Rest-of-Canada/MLS (pas Centris QC : Québec-ville=0). La couverture QC de C21 vient des sous-agences source.immo (c21_ag_*), déjà actives. Le central moxi n'ajoute rien au QC. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +_Pas de classe connecteur dédiée (voir la note du registre)._ | |
| 18 | + | |
| 19 | +## Volumétrie & complétude (BD live) | |
| 20 | + | |
| 21 | +_Aucune annonce en base pour cette source (voir la note du registre : couverture assurée ailleurs ou connecteur inactif)._ | |
| 22 | + | |
| 23 | +## Synchronisation | |
| 24 | + | |
| 25 | +Aucune entrée `sync_log` pour cette source. | |
| 26 | + | |
| 27 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/charisma_ag_qc.md
+57 −0
@@ -0,0 +1,57 @@ | ||
| 1 | +# Les Immeubles Charisma (`charisma_ag_qc`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://charisma.ca | |
| 8 | +- **Recherche** : https://charisma.ca/fr/proprietes/ | |
| 9 | +- **Couverture** : Laval, Montréal, Montérégie — 3e bannière indépendante du Québec | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> WordPress (MW Properties / marketingwebsites.ca), liste SSR paginée ?pages=N (~10/page). Carte box-house: no Centris, prix ($US), ville, chambres/sdb, photo. ⚠ fusion avec L'Expert Immobilier P.M. (2021) → source_id _ag_ = dédup Centris. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/charisma.py` — classe `CharismaConnector` | |
| 18 | +- Délai entre requêtes : 0.4 s ; cache détail BD : oui | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/charisma.py : Les Immeubles Charisma (charisma.ca) — Laval, | |
| 25 | +> Montréal, Montérégie. 3e bannière indépendante du Québec (200+ courtiers). | |
| 26 | +> Site WordPress (plugin « MW Properties » / realestate.marketingwebsites.ca), | |
| 27 | +> liste rendue SERVEUR sur /fr/proprietes/, paginée par ?pages=N (~10/page, | |
| 28 | +> ~84 pages). Chaque carte (box-house) porte : n° Centris (URL + image), prix, | |
| 29 | +> ville, chambres/sdb et photo (property-images/{Centris}/). | |
| 30 | +> ⚠ DÉDUP : Charisma a fusionné avec L'Expert Immobilier P.M. (déjà couvert) | |
| 31 | +> en 2021 → beaucoup de co-inscriptions. source_id « charisma_ag_qc » : l'infixe | |
| 32 | +> _ag_ (db.refresh_dedup) masque les fiches dont le n° Centris est déjà porté | |
| 33 | +> par une source couverte ; les inscriptions uniques restent visibles. | |
| 34 | + | |
| 35 | +## Volumétrie & complétude (BD live) | |
| 36 | + | |
| 37 | +| Indicateur | Valeur | | |
| 38 | +|---|---| | |
| 39 | +| Annonces en base (toutes) | 760 | | |
| 40 | +| Actives | 755 | | |
| 41 | +| Visibles (après dédup) | 696 | | |
| 42 | +| Masquées par la dédup | 59 | | |
| 43 | +| GPS (lat/lng) | 92.4 % | | |
| 44 | +| Photos | 100.0 % | | |
| 45 | +| Prix | 53.0 % | | |
| 46 | +| CAC (chambres) | 100.0 % | | |
| 47 | +| SDB (salles de bains) | 100.0 % | | |
| 48 | +| Année de construction | 81.2 % (dont rôle : 100.0 %) | | |
| 49 | +| Taxes / évaluation municipale | 0.0 % | | |
| 50 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 51 | + | |
| 52 | +## Synchronisation | |
| 53 | + | |
| 54 | +- **Dernier sync** : 2026-08-18 02:37 — trouvé 755, +0 / ~0 / -5 — OK | |
| 55 | +- **Erreurs récentes** : 0 sur les 3 derniers syncs | |
| 56 | + | |
| 57 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/cio_ag_outaouais.md
+61 −0
@@ -0,0 +1,61 @@ | ||
| 1 | +# Chambre immobilière de l'Outaouais (`cio_ag_outaouais`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://avecuncourtier.com | |
| 8 | +- **Recherche** : https://avecuncourtier.com/fr/proprietes | |
| 9 | +- **Couverture** : Tout l'Outaouais (Gatineau → Maniwaki/Pontiac) — portail MLS régional | |
| 10 | +- **Type** : portail | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Portail de chambre (Concrete5/Tonik). Liste SSR paginée ?page=N (12/page, ~341 pages). Carte: MLS Centris, adresse, ville, type, prix, photo. source_id _ag_ = dédup Centris (agrège bannières couvertes de l'Outaouais). | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/avecuncourtier.py` — classe `AvecUnCourtierConnector` | |
| 18 | +- Délai entre requêtes : 0.4 s ; cache détail BD : oui | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_AUC_MAX_PAGES` (défaut 400) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/avecuncourtier.py : portail « avec un courtier » de la Chambre | |
| 26 | +> immobilière de l'Outaouais (avecuncourtier.com). Couvre TOUT l'Outaouais | |
| 27 | +> (Gatineau → Maniwaki/Pontiac) d'un coup — c'est le portail MLS régional de | |
| 28 | +> la chambre, pas une agence unique. Recherche rendue SERVEUR (plateforme | |
| 29 | +> Concrete5, Tonik Web Studio), paginée par ?page=N (12 cartes/page, ~341 | |
| 30 | +> pages). Chaque carte porte déjà : n° MLS (Centris), adresse, ville/secteur, | |
| 31 | +> type, aire habitable, prix et photo. | |
| 32 | +> source_id « cio_ag_outaouais » : l'infixe _ag_ active la dédup Centris | |
| 33 | +> (db.refresh_dedup, sources %_ag_%). Comme le portail agrège les inscriptions | |
| 34 | +> des bannières déjà couvertes (RE/MAX, Royal LePage, Via Capitale, Proprio | |
| 35 | +> Direct…), la dédup masque les fiches dont le n° Centris est déjà porté par | |
| 36 | +> une source canonique ; seules les inscriptions d'agences NON couvertes de | |
| 37 | +> l'Outaouais restent visibles. Aucun double-comptage. | |
| 38 | + | |
| 39 | +## Volumétrie & complétude (BD live) | |
| 40 | + | |
| 41 | +| Indicateur | Valeur | | |
| 42 | +|---|---| | |
| 43 | +| Annonces en base (toutes) | 4 148 | | |
| 44 | +| Actives | 4 104 | | |
| 45 | +| Visibles (après dédup) | 1 394 | | |
| 46 | +| Masquées par la dédup | 2 710 | | |
| 47 | +| GPS (lat/lng) | 93.7 % | | |
| 48 | +| Photos | 100.0 % | | |
| 49 | +| Prix | 99.9 % | | |
| 50 | +| CAC (chambres) | 33.7 % | | |
| 51 | +| SDB (salles de bains) | 0.0 % | | |
| 52 | +| Année de construction | 69.6 % (dont rôle : 100.0 %) | | |
| 53 | +| Taxes / évaluation municipale | 0.0 % | | |
| 54 | +| Estimation Vrai-Prix (rôle) | 99.9 % | | |
| 55 | + | |
| 56 | +## Synchronisation | |
| 57 | + | |
| 58 | +- **Dernier sync** : 2026-08-18 02:35 — trouvé 4 104, +0 / ~0 / -44 — OK | |
| 59 | +- **Erreurs récentes** : 0 sur les 3 derniers syncs | |
| 60 | + | |
| 61 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/coldwell_banker.md
+27 −0
@@ -0,0 +1,27 @@ | ||
| 1 | +# Coldwell Banker Québec (`coldwell_banker`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://coldwellbanker.ca | |
| 8 | +- **Recherche** : https://coldwellbanker.ca/ | |
| 9 | +- **Couverture** : Québec — franchise (L'Héritage, Prestige…) | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Statut** : a_faire | |
| 12 | + | |
| 13 | +> moxiworks org m102181-1733247042 / company_uuid=4277740. FLUX ANONYME CRACKÉ : GET svc.moxiworks.com/service/v1/listing/search_v2?company_uuid=<id>&bounds_west/east/south/north=..&status=active (pas d'auth ; le WAF n'est que sur listings.moxiworks.com, pas sur svc). MAIS le feed = Rest-of-Canada/MLS (TREB Toronto : MLS C.../T...) ; couverture Québec/Centris ~nulle (Québec-ville=0, Montréal=4 fiches à MLS torontois). Non exploitable pour Immo-Ka (QC). CB Québec quasi inexistant sur ce feed. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +_Pas de classe connecteur dédiée (voir la note du registre)._ | |
| 18 | + | |
| 19 | +## Volumétrie & complétude (BD live) | |
| 20 | + | |
| 21 | +_Aucune annonce en base pour cette source (voir la note du registre : couverture assurée ailleurs ou connecteur inactif)._ | |
| 22 | + | |
| 23 | +## Synchronisation | |
| 24 | + | |
| 25 | +Aucune entrée `sync_log` pour cette source. | |
| 26 | + | |
| 27 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/contact_ag_qc.md
+56 −0
@@ -0,0 +1,56 @@ | ||
| 1 | +# Les Immeubles Contact (`contact_ag_qc`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.lesimmeublescontact.com | |
| 8 | +- **Recherche** : https://www.lesimmeublescontact.com/immeubles_centris.php?page=residentiel | |
| 9 | +- **Couverture** : Alma / Lac-Saint-Jean-Est + Chibougamau-Chapais | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Site PHP maison (ISO-8859-1), liste SSR immeubles_centris.php (residentiel/revenu/commercial). Carte: data-cost, no_mls Centris, adresse, ville, prix, photo. source_id _ag_ = dédup Centris. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/immeuble_contact.py` — classe `ImmeubleContactConnector` | |
| 18 | +- Délai entre requêtes : 0.4 s ; cache détail BD : oui | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/immeuble_contact.py : Les Immeubles Contact (Alma / Lac-Saint-Jean-Est | |
| 25 | +> + Chibougamau-Chapais). Agence indépendante, site PHP maison (Solution Globale | |
| 26 | +> Informatique). La liste est rendue SERVEUR sur immeubles_centris.php?page=… | |
| 27 | +> (résidentiel + revenu), encodage ISO-8859-1. Chaque carte porte déjà tout : | |
| 28 | +> n° MLS (Centris), type, adresse, ville, prix (data-cost) et photo Centris. | |
| 29 | +> source_id « contact_ag_qc » : l'infixe _ag_ active la dédup Centris (db.refresh_dedup, | |
| 30 | +> sources %_ag_%) — si le n° Centris est déjà porté par une bannière couverte | |
| 31 | +> (RE/MAX, Via Capitale…), la fiche est masquée ; les inscriptions propres de | |
| 32 | +> l'agence restent visibles. Aucun double-comptage. | |
| 33 | + | |
| 34 | +## Volumétrie & complétude (BD live) | |
| 35 | + | |
| 36 | +| Indicateur | Valeur | | |
| 37 | +|---|---| | |
| 38 | +| Annonces en base (toutes) | 44 | | |
| 39 | +| Actives | 43 | | |
| 40 | +| Visibles (après dédup) | 43 | | |
| 41 | +| Masquées par la dédup | 0 | | |
| 42 | +| GPS (lat/lng) | 97.7 % | | |
| 43 | +| Photos | 100.0 % | | |
| 44 | +| Prix | 100.0 % | | |
| 45 | +| CAC (chambres) | 9.3 % | | |
| 46 | +| SDB (salles de bains) | 0.0 % | | |
| 47 | +| Année de construction | 83.7 % (dont rôle : 100.0 %) | | |
| 48 | +| Taxes / évaluation municipale | 0.0 % | | |
| 49 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 50 | + | |
| 51 | +## Synchronisation | |
| 52 | + | |
| 53 | +- **Dernier sync** : 2026-08-18 02:40 — trouvé 43, +0 / ~0 / -1 — OK | |
| 54 | +- **Erreurs récentes** : 0 sur les 3 derniers syncs | |
| 55 | + | |
| 56 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/domicilia.md
+59 −0
@@ -0,0 +1,59 @@ | ||
| 1 | +# Domicilia Agence Immobilière (`domicilia`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.domicilia.com | |
| 8 | +- **Recherche** : https://www.domicilia.com/proprietes/ | |
| 9 | +- **Couverture** : Agence indépendante (Québec) | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). 1427 propriétés à vendre. Généré par agences_source_immo.py. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/agences_source_immo.py` — classe `AgenceSIDomicilia` | |
| 18 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme | |
| 25 | +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC | |
| 26 | +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à | |
| 27 | +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique | |
| 28 | +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences | |
| 29 | +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES — | |
| 30 | +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_). | |
| 31 | +> EXCEPTION : les équipes/agences dont une partie des inscriptions est | |
| 32 | +> co-listée avec une bannière couverte (co-inscription Centris) portent un id | |
| 33 | +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%) | |
| 34 | +> masque leurs doublons tout en gardant leurs fiches uniques visibles. | |
| 35 | +> Un connecteur par agence est généré depuis data/source_immo_agencies.json. | |
| 36 | + | |
| 37 | +## Volumétrie & complétude (BD live) | |
| 38 | + | |
| 39 | +| Indicateur | Valeur | | |
| 40 | +|---|---| | |
| 41 | +| Annonces en base (toutes) | 1 485 | | |
| 42 | +| Actives | 1 445 | | |
| 43 | +| Visibles (après dédup) | 1 445 | | |
| 44 | +| Masquées par la dédup | 0 | | |
| 45 | +| GPS (lat/lng) | 99.9 % | | |
| 46 | +| Photos | 100.0 % | | |
| 47 | +| Prix | 100.0 % | | |
| 48 | +| CAC (chambres) | 67.8 % | | |
| 49 | +| SDB (salles de bains) | 66.6 % | | |
| 50 | +| Année de construction | 73.4 % (dont rôle : 6.2 %) | | |
| 51 | +| Taxes / évaluation municipale | 89.5 % | | |
| 52 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 53 | + | |
| 54 | +## Synchronisation | |
| 55 | + | |
| 56 | +- **Dernier sync** : 2026-08-18 02:27 — trouvé 1 445, +0 / ~0 / -0 — OK | |
| 57 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 58 | + | |
| 59 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/duproprio.md
+57 −0
@@ -0,0 +1,57 @@ | ||
| 1 | +# DuProprio (sans courtier) (`duproprio`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://duproprio.com | |
| 8 | +- **Recherche** : https://duproprio.com/sitemaps/fr/index.xml.gz | |
| 9 | +- **Couverture** : Toute la province — vente par le propriétaire (FSBO), ~7 600 propriétés QC | |
| 10 | +- **Type** : fsbo | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> FSBO. Enumeration via sitemaps FR par region QC (/sitemaps/fr/<region>-listings.xml.gz) : l'URL encode region/ville/type/id. Fiche detail JSON-LD Product (prix, description, galerie photos.duproprio.com). Fetch direct + Scrapfly ASP en secours. agency='DuProprio (sans courtier)'. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/duproprio.py` — classe `DuProprioConnector` | |
| 18 | +- Délai entre requêtes : 0.4 s ; cache détail BD : oui | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_DUPROPRIO_DETAIL_LIMIT` (défaut 500) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/duproprio.py : DuProprio (FSBO — vente sans courtier) | |
| 26 | +> DuProprio est la grande plateforme québécoise de vente « à vendre par le | |
| 27 | +> propriétaire » (sans agence). Segment complémentaire absent de toutes les | |
| 28 | +> bannières de courtage. Énumération EXHAUSTIVE via les sitemaps FR par région | |
| 29 | +> du Québec (`/sitemaps/fr/<region>-listings.xml.gz`) : l'URL encode déjà | |
| 30 | +> région, ville, type et l'id DuProprio (= external_id). La fiche détail | |
| 31 | +> (JSON-LD Product) fournit prix, description et galerie ; enrichissement | |
| 32 | +> plafonné + cache (comme les autres connecteurs). Scrapfly en secours si le | |
| 33 | +> fetch direct est bloqué. | |
| 34 | + | |
| 35 | +## Volumétrie & complétude (BD live) | |
| 36 | + | |
| 37 | +| Indicateur | Valeur | | |
| 38 | +|---|---| | |
| 39 | +| Annonces en base (toutes) | 7 569 | | |
| 40 | +| Actives | 7 393 | | |
| 41 | +| Visibles (après dédup) | 7 393 | | |
| 42 | +| Masquées par la dédup | 0 | | |
| 43 | +| GPS (lat/lng) | 90.8 % | | |
| 44 | +| Photos | 100.0 % | | |
| 45 | +| Prix | 98.6 % | | |
| 46 | +| CAC (chambres) | 80.5 % | | |
| 47 | +| SDB (salles de bains) | 79.8 % | | |
| 48 | +| Année de construction | 79.3 % (dont rôle : 9.0 %) | | |
| 49 | +| Taxes / évaluation municipale | 52.7 % | | |
| 50 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 51 | + | |
| 52 | +## Synchronisation | |
| 53 | + | |
| 54 | +- **Dernier sync** : 2026-08-18 02:37 — trouvé 7 393, +0 / ~0 / -30 — OK | |
| 55 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 56 | + | |
| 57 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/engel_volkers.md
+53 −0
@@ -0,0 +1,53 @@ | ||
| 1 | +# Engel & Völkers Montréal / Québec (`engel_volkers`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://immobilier.evquebec.com | |
| 8 | +- **Recherche** : https://immobilier.evquebec.com/property-sitemap.xml | |
| 9 | +- **Couverture** : Montréal, Québec, Tremblant — luxe #1 au Québec | |
| 10 | +- **Type** : luxe | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> immobilier.evquebec.com : property-sitemap.xml (~1240 fiches FR /propriete/{no-centris}/). Fiche = JSON-LD (prix/adresse/description) ; galerie séquentielle media.evquebec.com/listings/{id}/NN.webp (sondée jusqu'au 1er trou). Enrichissement cache+plafond (IMMOKA_EV_DETAIL_LIMIT). | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/engel_volkers.py` — classe `EngelVolkersConnector` | |
| 18 | +- Délai entre requêtes : 0.4 s ; cache détail BD : oui | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_EV_DETAIL_LIMIT` (défaut 400) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/engel_volkers.py : Engel & Völkers Montréal / Québec (luxe) | |
| 26 | +> Le site local immobilier.evquebec.com publie un property-sitemap.xml | |
| 27 | +> exhaustif (~1240 fiches, /propriete/{no-centris}/). Chaque fiche a un | |
| 28 | +> JSON-LD RealEstateListing (prix, adresse, description, n° Centris). La | |
| 29 | +> galerie est servie séquentiellement sur media.evquebec.com/listings/{id}/NN.webp. | |
| 30 | + | |
| 31 | +## Volumétrie & complétude (BD live) | |
| 32 | + | |
| 33 | +| Indicateur | Valeur | | |
| 34 | +|---|---| | |
| 35 | +| Annonces en base (toutes) | 1 282 | | |
| 36 | +| Actives | 1 228 | | |
| 37 | +| Visibles (après dédup) | 1 228 | | |
| 38 | +| Masquées par la dédup | 0 | | |
| 39 | +| GPS (lat/lng) | 87.1 % | | |
| 40 | +| Photos | 98.9 % | | |
| 41 | +| Prix | 89.7 % | | |
| 42 | +| CAC (chambres) | 35.2 % | | |
| 43 | +| SDB (salles de bains) | 20.4 % | | |
| 44 | +| Année de construction | 69.9 % (dont rôle : 100.0 %) | | |
| 45 | +| Taxes / évaluation municipale | 0.0 % | | |
| 46 | +| Estimation Vrai-Prix (rôle) | 89.3 % | | |
| 47 | + | |
| 48 | +## Synchronisation | |
| 49 | + | |
| 50 | +- **Dernier sync** : 2026-08-18 02:37 — trouvé 1 228, +0 / ~0 / -0 — OK | |
| 51 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 52 | + | |
| 53 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/exp_ag_qc.md
+64 −0
@@ -0,0 +1,64 @@ | ||
| 1 | +# eXp Agence immobilière (Québec) (`exp_ag_qc`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://expquebec.com | |
| 8 | +- **Recherche** : https://expquebec.com/fr/properties/ | |
| 9 | +- **Couverture** : Toute la province — agence virtuelle (~1000+ inscriptions) | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Site officiel eXp QC (expquebec.com, WordPress + MW Properties). API cliente marketingwebsites.ca bloquée (whitelist IP) MAIS inventaire complet en SSR sur /fr/properties/?pages=N (9/page, param 'pages', stop après 3 pages vides). Carte: data-href mls={Centris}, data-price ($US), data-address, data-pic. Ville via map-property.php?mls={Centris}&lang=fr (enrich requests, plafonné+cache). source_id _ag_ = dédup Centris. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/exp_quebec.py` — classe `ExpQuebecConnector` | |
| 18 | +- Délai entre requêtes : 0.4 s ; cache détail BD : oui | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_EXP_DETAIL_LIMIT` (défaut 1200) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/exp_quebec.py : eXp Realty Québec (expquebec.com) — toute la province. | |
| 26 | +> L'API cliente realestate.marketingwebsites.ca/api.php est verrouillée par | |
| 27 | +> whitelist IP (impasse, même via proxy). MAIS le serveur WordPress (autorisé | |
| 28 | +> sur l'API) rend l'inventaire COMPLET côté serveur sur | |
| 29 | +> /fr/properties/?pages={N} (9 fiches/page, param « pages » uniquement). | |
| 30 | +> Chaque carte porte data-href /fr/properties/mls/{MLS}, data-price ($US), | |
| 31 | +> data-address (rue) et data-pic (property-images/{MLS}/). Le n° MLS = n° Centris. | |
| 32 | +> La VILLE (absente de la liste) vient de l'endpoint SSR interne | |
| 33 | +> /wp-content/themes/canvas/load/map-property.php?mls={MLS}&lang=fr | |
| 34 | +> (enrichissement requests direct, plafonné + cache). | |
| 35 | +> ⚠ PLAFOND : le SSR reflète le limit=1000 de l'API sous-jacente → au plus | |
| 36 | +> ~1000 fiches (pages 1..~114, crawl vérifié). C'est l'inventaire pratique | |
| 37 | +> complet ; si eXp QC dépasse un jour 1000 inscriptions, segmenter par région | |
| 38 | +> (params MW_region / MW_q du formulaire), chaque segment ayant son propre cap. | |
| 39 | +> source_id « exp_ag_qc » : infixe _ag_ = dédup Centris (db.refresh_dedup) — | |
| 40 | +> les fiches co-listées avec une bannière couverte sont masquées. | |
| 41 | + | |
| 42 | +## Volumétrie & complétude (BD live) | |
| 43 | + | |
| 44 | +| Indicateur | Valeur | | |
| 45 | +|---|---| | |
| 46 | +| Annonces en base (toutes) | 1 018 | | |
| 47 | +| Actives | 1 000 | | |
| 48 | +| Visibles (après dédup) | 888 | | |
| 49 | +| Masquées par la dédup | 112 | | |
| 50 | +| GPS (lat/lng) | 67.3 % | | |
| 51 | +| Photos | 100.0 % | | |
| 52 | +| Prix | 99.8 % | | |
| 53 | +| CAC (chambres) | 14.6 % | | |
| 54 | +| SDB (salles de bains) | 0.0 % | | |
| 55 | +| Année de construction | 55.6 % (dont rôle : 100.0 %) | | |
| 56 | +| Taxes / évaluation municipale | 0.0 % | | |
| 57 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 58 | + | |
| 59 | +## Synchronisation | |
| 60 | + | |
| 61 | +- **Dernier sync** : 2026-08-18 02:40 — trouvé 1 000, +0 / ~0 / -18 — OK | |
| 62 | +- **Erreurs récentes** : 0 sur les 3 derniers syncs | |
| 63 | + | |
| 64 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/expert_immobilier_pm.md
+54 −0
@@ -0,0 +1,54 @@ | ||
| 1 | +# L'Expert Immobilier P.M. (`expert_immobilier_pm`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://expertimmobilierpm.com | |
| 8 | +- **Recherche** : https://expertimmobilierpm.com/proprietes/ | |
| 9 | +- **Couverture** : Grand Montréal — ~305 courtiers, grosse indépendante | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Vrai site QC trouve (l'ancienne URL lexpertimmobilier.com = agence de Casablanca). WordPress + plugin mw-properties2 (plateforme marketingwebsites.ca, comme KW Urbain). /proprietes/ rend 9 fiches serveur (inventaire complet derriere l'API REST mw-properties/v2 en 401). Cartes: adresse, ville, type, prix, chambres, sdb, superficie ; fiche detail: galerie complete (marketingwebsites) + description. external_id = no Centris. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/expert_immobilier_pm.py` — classe `ExpertImmobilierPmConnector` | |
| 18 | +- Délai entre requêtes : 0.6 s ; cache détail BD : oui | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_EPM_DETAIL_LIMIT` (défaut 300) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/expert_immobilier_pm.py : L'Expert Immobilier P.M. (Laval, QC) | |
| 26 | +> Vrai site : expertimmobilierpm.com (WordPress + plugin mw-properties2, la | |
| 27 | +> même plateforme marketingwebsites.ca que KW Urbain). NB : l'ancienne URL du | |
| 28 | +> registre (lexpertimmobilier.com) était une agence de Casablanca — corrigée. | |
| 29 | +> La page /proprietes/ rend les fiches côté serveur (n° Centris dans l'URL) ; | |
| 30 | +> la fiche détail fournit la galerie complète (marketingwebsites) + description. | |
| 31 | + | |
| 32 | +## Volumétrie & complétude (BD live) | |
| 33 | + | |
| 34 | +| Indicateur | Valeur | | |
| 35 | +|---|---| | |
| 36 | +| Annonces en base (toutes) | 26 | | |
| 37 | +| Actives | 9 | | |
| 38 | +| Visibles (après dédup) | 9 | | |
| 39 | +| Masquées par la dédup | 0 | | |
| 40 | +| GPS (lat/lng) | 88.9 % | | |
| 41 | +| Photos | 100.0 % | | |
| 42 | +| Prix | 88.9 % | | |
| 43 | +| CAC (chambres) | 100.0 % | | |
| 44 | +| SDB (salles de bains) | 100.0 % | | |
| 45 | +| Année de construction | 88.9 % (dont rôle : 100.0 %) | | |
| 46 | +| Taxes / évaluation municipale | 0.0 % | | |
| 47 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 48 | + | |
| 49 | +## Synchronisation | |
| 50 | + | |
| 51 | +- **Dernier sync** : 2026-08-18 02:40 — trouvé 9, +0 / ~0 / -0 — OK | |
| 52 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 53 | + | |
| 54 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/famille-c21-ag.md
+53 −0
@@ -0,0 +1,53 @@ | ||
| 1 | +# Famille Century 21 (`c21_ag_*`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +Connecteurs par compte Century 21, générés depuis `data/century21_agencies.json` (plateforme source.immo). | |
| 6 | + | |
| 7 | +- Registre : `data/century21_agencies.json` — **2 entrées** | |
| 8 | +- Connecteurs instanciés : **2** | |
| 9 | +- Module : `immoka/connectors/century21_agences.py` | |
| 10 | + | |
| 11 | +**En-tête du module :** | |
| 12 | + | |
| 13 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 14 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 15 | +> connectors/century21_agences.py : Century 21 par SOUS-AGENCES (robuste) | |
| 16 | +> Le portail central c21.ca délègue à une iframe moxiworks verrouillée | |
| 17 | +> (503/WAF, même via Firecrawl). Mais les bureaux Century 21 du Québec tournent | |
| 18 | +> sur la plateforme source.immo (ID-3 Technologies) : quebec.c21.ca, | |
| 19 | +> excel.c21.ca et century21immoplus.com partagent un même compte | |
| 20 | +> « Century 21 - All Quebec » (inventaire provincial complet), et | |
| 21 | +> vision.c21.ca a son propre compte. L'API publique (api-v1.source.immo) | |
| 22 | +> est paginée par st/nt (voir sourceimmo.py) — inventaire complet accessible. | |
| 23 | +> Une classe par sous-agence est générée depuis data/century21_agencies.json | |
| 24 | +> (source_id « c21_ag_<slug> »). Le n° Centris sert de clé de déduplication | |
| 25 | +> (voir web.py, sources « %_ag_% ») — aucun double-comptage entre les skins | |
| 26 | +> partageant le même compte ni avec le reste du site. | |
| 27 | + | |
| 28 | +## Membres et statuts | |
| 29 | + | |
| 30 | +| source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK | | |
| 31 | +|---|---|---|---|---|---|---|---| | |
| 32 | +| [`c21_ag_quebec`](c21_ag_quebec.md) | — | source.immo | 1 576 | 1 603 | 27 | 2026-08-18 02:35 | ✅ | | |
| 33 | +| [`c21_ag_vision`](c21_ag_vision.md) | — | source.immo | 0 | 138 | 138 | 2026-08-18 02:35 | ✅ | | |
| 34 | + | |
| 35 | +Entrées du registre sans connecteur instancié (2) : `quebec.c21.ca`, `vision.c21.ca` | |
| 36 | + | |
| 37 | +## Volumétrie & complétude agrégées (famille, BD live) | |
| 38 | + | |
| 39 | +| Indicateur | Valeur | | |
| 40 | +|---|---| | |
| 41 | +| Annonces en base (toutes) | 1 805 | | |
| 42 | +| Actives | 1 741 | | |
| 43 | +| Visibles (après dédup) | 1 576 | | |
| 44 | +| Masquées par la dédup | 165 | | |
| 45 | +| GPS (lat/lng) | 99.9 % | | |
| 46 | +| Photos | 100.0 % | | |
| 47 | +| Prix | 100.0 % | | |
| 48 | +| CAC (chambres) | 75.1 % | | |
| 49 | +| SDB (salles de bains) | 72.8 % | | |
| 50 | +| Année de construction | 75.6 % (dont rôle : 10.0 %) | | |
| 51 | +| Taxes / évaluation municipale | 83.7 % | | |
| 52 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 53 | + | |
added
docs/connecteurs/famille-remax-ag.md
+108 −0
@@ -0,0 +1,108 @@ | ||
| 1 | +# Famille RE/MAX sous-agences (`remax_ag_*`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +Un connecteur par sous-agence RE/MAX (sites propres, indépendants du portail central), généré dynamiquement depuis `data/remax_agencies.json`. | |
| 6 | + | |
| 7 | +- Registre : `data/remax_agencies.json` — **54 entrées** | |
| 8 | +- Connecteurs instanciés : **50** | |
| 9 | +- Module : `immoka/connectors/remax_agences.py` | |
| 10 | + | |
| 11 | +**En-tête du module :** | |
| 12 | + | |
| 13 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 14 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 15 | +> connectors/remax_agences.py : BACKUP RE/MAX — un connecteur par sous-agence | |
| 16 | +> Les ~54 bannières RE/MAX du Québec (RE/MAX 1er Choix, du Cartier, 3000, | |
| 17 | +> Platine…) ont chacune leur SITE PROPRE, indépendant du portail central | |
| 18 | +> remax-quebec.com. La majorité (42) partagent la même plateforme Centris | |
| 19 | +> (« /fr/nos-proprietes/{ville}/{adresse}/{no-centris} », rendu serveur, | |
| 20 | +> sitemap.xml exhaustif). C'est un plan B si la clé Meilisearch centrale | |
| 21 | +> (voir remax_quebec.py) est rotée ou bloquée. | |
| 22 | +> Une CLASSE PAR AGENCE est générée dynamiquement depuis | |
| 23 | +> data/remax_agencies.json (source_id « remax_ag_<slug> »). L'énumération | |
| 24 | +> se fait via le sitemap (1 requête → toutes les propriétés) ; le numéro | |
| 25 | +> Centris (dans l'URL) sert de clé de déduplication contre le flux central | |
| 26 | +> (voir la fusion dédupliquée dans immoka/web.py) — aucun double-comptage. | |
| 27 | + | |
| 28 | +## Mécanismes clés | |
| 29 | + | |
| 30 | +- **Backup du flux central** : plan B si la clé Meilisearch de remax-quebec.com est rotée/bloquée. Énumération par sitemap (1 requête → tout le parc) sur les plateformes « nos-proprietes » et « centris-other ». | |
| 31 | +- **Dédup Centris** : le n° Centris (dans l'URL) sert de clé de déduplication contre le flux central — les doublons sont masqués (`dup_hidden=1`), aucun double-comptage. | |
| 32 | + | |
| 33 | +Budgets env : `IMMOKA_AGENCE_DETAIL_LIMIT` (défaut 0) | |
| 34 | + | |
| 35 | +## Membres et statuts | |
| 36 | + | |
| 37 | +| source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK | | |
| 38 | +|---|---|---|---|---|---|---|---| | |
| 39 | +| `remax_ag_1erchoix` | www.remax1erchoix.com | nos-proprietes | 211 | 1 064 | 853 | 2026-08-18 00:15 | ✅ | | |
| 40 | +| `remax_ag_2000` | www.remax-2000.com | centris-other | 72 | 735 | 663 | 2026-08-18 00:15 | ✅ | | |
| 41 | +| `remax_ag_2001` | www.remax2001.com | nos-proprietes | 37 | 366 | 329 | 2026-08-18 00:15 | ✅ | | |
| 42 | +| `remax_ag_3000` | remax3000.com | nos-proprietes | 52 | 782 | 730 | 2026-08-18 00:15 | ✅ | | |
| 43 | +| `remax_ag_acces` | www.remaxacces.com | nos-proprietes | 140 | 622 | 482 | 2026-08-18 00:15 | ✅ | | |
| 44 | +| `remax_ag_action` | remax-action.ca | nos-proprietes | 85 | 1 361 | 1 276 | 2026-08-18 00:15 | ✅ | | |
| 45 | +| `remax_ag_alliance` | www.remax-alliance.ca | nos-proprietes | 183 | 1 258 | 1 075 | 2026-08-18 00:15 | ✅ | | |
| 46 | +| `remax_ag_avantages` | www.remax-avantages.com | nos-proprietes | 177 | 772 | 595 | 2026-08-18 00:15 | ✅ | | |
| 47 | +| `remax_ag_avanttout` | www.remaxavanttout.com | nos-proprietes | 37 | 404 | 367 | 2026-08-18 00:15 | ✅ | | |
| 48 | +| `remax_ag_cite` | remax-cite.com | nos-proprietes | 12 | 116 | 104 | 2026-08-18 00:15 | ✅ | | |
| 49 | +| `remax_ag_crystal` | remaxcrystal.com | nos-proprietes | 168 | 1 305 | 1 137 | 2026-08-18 00:15 | ✅ | | |
| 50 | +| `remax_ag_d_ici` | remaxdici.com | nos-proprietes | 131 | 871 | 740 | 2026-08-18 00:15 | ✅ | | |
| 51 | +| `remax_ag_dabord` | www.remax-dabord.com | centris-other | 126 | 796 | 670 | 2026-08-18 00:15 | ✅ | | |
| 52 | +| `remax_ag_defi` | remax-defi1996.com | nos-proprietes | 27 | 348 | 321 | 2026-08-18 00:15 | ✅ | | |
| 53 | +| `remax_ag_defrancheville` | remaxdefrancheville.com | nos-proprietes | 168 | 1 461 | 1 293 | 2026-08-18 00:15 | ✅ | | |
| 54 | +| `remax_ag_direct` | remax-direct.com | nos-proprietes | 28 | 1 068 | 1 040 | 2026-08-18 00:15 | ✅ | | |
| 55 | +| `remax_ag_distinction` | remaxdistinction.com | nos-proprietes | 27 | 149 | 122 | 2026-08-18 00:15 | ✅ | | |
| 56 | +| `remax_ag_ducartier` | www.remaxducartier.com | centris-other | 237 | 1 860 | 1 623 | 2026-08-18 00:15 | ✅ | | |
| 57 | +| `remax_ag_ducartieractif` | www.remaxactif.com | centris-other | 25 | 119 | 94 | 2026-08-18 00:15 | ✅ | | |
| 58 | +| `remax_ag_ducartierbonjour` | remaxbonjour.com | centris-other | 120 | 1 548 | 1 428 | 2026-08-18 00:15 | ✅ | | |
| 59 | +| `remax_ag_dynamique` | remaxdynamique.com | nos-proprietes | 3 | 151 | 148 | 2026-08-18 00:15 | ✅ | | |
| 60 | +| `remax_ag_dynastie` | remax-dynastie.com | centris-other | 9 | 240 | 231 | 2026-08-18 00:15 | ✅ | | |
| 61 | +| `remax_ag_elegance` | remax-elegance.ca | nos-proprietes | 13 | 87 | 74 | 2026-08-18 00:15 | ✅ | | |
| 62 | +| `remax_ag_elite` | remax-elite.ca | nos-proprietes | 83 | 856 | 773 | 2026-08-18 00:15 | ✅ | | |
| 63 | +| `remax_ag_energie` | remax-energie.com | nos-proprietes | 8 | 173 | 165 | 2026-08-18 00:15 | ✅ | | |
| 64 | +| `remax_ag_evolution` | remax-evolution.com | centris-other | 39 | 494 | 455 | 2026-08-18 00:15 | ✅ | | |
| 65 | +| `remax_ag_excellence` | remax-excellence.ca | nos-proprietes | 6 | 286 | 280 | 2026-08-18 00:15 | ✅ | | |
| 66 | +| `remax_ag_extra` | remax-extra.ca | centris-other | 122 | 672 | 550 | 2026-08-18 00:15 | ✅ | | |
| 67 | +| `remax_ag_fortindelage` | remaxfortindelage.com | nos-proprietes | 67 | 408 | 341 | 2026-08-18 00:15 | ✅ | | |
| 68 | +| `remax_ag_futur` | remax-futur.ca | centris-other | 4 | 197 | 193 | 2026-08-18 00:15 | ✅ | | |
| 69 | +| `remax_ag_harmonie` | remaxharmonie.com | nos-proprietes | 58 | 376 | 318 | 2026-08-18 00:15 | ✅ | | |
| 70 | +| `remax_ag_harricana` | remax-harricana.com | nos-proprietes | 6 | 155 | 149 | 2026-08-18 00:16 | ✅ | | |
| 71 | +| `remax_ag_horizon` | remax-horizon.ca | nos-proprietes | 94 | 466 | 372 | 2026-08-18 00:16 | ✅ | | |
| 72 | +| `remax_ag_imagine` | remax-imagineprivilege.com | nos-proprietes | 64 | 457 | 393 | 2026-08-18 00:16 | ✅ | | |
| 73 | +| `remax_ag_immobilia` | remaximmobilia.ca | nos-proprietes | 0 | 7 | 7 | 2026-08-18 00:16 | ✅ | | |
| 74 | +| `remax_ag_immobilierplus` | remax-immobilierplus.com | nos-proprietes | 5 | 56 | 51 | 2026-08-18 00:16 | ✅ | | |
| 75 | +| `remax_ag_infinite` | remax-infinite.com | nos-proprietes | 2 | 61 | 59 | 2026-08-18 00:16 | ✅ | | |
| 76 | +| `remax_ag_invest` | remaxinvest.ca | nos-proprietes | 0 | 1 | 1 | 2026-08-18 00:16 | ✅ | | |
| 77 | +| `remax_ag_lespace` | www.remaxlespace.com | nos-proprietes | 41 | 472 | 431 | 2026-08-18 00:16 | ✅ | | |
| 78 | +| `remax_ag_lespace_commercial` | remaxlespace.com | nos-proprietes | 0 | 472 | 472 | 2026-08-18 00:16 | ✅ | | |
| 79 | +| `remax_ag_performance` | remaxperformance.net | nos-proprietes | 20 | 204 | 184 | 2026-08-18 00:16 | ✅ | | |
| 80 | +| `remax_ag_platine` | www.remax-platine.com | nos-proprietes | 107 | 1 313 | 1 206 | 2026-08-18 00:16 | ✅ | | |
| 81 | +| `remax_ag_plus` | remaxplus.ca | nos-proprietes | 71 | 349 | 278 | 2026-08-18 00:16 | ✅ | | |
| 82 | +| `remax_ag_prestige` | remaxprestige.ca | nos-proprietes | 94 | 482 | 388 | 2026-08-18 00:16 | ✅ | | |
| 83 | +| `remax_ag_privilege` | remax-imagineprivilege.com | nos-proprietes | 0 | 457 | 457 | 2026-08-18 00:16 | ✅ | | |
| 84 | +| `remax_ag_professionnel` | www.remax-professionnel.com | nos-proprietes | 81 | 729 | 648 | 2026-08-18 00:16 | ✅ | | |
| 85 | +| `remax_ag_renaissance` | remax-renaissance.ca | nos-proprietes | 36 | 302 | 266 | 2026-08-18 00:16 | ✅ | | |
| 86 | +| `remax_ag_royaljordan` | remax-royaljordan.com | nos-proprietes | 134 | 1 307 | 1 173 | 2026-08-18 00:16 | ✅ | | |
| 87 | +| `remax_ag_signature` | remaxsignature.ca | nos-proprietes | 88 | 569 | 481 | 2026-08-18 00:16 | ✅ | | |
| 88 | +| `remax_ag_vision` | remaxvision.ca | nos-proprietes | 31 | 1 074 | 1 043 | 2026-08-18 00:16 | ✅ | | |
| 89 | + | |
| 90 | +Entrées du registre sans connecteur instancié (2) : `remax-pro-commercial.ca`, `nancyforlini.com` | |
| 91 | + | |
| 92 | +## Volumétrie & complétude agrégées (famille, BD live) | |
| 93 | + | |
| 94 | +| Indicateur | Valeur | | |
| 95 | +|---|---| | |
| 96 | +| Annonces en base (toutes) | 31 174 | | |
| 97 | +| Actives | 29 878 | | |
| 98 | +| Visibles (après dédup) | 3 349 | | |
| 99 | +| Masquées par la dédup | 26 529 | | |
| 100 | +| GPS (lat/lng) | 96.8 % | | |
| 101 | +| Photos | 0.0 % | | |
| 102 | +| Prix | 0.0 % | | |
| 103 | +| CAC (chambres) | 7.9 % | | |
| 104 | +| SDB (salles de bains) | 0.0 % | | |
| 105 | +| Année de construction | 87.1 % (dont rôle : 100.0 %) | | |
| 106 | +| Taxes / évaluation municipale | 0.0 % | | |
| 107 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 108 | + | |
added
docs/connecteurs/famille-source-immo.md
+57 −0
@@ -0,0 +1,57 @@ | ||
| 1 | +# Famille source.immo (agences indépendantes) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +Agences indépendantes servies par la plateforme source.immo (comptes/API dans `data/source_immo_agencies.json`). | |
| 6 | + | |
| 7 | +- Registre : `data/source_immo_agencies.json` — **6 entrées** | |
| 8 | +- Connecteurs instanciés : **6** | |
| 9 | +- Module : `immoka/connectors/agences_source_immo.py` | |
| 10 | + | |
| 11 | +**En-tête du module :** | |
| 12 | + | |
| 13 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 14 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 15 | +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme | |
| 16 | +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC | |
| 17 | +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à | |
| 18 | +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique | |
| 19 | +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences | |
| 20 | +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES — | |
| 21 | +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_). | |
| 22 | +> EXCEPTION : les équipes/agences dont une partie des inscriptions est | |
| 23 | +> co-listée avec une bannière couverte (co-inscription Centris) portent un id | |
| 24 | +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%) | |
| 25 | +> masque leurs doublons tout en gardant leurs fiches uniques visibles. | |
| 26 | +> Un connecteur par agence est généré depuis data/source_immo_agencies.json. | |
| 27 | + | |
| 28 | +## Membres et statuts | |
| 29 | + | |
| 30 | +| source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK | | |
| 31 | +|---|---|---|---|---|---|---|---| | |
| 32 | +| [`domicilia`](domicilia.md) | — | source.immo | 1 445 | 1 445 | 0 | 2026-08-18 02:27 | ✅ | | |
| 33 | +| [`gaillardetz`](gaillardetz.md) | — | source.immo | 13 | 13 | 0 | 2026-08-18 02:27 | ✅ | | |
| 34 | +| [`immodev`](immodev.md) | — | source.immo | 92 | 92 | 0 | 2026-08-18 02:27 | ✅ | | |
| 35 | +| [`niddamour`](niddamour.md) | — | source.immo | 0 | 0 | 0 | 2026-08-18 02:27 | ✅ | | |
| 36 | +| [`realta`](realta.md) | — | source.immo | 82 | 82 | 0 | 2026-08-18 02:27 | ✅ | | |
| 37 | +| [`si_ag_theagency`](si_ag_theagency.md) | — | source.immo | 245 | 304 | 59 | 2026-08-18 02:27 | ✅ | | |
| 38 | + | |
| 39 | +Entrées du registre sans connecteur instancié (6) : `www.realta.ca`, `www.immodev.ca`, `www.gaillardetz.ca`, `www.domicilia.com`, `www.niddamour.ca`, `theagencymontreal.com` | |
| 40 | + | |
| 41 | +## Volumétrie & complétude agrégées (famille, BD live) | |
| 42 | + | |
| 43 | +| Indicateur | Valeur | | |
| 44 | +|---|---| | |
| 45 | +| Annonces en base (toutes) | 1 984 | | |
| 46 | +| Actives | 1 936 | | |
| 47 | +| Visibles (après dédup) | 1 877 | | |
| 48 | +| Masquées par la dédup | 59 | | |
| 49 | +| GPS (lat/lng) | 99.9 % | | |
| 50 | +| Photos | 100.0 % | | |
| 51 | +| Prix | 100.0 % | | |
| 52 | +| CAC (chambres) | 66.3 % | | |
| 53 | +| SDB (salles de bains) | 64.6 % | | |
| 54 | +| Année de construction | 75.4 % (dont rôle : 6.6 %) | | |
| 55 | +| Taxes / évaluation municipale | 89.3 % | | |
| 56 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 57 | + | |
added
docs/connecteurs/famille-via-ag.md
+54 −0
@@ -0,0 +1,54 @@ | ||
| 1 | +# Famille Via Capitale agences (`via_ag_*`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +Connecteurs par bannière Via Capitale, générés depuis `data/via_capitale_agencies.json` (comptes API source.immo par agence). | |
| 6 | + | |
| 7 | +- Registre : `data/via_capitale_agencies.json` — **5 entrées** | |
| 8 | +- Connecteurs instanciés : **4** | |
| 9 | +- Module : `immoka/connectors/via_capitale_agences.py` | |
| 10 | + | |
| 11 | +**En-tête du module :** | |
| 12 | + | |
| 13 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 14 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 15 | +> connectors/via_capitale_agences.py : Via Capitale par SOUS-AGENCES (robuste) | |
| 16 | +> Le portail central viacapitalevendu.com est derrière Cloudflare (scrape | |
| 17 | +> fragile, 1 page). Les sous-agences Via Capitale (Élite, Sélect, du Mont-Royal, | |
| 18 | +> Accès…) tournent chacune sur la plateforme source.immo (plugin WordPress), | |
| 19 | +> dont l'API publique (api-v1.source.immo) est stable et paginée — même | |
| 20 | +> mécanique que Vendirect (voir sourceimmo.py). On génère une classe par | |
| 21 | +> sous-agence depuis data/via_capitale_agencies.json ; le n° Centris | |
| 22 | +> (ref_number) sert de clé de déduplication (voir web.py, sources « %_ag_% »). | |
| 23 | +> La config publique de chaque site est à | |
| 24 | +> /wp-content/uploads/_sourceimmo/_configs.json (account_id/api_key/app_id + | |
| 25 | +> default_view). Le registre est régénérable par scripts/refresh_via_capitale. | |
| 26 | + | |
| 27 | +## Membres et statuts | |
| 28 | + | |
| 29 | +| source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK | | |
| 30 | +|---|---|---|---|---|---|---|---| | |
| 31 | +| [`via_ag_acces`](via_ag_acces.md) | — | source.immo | 31 | 181 | 150 | 2026-08-18 00:27 | ✅ | | |
| 32 | +| [`via_ag_elite`](via_ag_elite.md) | — | source.immo | 11 | 319 | 308 | 2026-08-18 00:28 | ✅ | | |
| 33 | +| `via_ag_partenaires` | — | source.immo | 23 | 444 | 421 | 2026-08-18 00:28 | ✅ | | |
| 34 | +| [`via_ag_select`](via_ag_select.md) | — | source.immo | 17 | 580 | 563 | 2026-08-18 00:28 | ✅ | | |
| 35 | + | |
| 36 | +Entrées du registre sans connecteur instancié (5) : `viacapitaleacces.com`, `viacapitaledumontroyal.com`, `viacapitaleelite.immo`, `viacapitalepartenaires.com`, `viacapitaleselect.com` | |
| 37 | + | |
| 38 | +## Volumétrie & complétude agrégées (famille, BD live) | |
| 39 | + | |
| 40 | +| Indicateur | Valeur | | |
| 41 | +|---|---| | |
| 42 | +| Annonces en base (toutes) | 1 580 | | |
| 43 | +| Actives | 1 524 | | |
| 44 | +| Visibles (après dédup) | 82 | | |
| 45 | +| Masquées par la dédup | 1 442 | | |
| 46 | +| GPS (lat/lng) | 100.0 % | | |
| 47 | +| Photos | 100.0 % | | |
| 48 | +| Prix | 100.0 % | | |
| 49 | +| CAC (chambres) | 67.1 % | | |
| 50 | +| SDB (salles de bains) | 62.2 % | | |
| 51 | +| Année de construction | 93.9 % (dont rôle : 10.4 %) | | |
| 52 | +| Taxes / évaluation municipale | 89.0 % | | |
| 53 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 54 | + | |
added
docs/connecteurs/gaillardetz.md
+59 −0
@@ -0,0 +1,59 @@ | ||
| 1 | +# Gaillardetz Agence Immobilière (`gaillardetz`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.gaillardetz.ca | |
| 8 | +- **Recherche** : https://www.gaillardetz.ca/proprietes/ | |
| 9 | +- **Couverture** : Agence indépendante (Québec) | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). 13 propriétés à vendre. Généré par agences_source_immo.py. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/agences_source_immo.py` — classe `AgenceSIGaillardetz` | |
| 18 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme | |
| 25 | +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC | |
| 26 | +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à | |
| 27 | +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique | |
| 28 | +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences | |
| 29 | +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES — | |
| 30 | +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_). | |
| 31 | +> EXCEPTION : les équipes/agences dont une partie des inscriptions est | |
| 32 | +> co-listée avec une bannière couverte (co-inscription Centris) portent un id | |
| 33 | +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%) | |
| 34 | +> masque leurs doublons tout en gardant leurs fiches uniques visibles. | |
| 35 | +> Un connecteur par agence est généré depuis data/source_immo_agencies.json. | |
| 36 | + | |
| 37 | +## Volumétrie & complétude (BD live) | |
| 38 | + | |
| 39 | +| Indicateur | Valeur | | |
| 40 | +|---|---| | |
| 41 | +| Annonces en base (toutes) | 13 | | |
| 42 | +| Actives | 13 | | |
| 43 | +| Visibles (après dédup) | 13 | | |
| 44 | +| Masquées par la dédup | 0 | | |
| 45 | +| GPS (lat/lng) | 100.0 % | | |
| 46 | +| Photos | 100.0 % | | |
| 47 | +| Prix | 100.0 % | | |
| 48 | +| CAC (chambres) | 0.0 % | | |
| 49 | +| SDB (salles de bains) | 0.0 % | | |
| 50 | +| Année de construction | 92.3 % (dont rôle : 16.7 %) | | |
| 51 | +| Taxes / évaluation municipale | 100.0 % | | |
| 52 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 53 | + | |
| 54 | +## Synchronisation | |
| 55 | + | |
| 56 | +- **Dernier sync** : 2026-08-18 02:27 — trouvé 13, +0 / ~0 / -0 — OK | |
| 57 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 58 | + | |
| 59 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/glmc_ag_qc.md
+59 −0
@@ -0,0 +1,59 @@ | ||
| 1 | +# Les Immeubles GLMC (`glmc_ag_qc`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.glmc.ca | |
| 8 | +- **Recherche** : https://www.glmc.ca/proprietes/ | |
| 9 | +- **Couverture** : Rivière-du-Loup / KRTB / Témiscouata / Les Basques (Bas-Saint-Laurent) | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> WordPress (thème X), liste SSR paginée ?_paged=N (60/page). Carte: URL /{slug}-{Centris}/, adresse, ville, prix, photo ; détail enrichi (JSON-LD + tableau Centris). source_id _ag_ = dédup Centris. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/glmc.py` — classe `GlmcConnector` | |
| 18 | +- Délai entre requêtes : 0.4 s ; cache détail BD : oui | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_GLMC_DETAIL_LIMIT` (défaut 250) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/glmc.py : Les Immeubles GLMC (glmc.ca) — Rivière-du-Loup + KRTB / | |
| 26 | +> Témiscouata / Les Basques (Bas-Saint-Laurent). Plus grosse agence | |
| 27 | +> indépendante de l'Est du Québec. Site WordPress (plugin mw-centris, thème X), | |
| 28 | +> liste rendue SERVEUR sur /proprietes/, paginée par ?pg=N (60/page, ~176 | |
| 29 | +> fiches). Chaque carte : lien /proprietes/{adresse-slug}-{n°Centris}/ (le n° | |
| 30 | +> Centris termine le slug), adresse+ville, photo. Prix/chambres via la page | |
| 31 | +> détail (enrichissement plafonné + cache). La section « Vendus » (fiches | |
| 32 | +> vendues, après la pagination) est exclue du parsing. | |
| 33 | +> source_id « glmc_ag_qc » : infixe _ag_ = dédup Centris (db.refresh_dedup) — | |
| 34 | +> si le n° Centris est déjà porté par une bannière couverte, la fiche est | |
| 35 | +> masquée ; les inscriptions propres de GLMC restent visibles. | |
| 36 | + | |
| 37 | +## Volumétrie & complétude (BD live) | |
| 38 | + | |
| 39 | +| Indicateur | Valeur | | |
| 40 | +|---|---| | |
| 41 | +| Annonces en base (toutes) | 177 | | |
| 42 | +| Actives | 176 | | |
| 43 | +| Visibles (après dédup) | 176 | | |
| 44 | +| Masquées par la dédup | 0 | | |
| 45 | +| GPS (lat/lng) | 63.1 % | | |
| 46 | +| Photos | 100.0 % | | |
| 47 | +| Prix | 99.4 % | | |
| 48 | +| CAC (chambres) | 0.0 % | | |
| 49 | +| SDB (salles de bains) | 0.0 % | | |
| 50 | +| Année de construction | 36.4 % (dont rôle : 1.6 %) | | |
| 51 | +| Taxes / évaluation municipale | 52.8 % | | |
| 52 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 53 | + | |
| 54 | +## Synchronisation | |
| 55 | + | |
| 56 | +- **Dernier sync** : 2026-08-18 02:40 — trouvé 176, +0 / ~0 / -1 — OK | |
| 57 | +- **Erreurs récentes** : 0 sur les 4 derniers syncs | |
| 58 | + | |
| 59 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/image_ag_qc.md
+55 −0
@@ -0,0 +1,55 @@ | ||
| 1 | +# Image, l'agence immobilière (`image_ag_qc`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://agenceimage.ca | |
| 8 | +- **Recherche** : https://agenceimage.ca/mes-proprietes/ | |
| 9 | +- **Couverture** : Saguenay–Lac-Saint-Jean (Saguenay, Jonquière, Roberval, Dolbeau) | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Plateforme Yoamo (ID-3) + photos Centris. /mes-proprietes/ rend tout en SSR : data-filter-* (prix, ville, genre, chambres/sdb) + data-geo-lat/lng. source_id _ag_ = dédup Centris. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/agenceimage.py` — classe `AgenceImageConnector` | |
| 18 | +- Délai entre requêtes : 0.5 s ; cache détail BD : oui | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/agenceimage.py : Image, l'agence immobilière (agenceimage.ca) — | |
| 25 | +> Saguenay, Jonquière, Roberval, Dolbeau-Mistassini, Lac-Saint-Jean. | |
| 26 | +> Plateforme Yoamo (ID-3 Innovations) + photos Centris. La page /mes-proprietes/ | |
| 27 | +> rend TOUT l'inventaire côté serveur : chaque carte porte n° Centris (rel/URL), | |
| 28 | +> type + ville (dans l'URL et l'alt), coordonnées (data-geo-lat/lng), prix et | |
| 29 | +> photo (yoamo.immo/ALSPicture.axd?propId={Centris}). | |
| 30 | +> source_id « image_ag_qc » : infixe _ag_ = dédup Centris (db.refresh_dedup) — | |
| 31 | +> masque les fiches déjà portées par une bannière couverte au Saguenay–LSJ. | |
| 32 | + | |
| 33 | +## Volumétrie & complétude (BD live) | |
| 34 | + | |
| 35 | +| Indicateur | Valeur | | |
| 36 | +|---|---| | |
| 37 | +| Annonces en base (toutes) | 77 | | |
| 38 | +| Actives | 77 | | |
| 39 | +| Visibles (après dédup) | 77 | | |
| 40 | +| Masquées par la dédup | 0 | | |
| 41 | +| GPS (lat/lng) | 100.0 % | | |
| 42 | +| Photos | 100.0 % | | |
| 43 | +| Prix | 100.0 % | | |
| 44 | +| CAC (chambres) | 100.0 % | | |
| 45 | +| SDB (salles de bains) | 100.0 % | | |
| 46 | +| Année de construction | 0.0 % | | |
| 47 | +| Taxes / évaluation municipale | 0.0 % | | |
| 48 | +| Estimation Vrai-Prix (rôle) | 0.0 % | | |
| 49 | + | |
| 50 | +## Synchronisation | |
| 51 | + | |
| 52 | +- **Dernier sync** : 2026-08-18 02:27 — trouvé 77, +0 / ~0 / -0 — OK | |
| 53 | +- **Erreurs récentes** : 0 sur les 4 derniers syncs | |
| 54 | + | |
| 55 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/imcha_ag_qc.md
+55 −0
@@ -0,0 +1,55 @@ | ||
| 1 | +# Les Immeubles Charlevoix (`imcha_ag_qc`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.imcha.com | |
| 8 | +- **Recherche** : https://www.imcha.com/vente-de-proprietes/page-1 | |
| 9 | +- **Couverture** : Charlevoix (Baie-Saint-Paul, La Malbaie, Les Éboulements) + Côte-de-Beaupré | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Site custom SSR, liste paginée /vente-de-proprietes/page-N. Carte li.estate-single: type, ville, prix (souvent « Prix sur demande » à Charlevoix), chambres, photo. n° Centris extrait du nom de fichier photo (/uploads/photos/…/{Centris}-…) → dédup. source_id _ag_. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/imcha.py` — classe `ImchaConnector` | |
| 18 | +- Délai entre requêtes : 0.4 s ; cache détail BD : oui | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/imcha.py : Les Immeubles Charlevoix (imcha.com) — Baie-Saint-Paul, | |
| 25 | +> La Malbaie, Les Éboulements, Petite-Rivière-Saint-François + Vieux-Québec / | |
| 26 | +> Côte-de-Beaupré. Seule agence indépendante crédible de Charlevoix. Site | |
| 27 | +> custom rendu SERVEUR, liste paginée /vente-de-proprietes/page-N. Chaque carte | |
| 28 | +> (li.estate-single) porte : code interne, type, ville, prix, chambres et | |
| 29 | +> photo. Le n° Centris est encodé dans le nom de fichier photo | |
| 30 | +> (/uploads/photos/max/{Centris}-…) → clé de déduplication. | |
| 31 | +> source_id « imcha_ag_qc » : infixe _ag_ = dédup Centris (db.refresh_dedup). | |
| 32 | + | |
| 33 | +## Volumétrie & complétude (BD live) | |
| 34 | + | |
| 35 | +| Indicateur | Valeur | | |
| 36 | +|---|---| | |
| 37 | +| Annonces en base (toutes) | 111 | | |
| 38 | +| Actives | 111 | | |
| 39 | +| Visibles (après dédup) | 107 | | |
| 40 | +| Masquées par la dédup | 4 | | |
| 41 | +| GPS (lat/lng) | 0.0 % | | |
| 42 | +| Photos | 100.0 % | | |
| 43 | +| Prix | 41.1 % | | |
| 44 | +| CAC (chambres) | 61.7 % | | |
| 45 | +| SDB (salles de bains) | 0.0 % | | |
| 46 | +| Année de construction | 0.0 % | | |
| 47 | +| Taxes / évaluation municipale | 0.0 % | | |
| 48 | +| Estimation Vrai-Prix (rôle) | 0.0 % | | |
| 49 | + | |
| 50 | +## Synchronisation | |
| 51 | + | |
| 52 | +- **Dernier sync** : 2026-08-18 02:40 — trouvé 111, +0 / ~0 / -0 — OK | |
| 53 | +- **Erreurs récentes** : 0 sur les 3 derniers syncs | |
| 54 | + | |
| 55 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/immodev.md
+59 −0
@@ -0,0 +1,59 @@ | ||
| 1 | +# Immodev Agence Immobilière (`immodev`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.immodev.ca | |
| 8 | +- **Recherche** : https://www.immodev.ca/proprietes/ | |
| 9 | +- **Couverture** : Agence indépendante (Québec) | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). 93 propriétés à vendre. Généré par agences_source_immo.py. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/agences_source_immo.py` — classe `AgenceSIImmodev` | |
| 18 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme | |
| 25 | +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC | |
| 26 | +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à | |
| 27 | +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique | |
| 28 | +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences | |
| 29 | +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES — | |
| 30 | +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_). | |
| 31 | +> EXCEPTION : les équipes/agences dont une partie des inscriptions est | |
| 32 | +> co-listée avec une bannière couverte (co-inscription Centris) portent un id | |
| 33 | +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%) | |
| 34 | +> masque leurs doublons tout en gardant leurs fiches uniques visibles. | |
| 35 | +> Un connecteur par agence est généré depuis data/source_immo_agencies.json. | |
| 36 | + | |
| 37 | +## Volumétrie & complétude (BD live) | |
| 38 | + | |
| 39 | +| Indicateur | Valeur | | |
| 40 | +|---|---| | |
| 41 | +| Annonces en base (toutes) | 93 | | |
| 42 | +| Actives | 92 | | |
| 43 | +| Visibles (après dédup) | 92 | | |
| 44 | +| Masquées par la dédup | 0 | | |
| 45 | +| GPS (lat/lng) | 100.0 % | | |
| 46 | +| Photos | 100.0 % | | |
| 47 | +| Prix | 100.0 % | | |
| 48 | +| CAC (chambres) | 8.7 % | | |
| 49 | +| SDB (salles de bains) | 1.1 % | | |
| 50 | +| Année de construction | 64.1 % (dont rôle : 15.3 %) | | |
| 51 | +| Taxes / évaluation municipale | 95.7 % | | |
| 52 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 53 | + | |
| 54 | +## Synchronisation | |
| 55 | + | |
| 56 | +- **Dernier sync** : 2026-08-18 02:27 — trouvé 92, +0 / ~0 / -0 — OK | |
| 57 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 58 | + | |
| 59 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/kijiji.md
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +# Kijiji Québec (`kijiji`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.kijiji.ca/b-maison-a-vendre/quebec/c35l9001 | |
| 8 | +- **Statut** : actif | |
| 9 | + | |
| 10 | +> Petites annonces — catégories immobilier à vendre QC seulement (maisons c35, condos c643, terrains c641), __NEXT_DATA__/Apollo. | |
| 11 | + | |
| 12 | +## Mécanique (introspection du code) | |
| 13 | + | |
| 14 | +- Module : `immoka/connectors/kijiji.py` — classe `KijijiConnector` | |
| 15 | +- Délai entre requêtes : 1.2 s ; cache détail BD : oui | |
| 16 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_KIJIJI_MAX_PAGES` (défaut 100), `IMMOKA_KIJIJI_DETAIL_LIMIT` (défaut 400) | |
| 17 | + | |
| 18 | +**En-tête du module :** | |
| 19 | + | |
| 20 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 21 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 22 | +> connectors/kijiji.py : Kijiji (kijiji.ca) — petites annonces immobilières | |
| 23 | +> UNIQUEMENT les catégories immobilier À VENDRE, UNIQUEMENT le Québec (l9001) : | |
| 24 | +> c35 maisons à vendre · c643 condos à vendre · c641 terrains à vendre | |
| 25 | +> Les pages listent 40+ annonces dans __NEXT_DATA__ (Apollo state) avec titre, | |
| 26 | +> prix, GPS, adresse et vignette — aucune API privée nécessaire. | |
| 27 | + | |
| 28 | +## Volumétrie & complétude (BD live) | |
| 29 | + | |
| 30 | +| Indicateur | Valeur | | |
| 31 | +|---|---| | |
| 32 | +| Annonces en base (toutes) | 8 113 | | |
| 33 | +| Actives | 7 109 | | |
| 34 | +| Visibles (après dédup) | 7 104 | | |
| 35 | +| Masquées par la dédup | 5 | | |
| 36 | +| GPS (lat/lng) | 100.0 % | | |
| 37 | +| Photos | 99.8 % | | |
| 38 | +| Prix | 98.1 % | | |
| 39 | +| CAC (chambres) | 82.6 % | | |
| 40 | +| SDB (salles de bains) | 63.7 % | | |
| 41 | +| Année de construction | 4.2 % (dont rôle : 0.0 %) | | |
| 42 | +| Taxes / évaluation municipale | 0.0 % | | |
| 43 | +| Estimation Vrai-Prix (rôle) | 6.4 % | | |
| 44 | + | |
| 45 | +## Synchronisation | |
| 46 | + | |
| 47 | +- **Dernier sync** : 2026-08-18 02:59 — trouvé 7 107, +0 / ~7107 / -3 — OK | |
| 48 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 49 | + | |
| 50 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/kw_distinction.md
+54 −0
@@ -0,0 +1,54 @@ | ||
| 1 | +# Keller Williams Distinction (`kw_distinction`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.kwdistinction.com | |
| 8 | +- **Recherche** : https://www.kwdistinction.com/sitemap.xml | |
| 9 | +- **Couverture** : Gatineau / Outaouais | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> ASP.NET (tonikwebstudio) : grille/fiche en AJAX (prix/photos non rendus statiquement, ni fiablement via Firecrawl). Enumération via sitemap.xml (167 propr.) ; slug d'URL = ville/type/chambres/rue/no-Centris. Champs liste: adresse, ville, secteur, type, chambres, Centris. Prix/photos NON dispo. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/kw_distinction.py` — classe `KwDistinctionConnector` | |
| 18 | +- Délai entre requêtes : 0.5 s ; cache détail BD : oui | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/kw_distinction.py : Keller Williams Distinction (Gatineau/Outaouais) | |
| 25 | +> Site ASP.NET (plateforme tonikwebstudio) : la grille de résultats et les | |
| 26 | +> fiches détail sont rendues via AJAX/UpdatePanel (prix et photos absents du | |
| 27 | +> HTML statique, et non rendus de façon fiable même par Firecrawl). En revanche | |
| 28 | +> le sitemap.xml énumère TOUTES les propriétés, et l'URL encode ville, type, | |
| 29 | +> nombre de chambres, rue et numéro Centris — de quoi bâtir une fiche solide | |
| 30 | +> au niveau liste. Le numéro Centris sert de clé de déduplication. | |
| 31 | + | |
| 32 | +## Volumétrie & complétude (BD live) | |
| 33 | + | |
| 34 | +| Indicateur | Valeur | | |
| 35 | +|---|---| | |
| 36 | +| Annonces en base (toutes) | 167 | | |
| 37 | +| Actives | 167 | | |
| 38 | +| Visibles (après dédup) | 167 | | |
| 39 | +| Masquées par la dédup | 0 | | |
| 40 | +| GPS (lat/lng) | 98.8 % | | |
| 41 | +| Photos | 0.0 % | | |
| 42 | +| Prix | 0.0 % | | |
| 43 | +| CAC (chambres) | 94.0 % | | |
| 44 | +| SDB (salles de bains) | 0.0 % | | |
| 45 | +| Année de construction | 0.0 % | | |
| 46 | +| Taxes / évaluation municipale | 0.0 % | | |
| 47 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 48 | + | |
| 49 | +## Synchronisation | |
| 50 | + | |
| 51 | +- **Dernier sync** : 2026-08-18 02:59 — trouvé 167, +0 / ~0 / -0 — OK | |
| 52 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 53 | + | |
| 54 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/kw_prestige.md
+54 −0
@@ -0,0 +1,54 @@ | ||
| 1 | +# Keller Williams Prestige (`kw_prestige`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.kwprestige.com | |
| 8 | +- **Recherche** : https://www.kwprestige.com/sitemap.xml | |
| 9 | +- **Couverture** : Grand Montréal — bannière KW prestige | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Grille/fiche en widget JS (pagination AJAX non exploitable). Enumeration via sitemap.xml (277 fiches a-vendre) ; slug URL = type-a-vendre-ville-secteur-{noCentris}-detail-Fr. Champs liste: type, ville, secteur, n Centris. Prix/photos = widget JS (list cards rendus serveur mais pagination JS ; enrichissement futur via Scrapfly js_scenario). | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/kw_prestige.py` — classe `KwPrestigeConnector` | |
| 18 | +- Délai entre requêtes : 0.4 s ; cache détail BD : oui | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/kw_prestige.py : Keller Williams Prestige (kwprestige.com) | |
| 25 | +> Bannière KW du Grand Montréal. La grille /fr/proprietes/ et les fiches détail | |
| 26 | +> sont rendues par un widget JS (pagination AJAX, pas d'URL exploitable). Mais | |
| 27 | +> le sitemap.xml expose TOUTES les fiches : URL | |
| 28 | +> « {type}-a-vendre-{ville-secteur}-{no-centris}-detail-Fr ». On énumère donc | |
| 29 | +> par le sitemap (rendu serveur, fiable) ; type/ville/secteur/n° Centris depuis | |
| 30 | +> le slug. external_id = n° Centris → déduplication. | |
| 31 | + | |
| 32 | +## Volumétrie & complétude (BD live) | |
| 33 | + | |
| 34 | +| Indicateur | Valeur | | |
| 35 | +|---|---| | |
| 36 | +| Annonces en base (toutes) | 277 | | |
| 37 | +| Actives | 277 | | |
| 38 | +| Visibles (après dédup) | 277 | | |
| 39 | +| Masquées par la dédup | 0 | | |
| 40 | +| GPS (lat/lng) | 0.0 % | | |
| 41 | +| Photos | 0.0 % | | |
| 42 | +| Prix | 0.0 % | | |
| 43 | +| CAC (chambres) | 0.0 % | | |
| 44 | +| SDB (salles de bains) | 0.0 % | | |
| 45 | +| Année de construction | 0.0 % | | |
| 46 | +| Taxes / évaluation municipale | 0.0 % | | |
| 47 | +| Estimation Vrai-Prix (rôle) | 0.0 % | | |
| 48 | + | |
| 49 | +## Synchronisation | |
| 50 | + | |
| 51 | +- **Dernier sync** : 2026-08-18 02:59 — trouvé 277, +0 / ~0 / -0 — OK | |
| 52 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 53 | + | |
| 54 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/kw_urbain.md
+51 −0
@@ -0,0 +1,51 @@ | ||
| 1 | +# Keller Williams Urbain (`kw_urbain`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.kwurbain.ca | |
| 8 | +- **Recherche** : https://www.kwurbain.ca/inscriptions/ | |
| 9 | +- **Couverture** : Grand Montréal + Rive-Sud/Rive-Nord | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Cartes HTML rendues serveur (plateforme realestate.marketingwebsites.ca) — 349 inscriptions sur une page. Champs: adresse, ville, région, prix, chambres, sdb, photo. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/kw_urbain.py` — classe `KwUrbainConnector` | |
| 18 | +- Délai entre requêtes : 0.6 s ; cache détail BD : oui | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_KW_DETAIL_LIMIT` (défaut 400) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/kw_urbain.py : Keller Williams Urbain (kwurbain.ca) | |
| 26 | +> Page /inscriptions rendue serveur : toutes les inscriptions de l'agence en | |
| 27 | +> cartes HTML (plateforme marketingwebsites.ca, commune aux bureaux KW Canada). | |
| 28 | + | |
| 29 | +## Volumétrie & complétude (BD live) | |
| 30 | + | |
| 31 | +| Indicateur | Valeur | | |
| 32 | +|---|---| | |
| 33 | +| Annonces en base (toutes) | 362 | | |
| 34 | +| Actives | 351 | | |
| 35 | +| Visibles (après dédup) | 351 | | |
| 36 | +| Masquées par la dédup | 0 | | |
| 37 | +| GPS (lat/lng) | 93.7 % | | |
| 38 | +| Photos | 100.0 % | | |
| 39 | +| Prix | 51.9 % | | |
| 40 | +| CAC (chambres) | 93.7 % | | |
| 41 | +| SDB (salles de bains) | 93.7 % | | |
| 42 | +| Année de construction | 68.7 % (dont rôle : 100.0 %) | | |
| 43 | +| Taxes / évaluation municipale | 52.7 % | | |
| 44 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 45 | + | |
| 46 | +## Synchronisation | |
| 47 | + | |
| 48 | +- **Dernier sync** : 2026-08-18 02:59 — trouvé 351, +0 / ~0 / -0 — OK | |
| 49 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 50 | + | |
| 51 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/lespac.md
+51 −0
@@ -0,0 +1,51 @@ | ||
| 1 | +# LesPAC Québec (`lespac`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.lespac.com/quebec/immobilier-achat-vente_b36k1R2.jsa | |
| 8 | +- **Statut** : actif | |
| 9 | + | |
| 10 | +> Petites annonces QC — immobilier achat-vente b37/b38/b39/b40/b41/b42 (pas location ni entreprises), searchResponse embarqué. | |
| 11 | + | |
| 12 | +## Mécanique (introspection du code) | |
| 13 | + | |
| 14 | +- Module : `immoka/connectors/lespac.py` — classe `LesPacConnector` | |
| 15 | +- Délai entre requêtes : 0.9 s ; cache détail BD : oui | |
| 16 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_LESPAC_DETAIL_LIMIT` (défaut 400) | |
| 17 | + | |
| 18 | +**En-tête du module :** | |
| 19 | + | |
| 20 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 21 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 22 | +> connectors/lespac.py : LesPAC (lespac.com) — petites annonces du Québec | |
| 23 | +> UNIQUEMENT l'immobilier ACHAT-VENTE (pas la location, pas les entreprises) : | |
| 24 | +> b37 résidentiel · b38 terrains · b39 commercial-industriel · | |
| 25 | +> b40 chalets · b41 fermes · b42 immeubles à revenus | |
| 26 | +> Les pages « /quebec/… _b{cat}k{page}R2.jsa » (toute la province) embarquent | |
| 27 | +> `var searchResponse = {…}` côté serveur : 20 annonces/page + totalPages. | |
| 28 | + | |
| 29 | +## Volumétrie & complétude (BD live) | |
| 30 | + | |
| 31 | +| Indicateur | Valeur | | |
| 32 | +|---|---| | |
| 33 | +| Annonces en base (toutes) | 4 343 | | |
| 34 | +| Actives | 4 132 | | |
| 35 | +| Visibles (après dédup) | 2 720 | | |
| 36 | +| Masquées par la dédup | 1 412 | | |
| 37 | +| GPS (lat/lng) | 46.3 % | | |
| 38 | +| Photos | 99.6 % | | |
| 39 | +| Prix | 97.8 % | | |
| 40 | +| CAC (chambres) | 54.3 % | | |
| 41 | +| SDB (salles de bains) | 15.6 % | | |
| 42 | +| Année de construction | 57.5 % (dont rôle : 0.0 %) | | |
| 43 | +| Taxes / évaluation municipale | 8.3 % | | |
| 44 | +| Estimation Vrai-Prix (rôle) | 69.7 % | | |
| 45 | + | |
| 46 | +## Synchronisation | |
| 47 | + | |
| 48 | +- **Dernier sync** : 2026-08-18 03:10 — trouvé 4 132, +0 / ~4132 / -0 — OK | |
| 49 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 50 | + | |
| 51 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/m_immobilier.md
+53 −0
@@ -0,0 +1,53 @@ | ||
| 1 | +# M Immobilier (`m_immobilier`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.mimmobilier.com | |
| 8 | +- **Recherche** : https://www.mimmobilier.com/properties | |
| 9 | +- **Couverture** : Grand Montréal — indépendante primée (Leading RE) | |
| 10 | +- **Type** : luxe | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Cartes HTML rendues serveur (/properties, PAS /proprietes). ~65 propriétés à vendre (locations filtrées). Champs: ville, adresse, prix, chambres, sdb, photos Centris, no Centris. Type non exposé. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/m_immobilier.py` — classe `MImmobilierConnector` | |
| 18 | +- Délai entre requêtes : 0.6 s ; cache détail BD : non | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_M_DETAIL_LIMIT` (défaut 300) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/m_immobilier.py : M Immobilier (mimmobilier.com) | |
| 26 | +> Agence indépendante de prestige (Grand Montréal), inscriptions Centris. | |
| 27 | +> La page /properties est rendue serveur : chaque carte « cardProperty » | |
| 28 | +> porte l'URL (avec no Centris), la ville, l'adresse, chambres, salles de | |
| 29 | +> bains, prix et les photos (/images/centris-slideshow/{id}-N-*.jpg). | |
| 30 | + | |
| 31 | +## Volumétrie & complétude (BD live) | |
| 32 | + | |
| 33 | +| Indicateur | Valeur | | |
| 34 | +|---|---| | |
| 35 | +| Annonces en base (toutes) | 84 | | |
| 36 | +| Actives | 67 | | |
| 37 | +| Visibles (après dédup) | 67 | | |
| 38 | +| Masquées par la dédup | 0 | | |
| 39 | +| GPS (lat/lng) | 94.0 % | | |
| 40 | +| Photos | 100.0 % | | |
| 41 | +| Prix | 98.5 % | | |
| 42 | +| CAC (chambres) | 94.0 % | | |
| 43 | +| SDB (salles de bains) | 94.0 % | | |
| 44 | +| Année de construction | 85.1 % (dont rôle : 100.0 %) | | |
| 45 | +| Taxes / évaluation municipale | 0.0 % | | |
| 46 | +| Estimation Vrai-Prix (rôle) | 98.5 % | | |
| 47 | + | |
| 48 | +## Synchronisation | |
| 49 | + | |
| 50 | +- **Dernier sync** : 2026-08-18 03:13 — trouvé 66, +0 / ~0 / -0 — OK | |
| 51 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 52 | + | |
| 53 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/niddamour.md
+46 −0
@@ -0,0 +1,46 @@ | ||
| 1 | +# Nid d'Amour Agence Immobilière (`niddamour`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.niddamour.ca | |
| 8 | +- **Recherche** : https://www.niddamour.ca/proprietes/ | |
| 9 | +- **Couverture** : Agence indépendante (Québec) | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : a_faire | |
| 12 | + | |
| 13 | +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). 0 propriétés à vendre. Généré par agences_source_immo.py. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/agences_source_immo.py` — classe `AgenceSINiddamour` | |
| 18 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme | |
| 25 | +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC | |
| 26 | +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à | |
| 27 | +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique | |
| 28 | +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences | |
| 29 | +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES — | |
| 30 | +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_). | |
| 31 | +> EXCEPTION : les équipes/agences dont une partie des inscriptions est | |
| 32 | +> co-listée avec une bannière couverte (co-inscription Centris) portent un id | |
| 33 | +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%) | |
| 34 | +> masque leurs doublons tout en gardant leurs fiches uniques visibles. | |
| 35 | +> Un connecteur par agence est généré depuis data/source_immo_agencies.json. | |
| 36 | + | |
| 37 | +## Volumétrie & complétude (BD live) | |
| 38 | + | |
| 39 | +_Aucune annonce en base pour cette source (voir la note du registre : couverture assurée ailleurs ou connecteur inactif)._ | |
| 40 | + | |
| 41 | +## Synchronisation | |
| 42 | + | |
| 43 | +- **Dernier sync** : 2026-08-18 02:27 — trouvé 0, +0 / ~0 / -0 — OK | |
| 44 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 45 | + | |
| 46 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/profusion.md
+53 −0
@@ -0,0 +1,53 @@ | ||
| 1 | +# Profusion Immobilier (Christie's) (`profusion`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.profusion.global | |
| 8 | +- **Recherche** : https://www.profusion.global/acheter/nos-inscriptions/ | |
| 9 | +- **Couverture** : Grand Montréal + province — luxe, affiliée Christie's | |
| 10 | +- **Type** : luxe | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> WordPress DIVI ; nos-inscriptions liste ~357 fiches /propriete/{no-centris}/ (HTML). Fiche = JSON-LD RealEstateListing (adresse, description, prix, courtier) + galerie profusionimmo.ca. Enrichissement cache+plafond (IMMOKA_PROFUSION_DETAIL_LIMIT). | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/profusion.py` — classe `ProfusionConnector` | |
| 18 | +- Délai entre requêtes : 0.5 s ; cache détail BD : oui | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_PROFUSION_DETAIL_LIMIT` (défaut 500) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/profusion.py : Profusion Immobilier (luxe, affilié Forbes/Christie's) | |
| 26 | +> Énumération : la page « nos-inscriptions » liste toutes les fiches en HTML | |
| 27 | +> rendu serveur, sous forme /propriete/{no-centris}/. Chaque fiche publie un | |
| 28 | +> JSON-LD RealEstateListing (adresse, description, prix, courtier) + un bloc | |
| 29 | +> de specs « Libellé: valeur » + une galerie profusionimmo.ca. | |
| 30 | + | |
| 31 | +## Volumétrie & complétude (BD live) | |
| 32 | + | |
| 33 | +| Indicateur | Valeur | | |
| 34 | +|---|---| | |
| 35 | +| Annonces en base (toutes) | 363 | | |
| 36 | +| Actives | 351 | | |
| 37 | +| Visibles (après dédup) | 351 | | |
| 38 | +| Masquées par la dédup | 0 | | |
| 39 | +| GPS (lat/lng) | 66.7 % | | |
| 40 | +| Photos | 70.7 % | | |
| 41 | +| Prix | 59.3 % | | |
| 42 | +| CAC (chambres) | 70.7 % | | |
| 43 | +| SDB (salles de bains) | 13.1 % | | |
| 44 | +| Année de construction | 61.5 % (dont rôle : 11.6 %) | | |
| 45 | +| Taxes / évaluation municipale | 0.0 % | | |
| 46 | +| Estimation Vrai-Prix (rôle) | 70.7 % | | |
| 47 | + | |
| 48 | +## Synchronisation | |
| 49 | + | |
| 50 | +- **Dernier sync** : 2026-08-18 03:14 — trouvé 351, +0 / ~0 / -0 — OK | |
| 51 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 52 | + | |
| 53 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/proprio_direct.md
+53 −0
@@ -0,0 +1,53 @@ | ||
| 1 | +# Proprio Direct (`proprio_direct`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://propriodirect.com | |
| 8 | +- **Recherche** : https://propriodirect.com/propriete-a-vendre/ | |
| 9 | +- **Couverture** : Toute la province — ~746 courtiers, agence unique (Bridgemarq) | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Feed DDF (CREA) servi par API JSON interne POST propriodirect.com/fr/api/searchListings (corps {from:offset}, 30/page, champ total). ~3201 propriétés à vendre, données complètes + galeries photos. Hôte canonique sans www. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/proprio_direct.py` — classe `ProprioDirectConnector` | |
| 18 | +- Délai entre requêtes : 0.4 s ; cache détail BD : non | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_PD_DETAIL_LIMIT` (défaut 400) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/proprio_direct.py : Proprio Direct (propriodirect.com) | |
| 26 | +> L'inventaire (alimenté par le feed DDF de CREA) est servi par une API JSON | |
| 27 | +> interne : POST https://propriodirect.com/fr/api/searchListings | |
| 28 | +> Corps { "from": <offset> } ; 30 résultats/page, champ `total`. Chaque item | |
| 29 | +> contient adresse, ville, région, prix, chambres, sdb, galerie photos et slug. | |
| 30 | + | |
| 31 | +## Volumétrie & complétude (BD live) | |
| 32 | + | |
| 33 | +| Indicateur | Valeur | | |
| 34 | +|---|---| | |
| 35 | +| Annonces en base (toutes) | 2 556 | | |
| 36 | +| Actives | 2 464 | | |
| 37 | +| Visibles (après dédup) | 2 464 | | |
| 38 | +| Masquées par la dédup | 0 | | |
| 39 | +| GPS (lat/lng) | 100.0 % | | |
| 40 | +| Photos | 100.0 % | | |
| 41 | +| Prix | 100.0 % | | |
| 42 | +| CAC (chambres) | 73.4 % | | |
| 43 | +| SDB (salles de bains) | 72.6 % | | |
| 44 | +| Année de construction | 67.5 % (dont rôle : 100.0 %) | | |
| 45 | +| Taxes / évaluation municipale | 90.3 % | | |
| 46 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 47 | + | |
| 48 | +## Synchronisation | |
| 49 | + | |
| 50 | +- **Dernier sync** : 2026-08-18 03:14 — trouvé 2 464, +0 / ~0 / -3 — OK | |
| 51 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 52 | + | |
| 53 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/realta.md
+59 −0
@@ -0,0 +1,59 @@ | ||
| 1 | +# Réalta Agence Immobilière (`realta`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.realta.ca | |
| 8 | +- **Recherche** : https://www.realta.ca/proprietes/ | |
| 9 | +- **Couverture** : Agence indépendante (Québec) | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). 83 propriétés à vendre. Généré par agences_source_immo.py. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/agences_source_immo.py` — classe `AgenceSIRealta` | |
| 18 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme | |
| 25 | +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC | |
| 26 | +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à | |
| 27 | +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique | |
| 28 | +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences | |
| 29 | +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES — | |
| 30 | +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_). | |
| 31 | +> EXCEPTION : les équipes/agences dont une partie des inscriptions est | |
| 32 | +> co-listée avec une bannière couverte (co-inscription Centris) portent un id | |
| 33 | +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%) | |
| 34 | +> masque leurs doublons tout en gardant leurs fiches uniques visibles. | |
| 35 | +> Un connecteur par agence est généré depuis data/source_immo_agencies.json. | |
| 36 | + | |
| 37 | +## Volumétrie & complétude (BD live) | |
| 38 | + | |
| 39 | +| Indicateur | Valeur | | |
| 40 | +|---|---| | |
| 41 | +| Annonces en base (toutes) | 85 | | |
| 42 | +| Actives | 82 | | |
| 43 | +| Visibles (après dédup) | 82 | | |
| 44 | +| Masquées par la dédup | 0 | | |
| 45 | +| GPS (lat/lng) | 100.0 % | | |
| 46 | +| Photos | 100.0 % | | |
| 47 | +| Prix | 100.0 % | | |
| 48 | +| CAC (chambres) | 80.5 % | | |
| 49 | +| SDB (salles de bains) | 78.0 % | | |
| 50 | +| Année de construction | 80.5 % (dont rôle : 3.0 %) | | |
| 51 | +| Taxes / évaluation municipale | 95.1 % | | |
| 52 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 53 | + | |
| 54 | +## Synchronisation | |
| 55 | + | |
| 56 | +- **Dernier sync** : 2026-08-18 02:27 — trouvé 82, +0 / ~0 / -0 — OK | |
| 57 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 58 | + | |
| 59 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/remax_quebec.md
+57 −0
@@ -0,0 +1,57 @@ | ||
| 1 | +# RE/MAX Québec (`remax_quebec`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.remax-quebec.com | |
| 8 | +- **Recherche** : https://www.remax-quebec.com/fr/maison-a-vendre | |
| 9 | +- **Couverture** : Toute la province — ~5 000 courtiers, ~119 agences (bannière #1 au Québec) | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +## Mécanique (introspection du code) | |
| 14 | + | |
| 15 | +- Module : `immoka/connectors/remax_quebec.py` — classe `RemaxQuebecConnector` | |
| 16 | +- Délai entre requêtes : 0.15 s ; cache détail BD : oui | |
| 17 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_REMAX_DETAIL_LIMIT` (défaut 3000) | |
| 18 | + | |
| 19 | +**En-tête du module :** | |
| 20 | + | |
| 21 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 22 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 23 | +> connectors/remax_quebec.py : RE/MAX Québec (remax-quebec.com) | |
| 24 | +> Le site interroge un index Meilisearch public (search-only key exposée dans | |
| 25 | +> la config de la page). L'index « inscriptions » couvre toute la province. | |
| 26 | +> Meilisearch plafonne à 1000 hits par requête (maxTotalHits) : on shard donc | |
| 27 | +> par région de tri d'acheminement postale (FSA, 3 premiers caractères) et on | |
| 28 | +> dédoublonne par numéro d'inscription. Couverture validée vs le total global. | |
| 29 | + | |
| 30 | +## Mécanismes clés | |
| 31 | + | |
| 32 | +- **Clé Meilisearch auto** : le site expose une clé *search-only* dans sa config publique ; le connecteur interroge directement l'index `inscriptions` (plafond 1 000 hits/requête → shard par FSA G/H/J + dédoublonnage par n° d'inscription, couverture validée vs total global). | |
| 33 | +- **Cache détail v4** : la fiche détail est mise en cache sous la clé `v4|<prix>` — tableau « Libellé | Valeur » + Détails financiers (taxes municipales/scolaires, évaluations municipales) ; re-téléchargée si le prix change. | |
| 34 | + | |
| 35 | +## Volumétrie & complétude (BD live) | |
| 36 | + | |
| 37 | +| Indicateur | Valeur | | |
| 38 | +|---|---| | |
| 39 | +| Annonces en base (toutes) | 26 702 | | |
| 40 | +| Actives | 25 486 | | |
| 41 | +| Visibles (après dédup) | 25 348 | | |
| 42 | +| Masquées par la dédup | 138 | | |
| 43 | +| GPS (lat/lng) | 100.0 % | | |
| 44 | +| Photos | 99.7 % | | |
| 45 | +| Prix | 83.9 % | | |
| 46 | +| CAC (chambres) | 79.1 % | | |
| 47 | +| SDB (salles de bains) | 59.9 % | | |
| 48 | +| Année de construction | 77.0 % (dont rôle : 99.9 %) | | |
| 49 | +| Taxes / évaluation municipale | 0.4 % | | |
| 50 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 51 | + | |
| 52 | +## Synchronisation | |
| 53 | + | |
| 54 | +- **Dernier sync** : 2026-08-18 01:45 — trouvé 25 486, +0 / ~60 / -177 — OK | |
| 55 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 56 | + | |
| 57 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/royal_lepage.md
+57 −0
@@ -0,0 +1,57 @@ | ||
| 1 | +# Royal LePage (Québec) (`royal_lepage`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.royallepage.ca | |
| 8 | +- **Recherche** : https://www.royallepage.ca/fr/search/homes/1/ | |
| 9 | +- **Couverture** : Toute la province — ~2 233 courtiers, ~47 agences (Bridgemarq) | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Recherche par ville filtrable QC : GET /fr/search/homes/{page}/?search_str=<ville>, QC&prov_code=QC&city_name=<ville>&lat=&lng=&search_type=city -> 100% QC (46/page), classé par proximité, cap ~1250/recherche. Sharding par ~28 points d'ancrage QC + dédup MLS (= n° Centris dans /.../mls{no}/). Requêtes directes (pas de Firecrawl). Champs liste: adresse, ville, type, prix, CAC, SDB, coords (data-rlp-key), photo jumplisting, MLS. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/royal_lepage.py` — classe `RoyalLepageConnector` | |
| 18 | +- Délai entre requêtes : 0.4 s ; cache détail BD : oui | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_RLP_DETAIL_LIMIT` (défaut 500) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/royal_lepage.py : Royal LePage (royallepage.ca) — Québec | |
| 26 | +> Le portail rend ses résultats côté serveur, mais /fr/search/homes/{page}/ | |
| 27 | +> sans géo renvoie le Canada entier. La recherche par ville EST filtrable : | |
| 28 | +> /fr/search/homes/{page}/?search_str=...&prov_code=QC&city_name=...&lat=..& | |
| 29 | +> lng=..&search_type=city renvoie 100 % de propriétés du Québec, classées par | |
| 30 | +> proximité (46/page). Chaque recherche plafonne à ~1 250 résultats ; on | |
| 31 | +> SHARD donc par points d'ancrage répartis dans la province et on dédoublonne | |
| 32 | +> par numéro MLS (= n° Centris, dans l'URL /.../mls{no}/). Aucune dépendance | |
| 33 | +> Firecrawl : requêtes directes. | |
| 34 | + | |
| 35 | +## Volumétrie & complétude (BD live) | |
| 36 | + | |
| 37 | +| Indicateur | Valeur | | |
| 38 | +|---|---| | |
| 39 | +| Annonces en base (toutes) | 1 461 | | |
| 40 | +| Actives | 1 012 | | |
| 41 | +| Visibles (après dédup) | 1 009 | | |
| 42 | +| Masquées par la dédup | 3 | | |
| 43 | +| GPS (lat/lng) | 100.0 % | | |
| 44 | +| Photos | 99.9 % | | |
| 45 | +| Prix | 80.4 % | | |
| 46 | +| CAC (chambres) | 81.8 % | | |
| 47 | +| SDB (salles de bains) | 81.4 % | | |
| 48 | +| Année de construction | 85.7 % (dont rôle : 99.4 %) | | |
| 49 | +| Taxes / évaluation municipale | 0.4 % | | |
| 50 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 51 | + | |
| 52 | +## Synchronisation | |
| 53 | + | |
| 54 | +- **Dernier sync** : 2026-08-18 02:20 — trouvé 1 010, +0 / ~7 / -18 — OK | |
| 55 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 56 | + | |
| 57 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/si_ag_theagency.md
+59 −0
@@ -0,0 +1,59 @@ | ||
| 1 | +# The Agency Montréal (`si_ag_theagency`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://theagencymontreal.com | |
| 8 | +- **Recherche** : https://theagencymontreal.com/fr/proprietes | |
| 9 | +- **Couverture** : Grand Montréal — boutique luxe (indépendant) | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). Généré par agences_source_immo.py. source_id _ag_ = dédup Centris (co-listings luxe avec Sotheby's/E&V). | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/agences_source_immo.py` — classe `AgenceSISiAgTheagency` | |
| 18 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme | |
| 25 | +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC | |
| 26 | +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à | |
| 27 | +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique | |
| 28 | +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences | |
| 29 | +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES — | |
| 30 | +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_). | |
| 31 | +> EXCEPTION : les équipes/agences dont une partie des inscriptions est | |
| 32 | +> co-listée avec une bannière couverte (co-inscription Centris) portent un id | |
| 33 | +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%) | |
| 34 | +> masque leurs doublons tout en gardant leurs fiches uniques visibles. | |
| 35 | +> Un connecteur par agence est généré depuis data/source_immo_agencies.json. | |
| 36 | + | |
| 37 | +## Volumétrie & complétude (BD live) | |
| 38 | + | |
| 39 | +| Indicateur | Valeur | | |
| 40 | +|---|---| | |
| 41 | +| Annonces en base (toutes) | 308 | | |
| 42 | +| Actives | 304 | | |
| 43 | +| Visibles (après dédup) | 245 | | |
| 44 | +| Masquées par la dédup | 59 | | |
| 45 | +| GPS (lat/lng) | 100.0 % | | |
| 46 | +| Photos | 100.0 % | | |
| 47 | +| Prix | 100.0 % | | |
| 48 | +| CAC (chambres) | 77.6 % | | |
| 49 | +| SDB (salles de bains) | 75.5 % | | |
| 50 | +| Année de construction | 88.6 % (dont rôle : 6.5 %) | | |
| 51 | +| Taxes / évaluation municipale | 83.7 % | | |
| 52 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 53 | + | |
| 54 | +## Synchronisation | |
| 55 | + | |
| 56 | +- **Dernier sync** : 2026-08-18 02:27 — trouvé 304, +0 / ~0 / -0 — OK | |
| 57 | +- **Erreurs récentes** : 0 sur les 4 derniers syncs | |
| 58 | + | |
| 59 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/sothebys_quebec.md
+54 −0
@@ -0,0 +1,54 @@ | ||
| 1 | +# Sotheby's International Realty Québec (`sothebys_quebec`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://sothebysrealty.ca | |
| 8 | +- **Recherche** : https://sothebysrealty.ca/en/search-results/province-quebec-real-estate/ | |
| 9 | +- **Couverture** : Toute la province — luxe | |
| 10 | +- **Type** : luxe | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> Recherche rendue côté client. Fiches enumérées via pages de résultats (grid public plafonné ~40 fiches province-wide ; pagination AJAX non exposée en URL). Chaque fiche enrichie via son JSON-LD Product : prix, galerie S3 complète (35-75 photos), description, MLS (sku), type. Limite : couverture = set public courant (~40) ; coverage complète nécessiterait l'endpoint AJAX de pagination. | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/sothebys_quebec.py` — classe `SothebysQuebecConnector` | |
| 18 | +- Délai entre requêtes : 1.0 s ; cache détail BD : oui | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_SOTHEBYS_DETAIL_LIMIT` (défaut 400) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/sothebys_quebec.py : Sotheby's International Realty Québec | |
| 26 | +> Recherche rendue côté client : le grid public est plafonné (~40/page) et la | |
| 27 | +> pagination passe par du JS (pas d'URL). On SHARD donc par région | |
| 28 | +> administrative du Québec (chaque page « region-{slug}-real-estate » renvoie | |
| 29 | +> son lot), on dédoublonne par id, puis on enrichit chaque fiche via son | |
| 30 | +> JSON-LD `Product` (prix, galerie S3 complète, description, n° MLS = sku). | |
| 31 | + | |
| 32 | +## Volumétrie & complétude (BD live) | |
| 33 | + | |
| 34 | +| Indicateur | Valeur | | |
| 35 | +|---|---| | |
| 36 | +| Annonces en base (toutes) | 58 | | |
| 37 | +| Actives | 42 | | |
| 38 | +| Visibles (après dédup) | 42 | | |
| 39 | +| Masquées par la dédup | 0 | | |
| 40 | +| GPS (lat/lng) | 88.1 % | | |
| 41 | +| Photos | 100.0 % | | |
| 42 | +| Prix | 100.0 % | | |
| 43 | +| CAC (chambres) | 45.2 % | | |
| 44 | +| SDB (salles de bains) | 14.3 % | | |
| 45 | +| Année de construction | 71.4 % (dont rôle : 100.0 %) | | |
| 46 | +| Taxes / évaluation municipale | 0.0 % | | |
| 47 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 48 | + | |
| 49 | +## Synchronisation | |
| 50 | + | |
| 51 | +- **Dernier sync** : 2026-08-18 00:21 — trouvé 40, +2 / ~0 / -0 — OK | |
| 52 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 53 | + | |
| 54 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/sutton.md
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +# Groupe Sutton Québec (`sutton`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://suttonquebec.com | |
| 8 | +- **Recherche** : https://suttonquebec.com/maisons-a-vendre.html | |
| 9 | +- **Couverture** : Toute la province — ~1 300-1 500 courtiers, ~20 agences | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +## Mécanique (introspection du code) | |
| 14 | + | |
| 15 | +- Module : `immoka/connectors/sutton.py` — classe `SuttonConnector` | |
| 16 | +- Délai entre requêtes : 0.5 s ; cache détail BD : oui | |
| 17 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_SUTTON_DETAIL_LIMIT` (défaut 400) | |
| 18 | + | |
| 19 | +**En-tête du module :** | |
| 20 | + | |
| 21 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 22 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 23 | +> connectors/sutton.py : Groupe Sutton Québec (suttonquebec.com) | |
| 24 | +> Site rendu serveur : chaque page de résultats publie 10 propriétés en | |
| 25 | +> JSON-LD schema.org (ItemList), avec prix, chambres, salles de bains, | |
| 26 | +> superficie et adresse. Les photos suivent le motif immo.vrtx.co/pic450/{id}. | |
| 27 | + | |
| 28 | +## Volumétrie & complétude (BD live) | |
| 29 | + | |
| 30 | +| Indicateur | Valeur | | |
| 31 | +|---|---| | |
| 32 | +| Annonces en base (toutes) | 4 751 | | |
| 33 | +| Actives | 4 525 | | |
| 34 | +| Visibles (après dédup) | 4 515 | | |
| 35 | +| Masquées par la dédup | 10 | | |
| 36 | +| GPS (lat/lng) | 94.2 % | | |
| 37 | +| Photos | 69.3 % | | |
| 38 | +| Prix | 69.3 % | | |
| 39 | +| CAC (chambres) | 71.4 % | | |
| 40 | +| SDB (salles de bains) | 68.4 % | | |
| 41 | +| Année de construction | 65.4 % (dont rôle : 98.6 %) | | |
| 42 | +| Taxes / évaluation municipale | 68.3 % | | |
| 43 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 44 | + | |
| 45 | +## Synchronisation | |
| 46 | + | |
| 47 | +- **Dernier sync** : 2026-08-18 02:17 — trouvé 4 525, +0 / ~49 / -0 — OK | |
| 48 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 49 | + | |
| 50 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/ubee.md
+49 −0
@@ -0,0 +1,49 @@ | ||
| 1 | +# Ubee (`ubee`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://ubee.com/carte/a-vendre | |
| 8 | +- **Statut** : actif | |
| 9 | + | |
| 10 | +> Plateforme QC — API anonyme api.ubee.ca SearchProperties (Seller, résidentiel+commercial), galerie complète. | |
| 11 | + | |
| 12 | +## Mécanique (introspection du code) | |
| 13 | + | |
| 14 | +- Module : `immoka/connectors/ubee.py` — classe `UbeeConnector` | |
| 15 | +- Délai entre requêtes : 0.5 s ; cache détail BD : oui | |
| 16 | + | |
| 17 | +**En-tête du module :** | |
| 18 | + | |
| 19 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 20 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 21 | +> connectors/ubee.py : Ubee (ubee.com) — plateforme immobilière québécoise | |
| 22 | +> API publique anonyme : POST api.ubee.ca/api/anonymous/Search/SearchProperties | |
| 23 | +> (pageIndex=N, 24 résultats/page, JSON riche : adresse, GPS, prix, pièces, | |
| 24 | +> superficies m², année, galerie Cloudinary complète). | |
| 25 | +> Deux volets À VENDRE (listingType=Seller) : résidentiel + commercial. | |
| 26 | + | |
| 27 | +## Volumétrie & complétude (BD live) | |
| 28 | + | |
| 29 | +| Indicateur | Valeur | | |
| 30 | +|---|---| | |
| 31 | +| Annonces en base (toutes) | 1 220 | | |
| 32 | +| Actives | 1 200 | | |
| 33 | +| Visibles (après dédup) | 1 176 | | |
| 34 | +| Masquées par la dédup | 24 | | |
| 35 | +| GPS (lat/lng) | 100.0 % | | |
| 36 | +| Photos | 100.0 % | | |
| 37 | +| Prix | 100.0 % | | |
| 38 | +| CAC (chambres) | 100.0 % | | |
| 39 | +| SDB (salles de bains) | 100.0 % | | |
| 40 | +| Année de construction | 100.0 % (dont rôle : 0.0 %) | | |
| 41 | +| Taxes / évaluation municipale | 0.0 % | | |
| 42 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 43 | + | |
| 44 | +## Synchronisation | |
| 45 | + | |
| 46 | +- **Dernier sync** : 2026-08-18 00:23 — trouvé 1 200, +0 / ~0 / -2 — OK | |
| 47 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 48 | + | |
| 49 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/vendirect.md
+52 −0
@@ -0,0 +1,52 @@ | ||
| 1 | +# Vendirect (`vendirect`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://vendirect.ca | |
| 8 | +- **Recherche** : https://vendirect.ca/proprietes/ | |
| 9 | +- **Couverture** : Toute la province — ~609 courtiers, commission réduite | |
| 10 | +- **Type** : agence | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> WordPress + plugin source-immo. API publique api-v1.source.immo (en-têtes x-si-account/api/appId depuis _configs.json), pagination next_token. ~64 propriétés à vendre, données complètes (prix, ch., sdb, pi², année, coords, photo). | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/vendirect.py` — classe `VendirectConnector` | |
| 18 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 19 | + | |
| 20 | +**En-tête du module :** | |
| 21 | + | |
| 22 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 23 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 24 | +> connectors/vendirect.py : Vendirect (vendirect.ca) | |
| 25 | +> Site WordPress + plugin source-immo. On lit directement l'API publique | |
| 26 | +> source.immo (voir SourceImmoConnector). Les identifiants proviennent de la | |
| 27 | +> config publique du site : | |
| 28 | +> vendirect.ca/wp-content/uploads/_sourceimmo/_configs.json | |
| 29 | + | |
| 30 | +## Volumétrie & complétude (BD live) | |
| 31 | + | |
| 32 | +| Indicateur | Valeur | | |
| 33 | +|---|---| | |
| 34 | +| Annonces en base (toutes) | 1 198 | | |
| 35 | +| Actives | 1 170 | | |
| 36 | +| Visibles (après dédup) | 1 170 | | |
| 37 | +| Masquées par la dédup | 0 | | |
| 38 | +| GPS (lat/lng) | 97.7 % | | |
| 39 | +| Photos | 100.0 % | | |
| 40 | +| Prix | 100.0 % | | |
| 41 | +| CAC (chambres) | 74.2 % | | |
| 42 | +| SDB (salles de bains) | 73.7 % | | |
| 43 | +| Année de construction | 79.4 % (dont rôle : 6.9 %) | | |
| 44 | +| Taxes / évaluation municipale | 80.3 % | | |
| 45 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 46 | + | |
| 47 | +## Synchronisation | |
| 48 | + | |
| 49 | +- **Dernier sync** : 2026-08-18 00:23 — trouvé 1 168, +3 / ~2 / -2 — OK | |
| 50 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 51 | + | |
| 52 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/via_ag_acces.md
+57 −0
@@ -0,0 +1,57 @@ | ||
| 1 | +# Via Capitale Acces (`via_ag_acces`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://viacapitaleacces.com | |
| 8 | +- **Recherche** : https://viacapitaleacces.com/proprietes/ | |
| 9 | +- **Couverture** : Sous-agence Via Capitale (source.immo) | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Rôle** : backup | |
| 12 | +- **Statut** : actif | |
| 13 | + | |
| 14 | +## Mécanique (introspection du code) | |
| 15 | + | |
| 16 | +- Module : `immoka/connectors/via_capitale_agences.py` — classe `ViaAgAcces` | |
| 17 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 18 | + | |
| 19 | +**En-tête du module :** | |
| 20 | + | |
| 21 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 22 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 23 | +> connectors/via_capitale_agences.py : Via Capitale par SOUS-AGENCES (robuste) | |
| 24 | +> Le portail central viacapitalevendu.com est derrière Cloudflare (scrape | |
| 25 | +> fragile, 1 page). Les sous-agences Via Capitale (Élite, Sélect, du Mont-Royal, | |
| 26 | +> Accès…) tournent chacune sur la plateforme source.immo (plugin WordPress), | |
| 27 | +> dont l'API publique (api-v1.source.immo) est stable et paginée — même | |
| 28 | +> mécanique que Vendirect (voir sourceimmo.py). On génère une classe par | |
| 29 | +> sous-agence depuis data/via_capitale_agencies.json ; le n° Centris | |
| 30 | +> (ref_number) sert de clé de déduplication (voir web.py, sources « %_ag_% »). | |
| 31 | +> La config publique de chaque site est à | |
| 32 | +> /wp-content/uploads/_sourceimmo/_configs.json (account_id/api_key/app_id + | |
| 33 | +> default_view). Le registre est régénérable par scripts/refresh_via_capitale. | |
| 34 | + | |
| 35 | +## Volumétrie & complétude (BD live) | |
| 36 | + | |
| 37 | +| Indicateur | Valeur | | |
| 38 | +|---|---| | |
| 39 | +| Annonces en base (toutes) | 186 | | |
| 40 | +| Actives | 181 | | |
| 41 | +| Visibles (après dédup) | 31 | | |
| 42 | +| Masquées par la dédup | 150 | | |
| 43 | +| GPS (lat/lng) | 100.0 % | | |
| 44 | +| Photos | 100.0 % | | |
| 45 | +| Prix | 100.0 % | | |
| 46 | +| CAC (chambres) | 77.4 % | | |
| 47 | +| SDB (salles de bains) | 74.2 % | | |
| 48 | +| Année de construction | 96.8 % (dont rôle : 10.0 %) | | |
| 49 | +| Taxes / évaluation municipale | 93.5 % | | |
| 50 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 51 | + | |
| 52 | +## Synchronisation | |
| 53 | + | |
| 54 | +- **Dernier sync** : 2026-08-18 00:27 — trouvé 181, +0 / ~0 / -0 — OK | |
| 55 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 56 | + | |
| 57 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/via_ag_dumontroyal.md
+29 −0
@@ -0,0 +1,29 @@ | ||
| 1 | +# Via Capitale Dumontroyal (`via_ag_dumontroyal`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://viacapitaledumontroyal.com | |
| 8 | +- **Recherche** : https://viacapitaledumontroyal.com/proprietes/ | |
| 9 | +- **Couverture** : Sous-agence Via Capitale (source.immo) | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Rôle** : backup | |
| 12 | +- **Statut** : inactif | |
| 13 | + | |
| 14 | +> Désactivé 2026-08-18 : 0 inscription via l’API source.immo (agence sans inventaire publié). Voir data/via_capitale_agencies.json. | |
| 15 | + | |
| 16 | +## Mécanique (introspection du code) | |
| 17 | + | |
| 18 | +_Pas de classe connecteur dédiée (voir la note du registre)._ | |
| 19 | + | |
| 20 | +## Volumétrie & complétude (BD live) | |
| 21 | + | |
| 22 | +_Aucune annonce en base pour cette source (voir la note du registre : couverture assurée ailleurs ou connecteur inactif)._ | |
| 23 | + | |
| 24 | +## Synchronisation | |
| 25 | + | |
| 26 | +- **Dernier sync** : 2026-08-18 00:27 — trouvé 0, +0 / ~0 / -0 — OK | |
| 27 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 28 | + | |
| 29 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/via_ag_elite.md
+57 −0
@@ -0,0 +1,57 @@ | ||
| 1 | +# Via Capitale Elite (`via_ag_elite`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://viacapitaleelite.immo | |
| 8 | +- **Recherche** : https://viacapitaleelite.immo/proprietes/ | |
| 9 | +- **Couverture** : Sous-agence Via Capitale (source.immo) | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Rôle** : backup | |
| 12 | +- **Statut** : actif | |
| 13 | + | |
| 14 | +## Mécanique (introspection du code) | |
| 15 | + | |
| 16 | +- Module : `immoka/connectors/via_capitale_agences.py` — classe `ViaAgElite` | |
| 17 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 18 | + | |
| 19 | +**En-tête du module :** | |
| 20 | + | |
| 21 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 22 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 23 | +> connectors/via_capitale_agences.py : Via Capitale par SOUS-AGENCES (robuste) | |
| 24 | +> Le portail central viacapitalevendu.com est derrière Cloudflare (scrape | |
| 25 | +> fragile, 1 page). Les sous-agences Via Capitale (Élite, Sélect, du Mont-Royal, | |
| 26 | +> Accès…) tournent chacune sur la plateforme source.immo (plugin WordPress), | |
| 27 | +> dont l'API publique (api-v1.source.immo) est stable et paginée — même | |
| 28 | +> mécanique que Vendirect (voir sourceimmo.py). On génère une classe par | |
| 29 | +> sous-agence depuis data/via_capitale_agencies.json ; le n° Centris | |
| 30 | +> (ref_number) sert de clé de déduplication (voir web.py, sources « %_ag_% »). | |
| 31 | +> La config publique de chaque site est à | |
| 32 | +> /wp-content/uploads/_sourceimmo/_configs.json (account_id/api_key/app_id + | |
| 33 | +> default_view). Le registre est régénérable par scripts/refresh_via_capitale. | |
| 34 | + | |
| 35 | +## Volumétrie & complétude (BD live) | |
| 36 | + | |
| 37 | +| Indicateur | Valeur | | |
| 38 | +|---|---| | |
| 39 | +| Annonces en base (toutes) | 327 | | |
| 40 | +| Actives | 319 | | |
| 41 | +| Visibles (après dédup) | 11 | | |
| 42 | +| Masquées par la dédup | 308 | | |
| 43 | +| GPS (lat/lng) | 100.0 % | | |
| 44 | +| Photos | 100.0 % | | |
| 45 | +| Prix | 100.0 % | | |
| 46 | +| CAC (chambres) | 63.6 % | | |
| 47 | +| SDB (salles de bains) | 54.5 % | | |
| 48 | +| Année de construction | 81.8 % (dont rôle : 22.2 %) | | |
| 49 | +| Taxes / évaluation municipale | 81.8 % | | |
| 50 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 51 | + | |
| 52 | +## Synchronisation | |
| 53 | + | |
| 54 | +- **Dernier sync** : 2026-08-18 00:28 — trouvé 317, +0 / ~0 / -1 — OK | |
| 55 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 56 | + | |
| 57 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/via_ag_select.md
+57 −0
@@ -0,0 +1,57 @@ | ||
| 1 | +# Via Capitale Select (`via_ag_select`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://viacapitaleselect.com | |
| 8 | +- **Recherche** : https://viacapitaleselect.com/proprietes/ | |
| 9 | +- **Couverture** : Sous-agence Via Capitale (source.immo) | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Rôle** : backup | |
| 12 | +- **Statut** : actif | |
| 13 | + | |
| 14 | +## Mécanique (introspection du code) | |
| 15 | + | |
| 16 | +- Module : `immoka/connectors/via_capitale_agences.py` — classe `ViaAgSelect` | |
| 17 | +- Délai entre requêtes : 0.25 s ; cache détail BD : non | |
| 18 | + | |
| 19 | +**En-tête du module :** | |
| 20 | + | |
| 21 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 22 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 23 | +> connectors/via_capitale_agences.py : Via Capitale par SOUS-AGENCES (robuste) | |
| 24 | +> Le portail central viacapitalevendu.com est derrière Cloudflare (scrape | |
| 25 | +> fragile, 1 page). Les sous-agences Via Capitale (Élite, Sélect, du Mont-Royal, | |
| 26 | +> Accès…) tournent chacune sur la plateforme source.immo (plugin WordPress), | |
| 27 | +> dont l'API publique (api-v1.source.immo) est stable et paginée — même | |
| 28 | +> mécanique que Vendirect (voir sourceimmo.py). On génère une classe par | |
| 29 | +> sous-agence depuis data/via_capitale_agencies.json ; le n° Centris | |
| 30 | +> (ref_number) sert de clé de déduplication (voir web.py, sources « %_ag_% »). | |
| 31 | +> La config publique de chaque site est à | |
| 32 | +> /wp-content/uploads/_sourceimmo/_configs.json (account_id/api_key/app_id + | |
| 33 | +> default_view). Le registre est régénérable par scripts/refresh_via_capitale. | |
| 34 | + | |
| 35 | +## Volumétrie & complétude (BD live) | |
| 36 | + | |
| 37 | +| Indicateur | Valeur | | |
| 38 | +|---|---| | |
| 39 | +| Annonces en base (toutes) | 611 | | |
| 40 | +| Actives | 580 | | |
| 41 | +| Visibles (après dédup) | 17 | | |
| 42 | +| Masquées par la dédup | 563 | | |
| 43 | +| GPS (lat/lng) | 100.0 % | | |
| 44 | +| Photos | 100.0 % | | |
| 45 | +| Prix | 100.0 % | | |
| 46 | +| CAC (chambres) | 70.6 % | | |
| 47 | +| SDB (salles de bains) | 70.6 % | | |
| 48 | +| Année de construction | 100.0 % (dont rôle : 0.0 %) | | |
| 49 | +| Taxes / évaluation municipale | 94.1 % | | |
| 50 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 51 | + | |
| 52 | +## Synchronisation | |
| 53 | + | |
| 54 | +- **Dernier sync** : 2026-08-18 00:28 — trouvé 580, +3 / ~5 / -8 — OK | |
| 55 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 56 | + | |
| 57 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
docs/connecteurs/via_capitale.md
+54 −0
@@ -0,0 +1,54 @@ | ||
| 1 | +# Via Capitale (`via_capitale`) | |
| 2 | + | |
| 3 | +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.* | |
| 4 | + | |
| 5 | +## Registre (`data/sources.json`) | |
| 6 | + | |
| 7 | +- **Site** : https://www.viacapitalevendu.com | |
| 8 | +- **Recherche** : https://www.viacapitalevendu.com/recherche/residentiel/ | |
| 9 | +- **Couverture** : Toute la province — ~5 300 propriétés, ~900-1 000 courtiers (québécoise, Bridgemarq) | |
| 10 | +- **Type** : franchise | |
| 11 | +- **Statut** : actif | |
| 12 | + | |
| 13 | +> ASP.NET rendu serveur derrière Cloudflare : accès via Firecrawl proxy=stealth. Résultats paginés ?page=N (34/page, ~155 pages). Parse: adresse, ville, secteur, région, type, prix, photos (images.viacapitale.info). CAC/SDB non captés à ce stade (icônes). | |
| 14 | + | |
| 15 | +## Mécanique (introspection du code) | |
| 16 | + | |
| 17 | +- Module : `immoka/connectors/via_capitale.py` — classe `ViaCapitaleConnector` | |
| 18 | +- Délai entre requêtes : 0.6 s ; cache détail BD : oui | |
| 19 | +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_VIACAP_DETAIL_LIMIT` (défaut 200) | |
| 20 | + | |
| 21 | +**En-tête du module :** | |
| 22 | + | |
| 23 | +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 24 | +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 25 | +> connectors/via_capitale.py : Via Capitale (viacapitalevendu.com) | |
| 26 | +> Bannière 100 % québécoise (Bridgemarq). Le site est rendu serveur (ASP.NET) | |
| 27 | +> mais protégé par Cloudflare : on passe donc par Firecrawl (get_rendered) qui | |
| 28 | +> franchit le challenge. Les résultats résidentiels sont paginés (34/page, | |
| 29 | +> ~5 300 propriétés). On parse les cartes HTML et on dédoublonne par code | |
| 30 | +> d'inscription. Photos : images.viacapitale.info/images/inscriptions/{id}/… | |
| 31 | + | |
| 32 | +## Volumétrie & complétude (BD live) | |
| 33 | + | |
| 34 | +| Indicateur | Valeur | | |
| 35 | +|---|---| | |
| 36 | +| Annonces en base (toutes) | 5 474 | | |
| 37 | +| Actives | 5 200 | | |
| 38 | +| Visibles (après dédup) | 5 153 | | |
| 39 | +| Masquées par la dédup | 47 | | |
| 40 | +| GPS (lat/lng) | 97.0 % | | |
| 41 | +| Photos | 100.0 % | | |
| 42 | +| Prix | 78.7 % | | |
| 43 | +| CAC (chambres) | 19.6 % | | |
| 44 | +| SDB (salles de bains) | 3.6 % | | |
| 45 | +| Année de construction | 68.9 % (dont rôle : 100.0 %) | | |
| 46 | +| Taxes / évaluation municipale | 87.1 % | | |
| 47 | +| Estimation Vrai-Prix (rôle) | 100.0 % | | |
| 48 | + | |
| 49 | +## Synchronisation | |
| 50 | + | |
| 51 | +- **Dernier sync** : 2026-08-18 00:27 — trouvé 5 200, +0 / ~0 / -61 — OK | |
| 52 | +- **Erreurs récentes** : 0 sur les 10 derniers syncs | |
| 53 | + | |
| 54 | +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db). | |
added
scripts/gen_connector_docs.py
+427 −0
@@ -0,0 +1,427 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +# ----------------------------------------------------------------------------- | |
| 3 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 4 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 5 | +# scripts/gen_connector_docs.py : documentation STANDARDISÉE des connecteurs. | |
| 6 | +# | |
| 7 | +# Génère docs/connecteurs/INDEX.md + une fiche par connecteur nommé | |
| 8 | +# (data/sources.json) + UNE fiche par famille dynamique (remax_ag_*, | |
| 9 | +# via_ag_*, c21_ag_*, source.immo), en croisant trois sources de vérité : | |
| 10 | +# 1. les registres JSON : data/sources.json + data/*_agencies.json | |
| 11 | +# 2. l'introspection code : immoka/connectors/* (registre CONNECTORS, | |
| 12 | +# en-têtes de modules, budgets env IMMOKA_*_DETAIL_LIMIT, délais) | |
| 13 | +# 3. la base vivante : data/immoka.db (listings, sync_log) | |
| 14 | +# | |
| 15 | +# REJOUABLE : ré-exécuter le script régénère tout docs/connecteurs/. | |
| 16 | +# Usage : python3 scripts/gen_connector_docs.py | |
| 17 | +# ----------------------------------------------------------------------------- | |
| 18 | +from __future__ import annotations | |
| 19 | + | |
| 20 | +import datetime | |
| 21 | +import json | |
| 22 | +import re | |
| 23 | +import sqlite3 | |
| 24 | +import sys | |
| 25 | +from pathlib import Path | |
| 26 | + | |
| 27 | +ROOT = Path(__file__).resolve().parent.parent | |
| 28 | +sys.path.insert(0, str(ROOT)) | |
| 29 | + | |
| 30 | +DATA = ROOT / "data" | |
| 31 | +OUT = ROOT / "docs" / "connecteurs" | |
| 32 | +DB = DATA / "immoka.db" | |
| 33 | + | |
| 34 | +from immoka.connectors import CONNECTORS # noqa: E402 (auto-découverte) | |
| 35 | + | |
| 36 | +NOW = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") | |
| 37 | +GEN_NOTE = ("*Généré le {} par `scripts/gen_connector_docs.py` — fichier " | |
| 38 | + "produit automatiquement, ne pas éditer à la main.*".format(NOW)) | |
| 39 | + | |
| 40 | +# --- mécanismes clés à mentionner dans les fiches concernées ------------------ | |
| 41 | +MECANISMES: dict[str, list[str]] = { | |
| 42 | + "remax_quebec": [ | |
| 43 | + "**Clé Meilisearch auto** : le site expose une clé *search-only* dans sa " | |
| 44 | + "config publique ; le connecteur interroge directement l'index " | |
| 45 | + "`inscriptions` (plafond 1 000 hits/requête → shard par FSA G/H/J + " | |
| 46 | + "dédoublonnage par n° d'inscription, couverture validée vs total global).", | |
| 47 | + "**Cache détail v4** : la fiche détail est mise en cache sous la clé " | |
| 48 | + "`v4|<prix>` — tableau « Libellé | Valeur » + Détails financiers " | |
| 49 | + "(taxes municipales/scolaires, évaluations municipales) ; re-téléchargée " | |
| 50 | + "si le prix change.", | |
| 51 | + ], | |
| 52 | + "barnes_quebec": [ | |
| 53 | + "**Clé Algolia auto-extraite** : App ID / admin key / préfixe d'index " | |
| 54 | + "lus dans les PHPVars du plugin `barnes-algolia` (wp_localize_script), " | |
| 55 | + "avec cache et repli sur les derniers identifiants connus — la clé a " | |
| 56 | + "déjà été rotée (403 le 2026-08-15) et le connecteur s'auto-répare.", | |
| 57 | + "Algolia ne contient pas les photos : elles sont récupérées sur la " | |
| 58 | + "fiche détail.", | |
| 59 | + ], | |
| 60 | + "remax_ag": [ | |
| 61 | + "**Backup du flux central** : plan B si la clé Meilisearch de " | |
| 62 | + "remax-quebec.com est rotée/bloquée. Énumération par sitemap " | |
| 63 | + "(1 requête → tout le parc) sur les plateformes « nos-proprietes » et " | |
| 64 | + "« centris-other ».", | |
| 65 | + "**Dédup Centris** : le n° Centris (dans l'URL) sert de clé de " | |
| 66 | + "déduplication contre le flux central — les doublons sont masqués " | |
| 67 | + "(`dup_hidden=1`), aucun double-comptage.", | |
| 68 | + ], | |
| 69 | +} | |
| 70 | + | |
| 71 | +TRANSVERSES = """## Mécanismes transverses (tous connecteurs) | |
| 72 | + | |
| 73 | +- **Enrichissements détail budgétés** : chaque connecteur qui visite les pages | |
| 74 | + détail plafonne le nombre de fiches par exécution via une variable | |
| 75 | + d'environnement `IMMOKA_*_DETAIL_LIMIT` (défauts dans le tableau des fiches). | |
| 76 | + Les fiches déjà en cache BD (`detail_cache`) sont réutilisées gratuitement ; | |
| 77 | + sur plusieurs cycles, tout le parc finit enrichi. | |
| 78 | +- **Dédup Centris + adresse** (`immoka/db.py`) : les doublons inter-sources | |
| 79 | + (même n° Centris via les sous-agences, ou même adresse normalisée) sont | |
| 80 | + marqués `dup_hidden=1` — {dup_total} annonces masquées actuellement — et la | |
| 81 | + lecture filtre en `AND dup_hidden=0`. | |
| 82 | +- **Jointure rôle d'évaluation** (`immoka/vraiprix_local.py`) : appariement | |
| 83 | + local FTS par adresse contre `data/vraiprix.db` (3,7 M unités d'évaluation). | |
| 84 | + Remplit lat/lng manquants, l'estimation Vrai-Prix (P10-P90 + lien) et les | |
| 85 | + champs du rôle (année de construction, superficies, évaluations). Impact : | |
| 86 | + **year_built rempli à {yb_pct:.0f} %** des annonces visibles, dont | |
| 87 | + {yb_role_pct:.0f} % proviennent du rôle (`year_built_source: role`). | |
| 88 | +- **Historique — vagues du 2026-08-18** : | |
| 89 | + - `7911d58` Vague 1 : clé Algolia auto-extraite (Barnes), taxes/éval RE/MAX | |
| 90 | + (cache détail v4), specs Via Capitale, Kijiji étendu. | |
| 91 | + - `e9bc9d7` Vague 2 : jointure au rôle d'évaluation, fiches | |
| 92 | + Sutton/Royal LePage/LesPAC enrichies, days_on_market, dédup par adresse. | |
| 93 | +""" | |
| 94 | + | |
| 95 | + | |
| 96 | +# --- helpers ------------------------------------------------------------------ | |
| 97 | +def module_header(path: Path) -> str: | |
| 98 | + """Bloc de commentaires d'en-tête (#) ou docstring d'un module.""" | |
| 99 | + try: | |
| 100 | + text = path.read_text(encoding="utf-8") | |
| 101 | + except OSError: | |
| 102 | + return "" | |
| 103 | + lines = [] | |
| 104 | + for line in text.splitlines(): | |
| 105 | + if line.startswith("#!"): | |
| 106 | + continue | |
| 107 | + if line.startswith("#"): | |
| 108 | + s = line.lstrip("#").rstrip() | |
| 109 | + if s.startswith(" "): | |
| 110 | + s = s[1:] | |
| 111 | + if set(s) <= {"-", " "}: | |
| 112 | + continue | |
| 113 | + lines.append(s) | |
| 114 | + elif lines: | |
| 115 | + break | |
| 116 | + elif line.strip(): | |
| 117 | + break | |
| 118 | + if not lines: | |
| 119 | + m = re.match(r'\s*(?:"""|\'\'\')(.*?)(?:"""|\'\'\')', text, re.S) | |
| 120 | + if m: | |
| 121 | + lines = [ln.rstrip() for ln in m.group(1).strip().splitlines()] | |
| 122 | + return "\n".join("> " + (ln or "") for ln in lines) | |
| 123 | + | |
| 124 | + | |
| 125 | +def env_budgets(path: Path) -> list[tuple[str, str]]: | |
| 126 | + try: | |
| 127 | + src = path.read_text(encoding="utf-8") | |
| 128 | + except OSError: | |
| 129 | + return [] | |
| 130 | + return re.findall(r'os\.environ\.get\(\s*"(IMMOKA_[A-Z0-9_]+)"\s*,\s*"([^"]*)"', src) | |
| 131 | + | |
| 132 | + | |
| 133 | +def fmt_ts(ts) -> str: | |
| 134 | + if not ts: | |
| 135 | + return "—" | |
| 136 | + return datetime.datetime.fromtimestamp(ts).strftime("%Y-%m-%d %H:%M") | |
| 137 | + | |
| 138 | + | |
| 139 | +def pct(part, whole) -> str: | |
| 140 | + if not whole: | |
| 141 | + return "—" | |
| 142 | + return f"{100.0 * (part or 0) / whole:.1f} %" | |
| 143 | + | |
| 144 | + | |
| 145 | +def nfr(n) -> str: | |
| 146 | + return f"{n:,}".replace(",", " ") if isinstance(n, int) else str(n) | |
| 147 | + | |
| 148 | + | |
| 149 | +# --- collecte BD ---------------------------------------------------------------- | |
| 150 | +def db_stats() -> tuple[dict, dict]: | |
| 151 | + con = sqlite3.connect(f"file:{DB}?mode=ro", uri=True) | |
| 152 | + con.row_factory = sqlite3.Row | |
| 153 | + V = "active=1 AND dup_hidden=0" | |
| 154 | + rows = con.execute(f""" | |
| 155 | + SELECT source, | |
| 156 | + COUNT(*) AS total, | |
| 157 | + SUM(active=1) AS actives, | |
| 158 | + SUM({V}) AS vis, | |
| 159 | + SUM(active=1 AND dup_hidden=1) AS dups, | |
| 160 | + SUM({V} AND lat IS NOT NULL AND lng IS NOT NULL) AS gps, | |
| 161 | + SUM({V} AND images IS NOT NULL AND images NOT IN ('','[]')) AS photos, | |
| 162 | + SUM({V} AND price IS NOT NULL) AS prix, | |
| 163 | + SUM({V} AND bedrooms IS NOT NULL) AS cac, | |
| 164 | + SUM({V} AND bathrooms IS NOT NULL) AS sdb, | |
| 165 | + SUM({V} AND year_built IS NOT NULL) AS annee, | |
| 166 | + SUM({V} AND details LIKE '%year_built_source%') AS annee_role, | |
| 167 | + SUM({V} AND (details LIKE '%Taxes municipales%' | |
| 168 | + OR details LIKE '%Taxes scolaires%' | |
| 169 | + OR details LIKE '%valuation municipale%')) AS taxes, | |
| 170 | + SUM({V} AND vraiprix IS NOT NULL) AS vp | |
| 171 | + FROM listings GROUP BY source""").fetchall() | |
| 172 | + stats = {r["source"]: dict(r) for r in rows} | |
| 173 | + | |
| 174 | + syncs: dict[str, list] = {} | |
| 175 | + for r in con.execute("SELECT source, ts, found, added, updated, removed," | |
| 176 | + " ok, message FROM sync_log ORDER BY ts"): | |
| 177 | + syncs.setdefault(r["source"], []).append(dict(r)) | |
| 178 | + con.close() | |
| 179 | + return stats, syncs | |
| 180 | + | |
| 181 | + | |
| 182 | +def agg(stats: dict, ids: list[str]) -> dict: | |
| 183 | + keys = ("total", "actives", "vis", "dups", "gps", "photos", "prix", "cac", | |
| 184 | + "sdb", "annee", "annee_role", "taxes", "vp") | |
| 185 | + out = {k: 0 for k in keys} | |
| 186 | + for i in ids: | |
| 187 | + s = stats.get(i) | |
| 188 | + if s: | |
| 189 | + for k in keys: | |
| 190 | + out[k] += s[k] or 0 | |
| 191 | + return out | |
| 192 | + | |
| 193 | + | |
| 194 | +def completude_md(s: dict) -> str: | |
| 195 | + v = s["vis"] or 0 | |
| 196 | + rows = [ | |
| 197 | + ("Annonces en base (toutes)", nfr(s["total"])), | |
| 198 | + ("Actives", nfr(s["actives"] or 0)), | |
| 199 | + ("Visibles (après dédup)", nfr(v)), | |
| 200 | + ("Masquées par la dédup", nfr(s["dups"] or 0)), | |
| 201 | + ("GPS (lat/lng)", pct(s["gps"], v)), | |
| 202 | + ("Photos", pct(s["photos"], v)), | |
| 203 | + ("Prix", pct(s["prix"], v)), | |
| 204 | + ("CAC (chambres)", pct(s["cac"], v)), | |
| 205 | + ("SDB (salles de bains)", pct(s["sdb"], v)), | |
| 206 | + ("Année de construction", pct(s["annee"], v) | |
| 207 | + + (f" (dont rôle : {pct(s['annee_role'], s['annee'])})" if s["annee"] else "")), | |
| 208 | + ("Taxes / évaluation municipale", pct(s["taxes"], v)), | |
| 209 | + ("Estimation Vrai-Prix (rôle)", pct(s["vp"], v)), | |
| 210 | + ] | |
| 211 | + md = "| Indicateur | Valeur |\n|---|---|\n" | |
| 212 | + md += "\n".join(f"| {k} | {val} |" for k, val in rows) | |
| 213 | + return md | |
| 214 | + | |
| 215 | + | |
| 216 | +def sync_md(syncs: dict, sid: str) -> str: | |
| 217 | + hist = syncs.get(sid) or [] | |
| 218 | + if not hist: | |
| 219 | + return "Aucune entrée `sync_log` pour cette source." | |
| 220 | + last = hist[-1] | |
| 221 | + recent = hist[-10:] | |
| 222 | + errs = [h for h in recent if not h["ok"]] | |
| 223 | + md = (f"- **Dernier sync** : {fmt_ts(last['ts'])} — trouvé {nfr(last['found'] or 0)}, " | |
| 224 | + f"+{last['added'] or 0} / ~{last['updated'] or 0} / -{last['removed'] or 0} — " | |
| 225 | + f"{'OK' if last['ok'] else 'ÉCHEC'}" | |
| 226 | + + (f" ({last['message']})" if last["message"] and last["message"] != "ok" else "")) | |
| 227 | + md += f"\n- **Erreurs récentes** : {len(errs)} sur les {len(recent)} derniers syncs" | |
| 228 | + if errs: | |
| 229 | + e = errs[-1] | |
| 230 | + md += f" — dernière : {fmt_ts(e['ts'])} « {e['message']} »" | |
| 231 | + return md | |
| 232 | + | |
| 233 | + | |
| 234 | +def mecanique_md(cls) -> str: | |
| 235 | + if cls is None: | |
| 236 | + return "_Pas de classe connecteur dédiée (voir la note du registre)._" | |
| 237 | + mod = sys.modules[cls.__module__] | |
| 238 | + path = Path(mod.__file__) | |
| 239 | + md = f"- Module : `immoka/connectors/{path.name}` — classe `{cls.__name__}`\n" | |
| 240 | + md += f"- Délai entre requêtes : {getattr(cls, 'request_delay', '—')} s ; " | |
| 241 | + md += ("cache détail BD : oui" if getattr(cls, "use_detail_cache", False) | |
| 242 | + else "cache détail BD : non") | |
| 243 | + budgets = env_budgets(path) | |
| 244 | + if budgets: | |
| 245 | + md += "\n- Budgets env (enrichissement détail plafonné/exécution) : " | |
| 246 | + md += ", ".join(f"`{k}` (défaut {v})" for k, v in budgets) | |
| 247 | + hdr = module_header(path) | |
| 248 | + if hdr: | |
| 249 | + md += "\n\n**En-tête du module :**\n\n" + hdr | |
| 250 | + return md | |
| 251 | + | |
| 252 | + | |
| 253 | +# --- familles dynamiques --------------------------------------------------------- | |
| 254 | +FAMILLES = [ | |
| 255 | + dict(slug="famille-remax-ag", prefix="remax_ag_", registry="remax_agencies.json", | |
| 256 | + module="remax_agences", | |
| 257 | + titre="Famille RE/MAX sous-agences (`remax_ag_*`)", | |
| 258 | + desc="Un connecteur par sous-agence RE/MAX (sites propres, indépendants du " | |
| 259 | + "portail central), généré dynamiquement depuis `data/remax_agencies.json`."), | |
| 260 | + dict(slug="famille-via-ag", prefix="via_ag_", registry="via_capitale_agencies.json", | |
| 261 | + module="via_capitale_agences", | |
| 262 | + titre="Famille Via Capitale agences (`via_ag_*`)", | |
| 263 | + desc="Connecteurs par bannière Via Capitale, générés depuis " | |
| 264 | + "`data/via_capitale_agencies.json` (comptes API source.immo par agence)."), | |
| 265 | + dict(slug="famille-c21-ag", prefix="c21_ag_", registry="century21_agencies.json", | |
| 266 | + module="century21_agences", | |
| 267 | + titre="Famille Century 21 (`c21_ag_*`)", | |
| 268 | + desc="Connecteurs par compte Century 21, générés depuis " | |
| 269 | + "`data/century21_agencies.json` (plateforme source.immo)."), | |
| 270 | + dict(slug="famille-source-immo", prefix=None, registry="source_immo_agencies.json", | |
| 271 | + module="agences_source_immo", | |
| 272 | + titre="Famille source.immo (agences indépendantes)", | |
| 273 | + desc="Agences indépendantes servies par la plateforme source.immo " | |
| 274 | + "(comptes/API dans `data/source_immo_agencies.json`)."), | |
| 275 | +] | |
| 276 | + | |
| 277 | + | |
| 278 | +def famille_members(fam: dict) -> list[str]: | |
| 279 | + """source_ids des membres instanciés (registre CONNECTORS).""" | |
| 280 | + return sorted(sid for sid, cls in CONNECTORS.items() | |
| 281 | + if cls.__module__.endswith("." + fam["module"])) | |
| 282 | + | |
| 283 | + | |
| 284 | +def write_famille(fam: dict, stats: dict, syncs: dict, named_ids: set) -> None: | |
| 285 | + members = famille_members(fam) | |
| 286 | + reg_path = DATA / fam["registry"] | |
| 287 | + registry = json.loads(reg_path.read_text(encoding="utf-8")) | |
| 288 | + mod_path = ROOT / "immoka" / "connectors" / (fam["module"] + ".py") | |
| 289 | + | |
| 290 | + md = [f"# {fam['titre']}", "", GEN_NOTE, "", fam["desc"], ""] | |
| 291 | + md += [f"- Registre : `data/{fam['registry']}` — **{len(registry)} entrées**", | |
| 292 | + f"- Connecteurs instanciés : **{len(members)}**", | |
| 293 | + f"- Module : `immoka/connectors/{fam['module']}.py`", ""] | |
| 294 | + hdr = module_header(mod_path) | |
| 295 | + if hdr: | |
| 296 | + md += ["**En-tête du module :**", "", hdr, ""] | |
| 297 | + for key, notes in MECANISMES.items(): | |
| 298 | + if fam["slug"].startswith("famille-remax") and key == "remax_ag": | |
| 299 | + md += ["## Mécanismes clés", ""] | |
| 300 | + md += [f"- {n}" for n in notes] + [""] | |
| 301 | + budgets = env_budgets(mod_path) | |
| 302 | + if budgets: | |
| 303 | + md += ["Budgets env : " + ", ".join(f"`{k}` (défaut {v})" for k, v in budgets), ""] | |
| 304 | + | |
| 305 | + md += ["## Membres et statuts", "", | |
| 306 | + "| source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK |", | |
| 307 | + "|---|---|---|---|---|---|---|---|"] | |
| 308 | + for sid in members: | |
| 309 | + cls = CONNECTORS[sid] | |
| 310 | + s = stats.get(sid) or {} | |
| 311 | + hist = syncs.get(sid) or [] | |
| 312 | + last = hist[-1] if hist else None | |
| 313 | + dom = getattr(cls, "domain", "") or getattr(cls, "site", "") or "—" | |
| 314 | + plat = getattr(cls, "platform", "") or "source.immo" | |
| 315 | + link = f"[`{sid}`]({sid}.md)" if sid in named_ids else f"`{sid}`" | |
| 316 | + md.append("| {} | {} | {} | {} | {} | {} | {} | {} |".format( | |
| 317 | + link, dom, plat, nfr(s.get("vis", 0) or 0), nfr(s.get("actives", 0) or 0), | |
| 318 | + nfr(s.get("dups", 0) or 0), fmt_ts(last["ts"]) if last else "—", | |
| 319 | + ("✅" if last["ok"] else "❌") if last else "—")) | |
| 320 | + # entrées de registre sans classe instanciée | |
| 321 | + inst_doms = {getattr(CONNECTORS[sid], "domain", "").replace("https://", "") | |
| 322 | + .replace("http://", "").strip("/") for sid in members} | |
| 323 | + orphans = [] | |
| 324 | + for entry in registry: | |
| 325 | + dom = (entry.get("domain") or "").replace("https://", "").replace("http://", "").strip("/") | |
| 326 | + if dom and dom not in inst_doms and ("www." + dom) not in inst_doms \ | |
| 327 | + and dom.removeprefix("www.") not in {d.removeprefix("www.") for d in inst_doms}: | |
| 328 | + orphans.append(dom) | |
| 329 | + if orphans: | |
| 330 | + md += ["", f"Entrées du registre sans connecteur instancié ({len(orphans)}) : " | |
| 331 | + + ", ".join(f"`{d}`" for d in orphans)] | |
| 332 | + | |
| 333 | + a = agg(stats, members) | |
| 334 | + md += ["", "## Volumétrie & complétude agrégées (famille, BD live)", "", | |
| 335 | + completude_md(a), ""] | |
| 336 | + (OUT / f"{fam['slug']}.md").write_text("\n".join(md) + "\n", encoding="utf-8") | |
| 337 | + | |
| 338 | + | |
| 339 | +# --- fiches nommées --------------------------------------------------------------- | |
| 340 | +def write_named(entry: dict, stats: dict, syncs: dict) -> None: | |
| 341 | + sid = entry["id"] | |
| 342 | + cls = CONNECTORS.get(entry.get("connector") or sid) or CONNECTORS.get(sid) | |
| 343 | + md = [f"# {entry.get('name', sid)} (`{sid}`)", "", GEN_NOTE, "", | |
| 344 | + "## Registre (`data/sources.json`)", ""] | |
| 345 | + for k, label in (("url", "Site"), ("listing_url", "Recherche"), | |
| 346 | + ("coverage", "Couverture"), ("type", "Type"), | |
| 347 | + ("platform", "Plateforme"), ("role", "Rôle"), | |
| 348 | + ("status", "Statut")): | |
| 349 | + if entry.get(k): | |
| 350 | + md.append(f"- **{label}** : {entry[k]}") | |
| 351 | + note = entry.get("note") or entry.get("notes") | |
| 352 | + if note: | |
| 353 | + md += ["", f"> {note}"] | |
| 354 | + md += ["", "## Mécanique (introspection du code)", "", mecanique_md(cls), ""] | |
| 355 | + if sid in MECANISMES or (entry.get("connector") or "") in MECANISMES: | |
| 356 | + md += ["## Mécanismes clés", ""] | |
| 357 | + md += [f"- {n}" for n in MECANISMES.get(sid) or MECANISMES[entry["connector"]]] | |
| 358 | + md += [""] | |
| 359 | + s = stats.get(sid) | |
| 360 | + md += ["## Volumétrie & complétude (BD live)", ""] | |
| 361 | + if s: | |
| 362 | + md += [completude_md(s), ""] | |
| 363 | + else: | |
| 364 | + md += ["_Aucune annonce en base pour cette source (voir la note du " | |
| 365 | + "registre : couverture assurée ailleurs ou connecteur inactif)._", ""] | |
| 366 | + md += ["## Synchronisation", "", sync_md(syncs, sid), "", | |
| 367 | + "Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) " | |
| 368 | + "(budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db)."] | |
| 369 | + (OUT / f"{sid}.md").write_text("\n".join(md) + "\n", encoding="utf-8") | |
| 370 | + | |
| 371 | + | |
| 372 | +# --- INDEX ------------------------------------------------------------------------ | |
| 373 | +def write_index(sources: list, stats: dict, syncs: dict) -> None: | |
| 374 | + tot = agg(stats, list(stats.keys())) | |
| 375 | + md = ["# Immo-Ka — Connecteurs (documentation standardisée)", "", GEN_NOTE, "", | |
| 376 | + f"**{len(CONNECTORS)} connecteurs** enregistrés (auto-découverte " | |
| 377 | + f"`immoka/connectors/__init__.py`) : {len(sources)} connecteurs nommés " | |
| 378 | + f"(`data/sources.json`) + 4 familles dynamiques (RE/MAX sous-agences, " | |
| 379 | + f"Via Capitale, Century 21, source.immo).", "", | |
| 380 | + f"Base vivante `data/immoka.db` : {nfr(tot['total'])} annonces, " | |
| 381 | + f"{nfr(tot['actives'])} actives, {nfr(tot['vis'])} visibles après dédup " | |
| 382 | + f"({nfr(tot['dups'])} masquées).", "", | |
| 383 | + TRANSVERSES.format(dup_total=nfr(tot["dups"]), | |
| 384 | + yb_pct=100.0 * tot["annee"] / max(tot["vis"], 1), | |
| 385 | + yb_role_pct=100.0 * tot["annee_role"] / max(tot["annee"], 1)), | |
| 386 | + "## Familles dynamiques", "", | |
| 387 | + "| Famille | Fiche | Membres | Visibles |", "|---|---|---|---|"] | |
| 388 | + for fam in FAMILLES: | |
| 389 | + members = famille_members(fam) | |
| 390 | + a = agg(stats, members) | |
| 391 | + md.append(f"| {fam['titre'].split('(')[0].strip()} | " | |
| 392 | + f"[{fam['slug']}]({fam['slug']}.md) | {len(members)} | {nfr(a['vis'])} |") | |
| 393 | + md += ["", "## Connecteurs nommés", "", | |
| 394 | + "| id | Nom | Type | Statut | Visibles | Année (dont rôle) | Dernier sync | OK |", | |
| 395 | + "|---|---|---|---|---|---|---|---|"] | |
| 396 | + for e in sorted(sources, key=lambda x: -(stats.get(x["id"], {}).get("vis") or 0)): | |
| 397 | + sid = e["id"] | |
| 398 | + s = stats.get(sid) or {} | |
| 399 | + hist = syncs.get(sid) or [] | |
| 400 | + last = hist[-1] if hist else None | |
| 401 | + annee = pct(s.get("annee"), s.get("vis")) if s else "—" | |
| 402 | + md.append("| [`{}`]({}.md) | {} | {} | {} | {} | {} | {} | {} |".format( | |
| 403 | + sid, sid, e.get("name", ""), e.get("type", "—"), e.get("status", "—"), | |
| 404 | + nfr(s.get("vis", 0) or 0), annee, | |
| 405 | + fmt_ts(last["ts"]) if last else "—", | |
| 406 | + ("✅" if last["ok"] else "❌") if last else "—")) | |
| 407 | + (OUT / "INDEX.md").write_text("\n".join(md) + "\n", encoding="utf-8") | |
| 408 | + | |
| 409 | + | |
| 410 | +def main() -> None: | |
| 411 | + OUT.mkdir(parents=True, exist_ok=True) | |
| 412 | + for old in OUT.glob("*.md"): | |
| 413 | + old.unlink() | |
| 414 | + sources = json.loads((DATA / "sources.json").read_text(encoding="utf-8"))["sources"] | |
| 415 | + stats, syncs = db_stats() | |
| 416 | + named_ids = {e["id"] for e in sources} | |
| 417 | + for e in sources: | |
| 418 | + write_named(e, stats, syncs) | |
| 419 | + for fam in FAMILLES: | |
| 420 | + write_famille(fam, stats, syncs, named_ids) | |
| 421 | + write_index(sources, stats, syncs) | |
| 422 | + print(f"[gen_connector_docs] {len(sources)} fiches nommées + {len(FAMILLES)} " | |
| 423 | + f"familles + INDEX → {OUT}") | |
| 424 | + | |
| 425 | + | |
| 426 | +if __name__ == "__main__": | |
| 427 | + main() | |
| 428 | ||