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%
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