Recettes

Suivi d'offres d'emploi

Suivre les nouvelles offres d'emploi à intervalle régulier et notifier dès leur apparition

Surveille un ensemble de pages carrières et notifie (Slack / email / Discord) dès qu'un nouveau poste correspondant à ton filtre est publié. Le même pattern fonctionne pour l'immobilier, les annonces sur les marketplaces ou tout signal "nouvel élément apparu".

JSON Schema

{
  "type": "object",
  "properties": {
    "title":       { "type": "string", "description": "Job title" },
    "department":  { "type": "string" },
    "location":    { "type": "string", "description": "City or 'Remote'" },
    "url":         { "type": "string", "description": "Canonical job posting URL" },
    "postedAt":    { "type": "string", "description": "ISO-8601 timestamp if shown" }
  },
  "required": ["title", "url"]
}

Flux

  1. À intervalle régulier (cron / GitHub Actions), soumets les URLs des pages carrières à /batch/extract
  2. Reçois le Webhook à la fin
  3. Diff avec la dernière exécution — émets des notifications pour les nouvelles entrées (url)
  4. Filtre par mots-clés de titre / lieu avant de notifier

Esquisse d'implémentation

import httpx, json, pathlib

API = "https://openapi.thunderbit.com/openapi/v1"
H = {"Authorization": "Bearer YOUR_API_KEY"}
STATE = pathlib.Path("seen.json")

careers = [
    "https://example.com/careers",
    "https://example.org/jobs",
]

job = httpx.post(f"{API}/batch/extract",
                 headers=H,
                 json={"urls": careers, "schema": SCHEMA}).json()
# Poll or webhook (see Batch Job Lifecycle guide)

seen = set(json.loads(STATE.read_text())) if STATE.exists() else set()
new = []
for r in job["data"]["results"]:
    if r["status"] != "SUCCEEDED": continue
    for item in r.get("data", []):
        if item["url"] not in seen:
            new.append(item)
            seen.add(item["url"])

STATE.write_text(json.dumps(list(seen)))
notify(new)  # your Slack / email / Discord hook

Astuces

  • Persiste les URLs seen entre les exécutions — sans cela, chaque exécution notifie toute la liste
  • Filtre agressivement : if "Engineer" in item["title"] and "Remote" in item["location"]
  • Lance toutes les 4-6 heures — les pages carrières ne changent pas à la minute

Liens

Cette recette est en cours d'extension avec un template de workflow GitHub Actions — repasse bientôt.