HTML 82.1%
Python 14.6%
TypeScript 1.9%
CSS 1%
JavaScript 0.5%
1<!--2=============================================================================3Job·Ka — Groupe KA4Auteur : Simon-Pierre Boucher5Contact : contact@spboucher.ai6Fichier : docs/connecteurs/ats-njoyn.md7Rôle : Fiche plateforme ATS njoyn — mécanique partagée + tableau des 11 tenants8Généré : 2026-09-21 18:06 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,9 relancer le script pour régénérer.10=============================================================================11-->1213# Plateforme ATS `njoyn`1415**11 employeurs connectés** via cette plateforme — **1119 offres actives**. Module partagé : `jobka/connectors/njoyn.py` ; un employeur = une sous-classe d'environ 10 lignes.1617## Description & mécanique1819> Plateforme Njoyn (CGI).20>21> Les babillards Njoyn servent un HTML rendu côté serveur :22> <BASE>/<CL>/xweb/xweb.asp?clid=<CLID>&page=joblisting&lang=<n>23> Le serveur redirige en ajoutant un jeton de session (tbtoken) — il suffit de24> suivre la redirection. Chaque offre est un <article> (habillage moderne) ou25> une ligne de tableau (habillage classique) pointant vers26> ``page=jobdetails&jobid=J####-####``.27>28> ⚠ Les domaines *.njoyn.com sont derrière Radware Bot Manager : pour ces29> tenants, mettre ``USE_SCRAPFLY = True`` (contournement ASP). Depuis la30> maintenance plateforme du 2026-09-05→07, Radware couvre aussi des domaines31> personnalisés (ex. emplois.santemontreal.qc.ca depuis le 2026-09-08) ; le32> fallback de ``_html`` bascule alors tout le sync sur Scrapfly.3334## Accès3536- **Pagination** : par numéro de page37- **Backend** : Scrapfly (anti-bot / rendu JS) via `BaseConnector.scrapfly()`38- **Auth** : aucune — API/pages publiques du site carrières.39- **Throttle** : 1.2 s entre requêtes.40- **Budgets (env)** : `JOBKA_NJOYN_DETAIL_LIMIT` (défaut `40`)4142## Tenants connectés4344| Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK |45|---|---|---|---|---|---|---|46| [Santé Québec — Montréal](sante_montreal.md) | 772 | 98 % | 98 % | 1 % | 2026-09-21 17:31 | ✅ |47| [CGI](cgi.md) | 185 | 0 % | 96 % | 0 % | 2026-09-21 16:47 | ✅ |48| [Groupe Bellemare](groupe_bellemare.md) | 30 | 0 % | 0 % | 0 % | 2026-09-21 17:01 | ✅ |49| [Institut de recherche du CUSM](cusm_ir.md) | 30 | 97 % | 0 % | 0 % | 2026-09-21 16:51 | ✅ |50| [Ville de Gatineau](ville_gatineau.md) | 23 | 100 % | 0 % | 0 % | 2026-09-21 17:41 | ✅ |51| [Ville de Terrebonne](ville_terrebonne.md) | 18 | 94 % | 0 % | 0 % | 2026-09-21 17:41 | ✅ |52| [Réseau de transport de Longueuil (RTL)](rtl.md) | 16 | 31 % | 0 % | 0 % | 2026-09-21 17:31 | ✅ |53| [Société de transport de Laval](stl_laval.md) | 15 | 27 % | 0 % | 0 % | 2026-09-21 17:35 | ✅ |54| [Groupe Master](groupe_master.md) | 13 | 62 % | 100 % | 0 % | 2026-09-21 17:01 | ✅ |55| [Réseau de transport de la Capitale](rtc_quebec.md) | 12 | 0 % | 0 % | 0 % | 2026-09-21 17:31 | ✅ |56| [Ville de Mirabel](ville_mirabel.md) | 5 | 100 % | 0 % | 0 % | 2026-09-21 17:41 | ✅ |5758## Licence / conformité5960**Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez l'employeur » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets.6162Certains domaines de cette plateforme sont servis derrière un gestionnaire anti-bot : la lecture passe alors par Scrapfly, toujours sur des pages strictement publiques, au même rythme throttlé.6364## Historique6566**Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct :67- `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;68- `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;69- `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;70- `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;71- `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ;72- `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).7374Commits touchant `jobka/connectors/njoyn.py` :7576- `7938ca6` 2026-09-13 [ka6] fix connecteur groupe_bellemare: faux positif de supervision (micro-panne réseau vers api.scrapfly.io) — durcissement du retry de _fetch_listing aux erreurs réseau (njoyn.py) — le statut stale vient d'un unique échec à 04:28 (ConnectTimeout 180 s vers l'API Scrapfly elle-même, seul échec de tout le cycle app : 1105 connecteurs ok), alors que tous les syncs précédents étaient stables à found=34 = médiane exacte ; Scrapfly répond en 0,3 s au moment du diagnostic et le sync rejoué donne found=34 en 8,4 s — connecteur INTACT. Vraie faiblesse corrigée : le retry durci du 2026-09-09 (3 essais, ré-amorçage de session) ne couvrait que les réponses vides/anti-bot ; une requests.ConnectTimeout levée par base.scrapfly() traversait la boucle et avortait le sync au premier essai. _fetch_listing attrape désormais requests.RequestException — même traitement qu'une page vide (nouvelle session Scrapfly = nouveau proxy, backoff 10-20 s), ré-élévation après 3 échecs. Test unitaire ajouté (retry après 2 ConnectTimeout simulés + ré-élévation après 3). Sync rejoué post-patch : found=34, ok. 102 tests pytest verts. pm2 restart job-ka-sync OK, site 200.77- `2e4a54e` 2026-09-09 [ka6] fix connecteur groupe_bellemare: retry avec ré-amorçage de session Scrapfly dans la plateforme njoyn — échec transitoire du 2026-09-09 12h26 (Scrapfly a renvoyé 0 octet aux 2 essais, bellemare et groupe_master tombés ensemble, repartis seuls au sync suivant) ; le retry unique de _fetch_listing rejouait la MÊME session Scrapfly (proxy collant + cookies), donc le même proxy défaillant ; désormais 3 essais, backoff 10-20 s, session Scrapfly ré-amorcée entre les essais (nouveau proxy) ; syncs rejoués : bellemare 31 offres (médiane 31.0), groupe_master 15 (médiane 14.0)78- `d4ab491` 2026-09-09 [ka6] fix connecteur sante_montreal: Radware étendu au domaine personnalisé post-maintenance Njoyn — bascule Scrapfly + sessions Scrapfly pour la pagination79- `9910480` 2026-09-07 [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être80- `68cad94` 2026-09-06 [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)81- `a2c6823` 2026-09-04 [ka6] fix connecteur groupe_bellemare: casse du chemin Njoyn — Xweb.asp majuscule requis depuis le 2026-09-02 (le minuscule xweb.asp fait échouer Scrapfly ASP en UPSTREAM_WEBSITE_ERROR, 0 octet), _url() de la plateforme njoyn corrigé, 30 offres retrouvées (médiane 30) + tenants *.njoyn.com frères rétablis (stl_laval 17 vérifié)82- `3843ced` 2026-09-04 Revert "[ka6] connecteur cusm_ir: diagnostic du mur Radware hCaptcha host-wide *.njoyn.com (2026-09-02) — non contournable (Scrapfly/BrightData/Oxylabs/Chromium réel tous bloqués), erreur explicite via _radware_hint, offres en base préservées"83- `c8f84a3` 2026-09-04 [ka6] connecteur cusm_ir: diagnostic du mur Radware hCaptcha host-wide *.njoyn.com (2026-09-02) — non contournable (Scrapfly/BrightData/Oxylabs/Chromium réel tous bloqués), erreur explicite via _radware_hint, offres en base préservées84- `33dba44` 2026-08-26 [ka6] fix connecteur stl_laval: garde-fou njoyn — une page liste vide/anti-bot (Scrapfly en échec renvoie "") ne passe plus pour un babillard à 0 offre; retente une fois puis lève une erreur (njoyn.py)85- `df3faf0` 2026-08-25 Vague E — 3 nouvelles familles ATS (JazzHR, Teamtailor, Zoho Recruit) + 60 connecteurs, ~547 offres QC86