SPB Git

spb/immo-ka Public

Immo-Ka — agrégateur des propriétés à vendre au Québec (73 connecteurs, ~40 000 annonces, React+FastAPI)

Python 64% TypeScript 21.1% CSS 14.3% HTML 0.6%
2.7 KB · 73 lines python
Raw Blame History
1#!/usr/bin/env python32# -----------------------------------------------------------------------------3# Immo-Ka — régénère data/via_capitale_agencies.json en sondant les domaines4# des sous-agences Via Capitale (plateforme source.immo). Étend facilement la5# couverture : ajoute des bannières/domaines à CANDIDATES et relance.6#   Usage : .venv/bin/python scripts/refresh_via_capitale.py7# -----------------------------------------------------------------------------8from __future__ import annotations910import json11import re12import urllib.request13from pathlib import Path1415UA = {"User-Agent": "Mozilla/5.0 Chrome/126"}16CFG = "/wp-content/uploads/_sourceimmo/_configs.json"17OUT = Path(__file__).resolve().parent.parent / "data" / "via_capitale_agencies.json"1819# Domaines connus + bannières à tester (viacapitale<x>.{immo,com,ca}).20KNOWN_DOMAINS = [21    "viacapitaleelite.immo", "viacapitaleselect.com",22    "viacapitaledumontroyal.com", "viacapitaleacces.com",23    "viacapitalepartenaires.com",24]25BANNERS = [26    "elite", "select", "dumontroyal", "acces", "horizon", "diamant", "expertise",27    "cite", "vendu", "action", "distinction", "premium", "platine", "signature",28    "prestige", "excellence", "sommet", "boreal", "alliance", "synergie", "expert",29    "optima", "concept", "capitale", "3000", "2000", "or", "plus", "inter",30]31TLDS = [".immo", ".com", ".ca"]323334def fetch_cfg(domain: str) -> dict | None:35    for host in (domain, f"www.{domain}"):36        try:37            b = urllib.request.urlopen(38                urllib.request.Request(f"https://{host}{CFG}", headers=UA), timeout=1239            ).read().decode("utf-8", "ignore")40            d = json.loads(b)41            if d.get("account_id") and d.get("api_key") and d.get("default_view"):42                return {"domain": host, "cfg": d}43        except Exception:44            continue45    return None464748def main() -> None:49    domains = set(KNOWN_DOMAINS)50    for b in BANNERS:51        for t in TLDS:52            domains.add(f"viacapitale{b}{t}")53    reg, seen = [], set()54    for dom in sorted(domains):55        r = fetch_cfg(dom)56        if not r or r["domain"] in seen:57            continue58        seen.add(r["domain"])59        d = r["cfg"]60        banner = re.sub(r"^www\.viacapitale|\.(immo|com|ca)$", "", r["domain"])61        reg.append({62            "banner": banner, "domain": r["domain"],63            "account": d["account_id"], "api": d["api_key"],64            "app": d["app_id"], "view": d["default_view"],65        })66        print(f"OK {banner:16} {r['domain']}")67    OUT.write_text(json.dumps(reg, ensure_ascii=False, indent=1), encoding="utf-8")68    print(f"→ {len(reg)} sous-agences écrites dans {OUT}")697071if __name__ == "__main__":72    main()73