[ka6] connecteur cgi: maintenance planifiée de la plateforme Njoyn (2026-09-05 ~22h30 EDT, tous les tenants *.njoyn.com ET domaines personnalisés redirigés vers maintenance.njoyn.com/platform-maintenance, page ~29 ko) — détection explicite de la page de maintenance dans _fetch_listing de la plateforme njoyn: échec immédiat sans retry ni crédit Scrapfly gaspillé, message 'plateforme Njoyn en maintenance planifiée' dans sync_log, offres conservées (292 actives cgi); le volume reviendra de lui-même à la fin de la fenêtre (retour prévu type: dimanche ~21h)
1 changed file +15 −1
modified
jobka/connectors/njoyn.py
+15 −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-04 | |
| 8 | +# Créé : 2026-08-18 Modifié : 2026-09-06 | |
| 9 | 9 | # ============================================================================= |
| 10 | 10 | """Plateforme Njoyn (CGI). |
| 11 | 11 | |
@@ -51,6 +51,12 @@ _TR_RE = re.compile(r"<tr[^>]*>(.*?)</tr>", re.S | re.I) | ||
| 51 | 51 | _TD_RE = re.compile(r"<td[^>]*>(.*?)</td>", re.S | re.I) |
| 52 | 52 | _TOTAL_RE = re.compile( |
| 53 | 53 | r"(?:R[ée]sultats de (?:la )?recherche|Search results)\s*\((\d+)\)", re.I) |
| 54 | +# Maintenance planifiée de la plateforme entière (constatée 2026-09-05 ~22h30 | |
| 55 | +# EDT, typiquement vendredi soir → dimanche ~21h) : TOUS les tenants — domaines | |
| 56 | +# *.njoyn.com ET personnalisés — redirigent vers | |
| 57 | +# maintenance.njoyn.com/.../platform-maintenance.html (~29 ko). | |
| 58 | +_MAINT_RE = re.compile( | |
| 59 | + r"Platform maintenance \| Njoyn|platform-maintenance", re.I) | |
| 54 | 60 | |
| 55 | 61 | |
| 56 | 62 | def _txt(s: str) -> str: |
@@ -268,6 +274,14 @@ class NjoynConnector(BaseConnector): | ||
| 268 | 274 | une fois puis on lève une erreur (sync en échec, pas « 0 trouvé »).""" |
| 269 | 275 | for attempt in range(2): |
| 270 | 276 | page = self._html(self._url("joblisting")) |
| 277 | + if _MAINT_RE.search(page): | |
| 278 | + # Maintenance plateforme : inutile de retenter dans 10 s (la | |
| 279 | + # fenêtre dure des heures) — échec immédiat et explicite, les | |
| 280 | + # offres en base restent actives. | |
| 281 | + raise RuntimeError( | |
| 282 | + f"njoyn {self.source_id}: plateforme Njoyn en maintenance " | |
| 283 | + f"planifiée (redirection maintenance.njoyn.com) — sync " | |
| 284 | + f"avorté, offres conservées") | |
| 271 | 285 | items = (self._parse_articles(page) or self._parse_table(page) |
| 272 | 286 | or self._parse_rows(page)) |
| 273 | 287 | if items or re.search(r"xweb\.asp", page, re.I): |
| 274 | 288 | |