SPB Git forge

spb/job-ka

Public
229commits 1branches 0releases
38.1 MBsize
maindefault branch
36 min agolast push
HTML 82.1% Python 14.6% TypeScript 1.9% CSS 1% JavaScript 0.5%
9.0 KB

# Plateforme ATS njoyn

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.

# Description & mécanique

Plateforme Njoyn (CGI).

Les babillards Njoyn servent un HTML rendu côté serveur : //xweb/xweb.asp?clid=&page=joblisting&lang= Le serveur redirige en ajoutant un jeton de session (tbtoken) — il suffit de suivre la redirection. Chaque offre est un (habillage moderne) ou une ligne de tableau (habillage classique) pointant vers page=jobdetails&jobid=J####-####.

⚠ Les domaines *.njoyn.com sont derrière Radware Bot Manager : pour ces tenants, mettre USE_SCRAPFLY = True (contournement ASP). Depuis la maintenance plateforme du 2026-09-05→07, Radware couvre aussi des domaines personnalisés (ex. emplois.santemontreal.qc.ca depuis le 2026-09-08) ; le fallback de _html bascule alors tout le sync sur Scrapfly.

# Accès

  • Pagination : par numéro de page
  • Backend : Scrapfly (anti-bot / rendu JS) via BaseConnector.scrapfly()
  • Auth : aucune — API/pages publiques du site carrières.
  • Throttle : 1.2 s entre requêtes.
  • Budgets (env) : JOBKA_NJOYN_DETAIL_LIMIT (défaut 40)

# Tenants connectés

Employeur Actives Salaire GPS Mode Dernier sync OK
Santé Québec — Montréal 772 98 % 98 % 1 % 2026-09-21 17:31 ✅
CGI 185 0 % 96 % 0 % 2026-09-21 16:47 ✅
Groupe Bellemare 30 0 % 0 % 0 % 2026-09-21 17:01 ✅
Institut de recherche du CUSM 30 97 % 0 % 0 % 2026-09-21 16:51 ✅
Ville de Gatineau 23 100 % 0 % 0 % 2026-09-21 17:41 ✅
Ville de Terrebonne 18 94 % 0 % 0 % 2026-09-21 17:41 ✅
Réseau de transport de Longueuil (RTL) 16 31 % 0 % 0 % 2026-09-21 17:31 ✅
Société de transport de Laval 15 27 % 0 % 0 % 2026-09-21 17:35 ✅
Groupe Master 13 62 % 100 % 0 % 2026-09-21 17:01 ✅
Réseau de transport de la Capitale 12 0 % 0 % 0 % 2026-09-21 17:31 ✅
Ville de Mirabel 5 100 % 0 % 0 % 2026-09-21 17:41 ✅

# Licence / conformité

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.

Certains 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é.

# Historique

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 :

  • fd4bfc8 qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ;
  • 5a66f48 +59 employeurs (sondage massif d'ATS + détection de pages carrières) ;
  • 4917d57 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ;
  • f6e7571 portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ;
  • 744cbfc badge « Offre directe », stats directes/portails, dépôt direct employeurs ;
  • 1604ff9 reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel).

Commits touchant jobka/connectors/njoyn.py :

  • 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.
  • 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)
  • d4ab491 2026-09-09 [ka6] fix connecteur sante_montreal: Radware étendu au domaine personnalisé post-maintenance Njoyn — bascule Scrapfly + sessions Scrapfly pour la pagination
  • 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être
  • 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)
  • 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é)
  • 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"
  • 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ées
  • 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)
  • df3faf0 2026-08-25 Vague E — 3 nouvelles familles ATS (JazzHR, Teamtailor, Zoho Recruit) + 60 connecteurs, ~547 offres QC