SPB Git forge

spb/job-ka

Public
229commits 1branches 0releases
38.1 MBsize
maindefault branch
2 h agolast push
HTML 82.1% Python 14.6% TypeScript 1.9% CSS 1% JavaScript 0.5%

[ka6] connecteur cgi: détection de l'état transitoire post-maintenance Njoyn (« Invalid request XWP10023-UA ») — la plateforme entière (tous tenants, vérifié même avec un vrai Chromium depuis IP résidentielle) répond 200 avec ce corps de ~41 octets depuis ~11h EDT le 2026-09-07, pendant la fenêtre de maintenance officielle (retour prévu dimanche ~21h); échec immédiat et explicite dans _fetch_listing, sans retry ni 2e crédit Scrapfly, offres conservées (292 actives cgi, 712 sante_montreal, protégées par la garde anti-dérive); rien à réparer côté connecteur — le volume reviendra à la fin de la fenêtre

Simon-Pierre Boucher committed 17 days ago (Sep 7, 2026) parent 3afdde4

1 changed file +14 −1

modified jobka/connectors/njoyn.py +14 −1
@@ -5,7 +5,7 @@
5 5 # Fichier : jobka/connectors/njoyn.py
6 6 # Rôle : Classe de plateforme Njoyn (CGI) — très répandu au secteur public
7 7 # québécois (santé, villes, sociétés d'État). HTML serveur + jeton.
8 −# Créé : 2026-08-18 Modifié : 2026-09-06
8 +# Créé : 2026-08-18 Modifié : 2026-09-07
9 9 # =============================================================================
10 10 """Plateforme Njoyn (CGI).
11 11
@@ -57,6 +57,12 @@ _TOTAL_RE = re.compile(
57 57 # maintenance.njoyn.com/.../platform-maintenance.html (~29 ko).
58 58 _MAINT_RE = re.compile(
59 59 r"Platform maintenance \| Njoyn|platform-maintenance", re.I)
60 +# État transitoire post-maintenance (constaté 2026-09-07 ~11h-15h EDT, fenêtre
61 +# officielle jusqu'à dimanche ~21h) : TOUS les tenants répondent 200 avec un
62 +# corps minuscule « Invalid request XWP10023-UA <ip du client> » — y compris
63 +# pour un vrai navigateur (vérifié Chromium/Playwright depuis IP résidentielle).
64 +# Ce n'est PAS de l'anti-bot : échec immédiat, sans retry ni 2e crédit Scrapfly.
65 +_INVALID_RE = re.compile(r"Invalid request XWP\d+", re.I)
60 66
61 67
62 68 def _txt(s: str) -> str:
@@ -282,6 +288,13 @@ class NjoynConnector(BaseConnector):
282 288 f"njoyn {self.source_id}: plateforme Njoyn en maintenance "
283 289 f"planifiée (redirection maintenance.njoyn.com) — sync "
284 290 f"avorté, offres conservées")
291 + if _INVALID_RE.search(page[:200]):
292 + # Plateforme en état transitoire (« Invalid request XWP… ») :
293 + # touche même un vrai navigateur — inutile de retenter.
294 + raise RuntimeError(
295 + f"njoyn {self.source_id}: plateforme Njoyn indisponible "
296 + f"(réponse « Invalid request XWP10023 », état transitoire "
297 + f"post-maintenance) — sync avorté, offres conservées")
285 298 items = (self._parse_articles(page) or self._parse_table(page)
286 299 or self._parse_rows(page))
287 300 if items or re.search(r"xweb\.asp", page, re.I):
288 301