레시피

채용 공고 트래커

일정에 따라 새 채용 공고를 추적하고 등장 시 알림

채용 페이지 세트를 모니터링하고 필터와 일치하는 새로운 직무가 게시되면 Slack / 이메일 / Discord 로 알리세요. 동일한 패턴이 부동산, 마켓플레이스 리스팅, 또는 모든 "새 항목 등장" 신호에 작동합니다.

스키마

{
  "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"]
}

흐름

  1. 일정 (cron / GitHub Actions) 에 따라 채용 페이지 URL을 /batch/extract에 제출
  2. 완료 시 Webhook 수신
  3. 마지막 실행과 비교 — 새로운 (url) 항목에 대해 알림 발송
  4. 알리기 전에 직무명 / 위치 키워드로 필터링

구현 스케치

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

  • 실행 간 seen URL을 영속화하세요 — 그렇지 않으면 매 실행마다 전체 목록을 알립니다
  • 적극적으로 필터링하세요: if "Engineer" in item["title"] and "Remote" in item["location"]
  • 4-6시간 주기로 실행하세요 — 채용 페이지는 분 단위로 변경되지 않습니다

관련 문서

이 레시피는 GitHub Actions 워크플로우 템플릿으로 확장 중입니다 — 곧 업데이트됩니다.