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