レシピ
求人リスティングトラッカー
新しい求人リスティングを定期的にトラッキングし、登場時に通知する
複数の採用ページを監視し、フィルタにマッチする新規求人が公開されたときに通知(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"]
}フロー
- スケジュール(cron / GitHub Actions)で、採用ページの URL を
/batch/extractに送信 - 完了時に Webhook を受信
- 前回の実行と差分を取り、新規
(url)エントリに対して通知を発行 - 通知前にタイトル / ロケーションのキーワードでフィルタリング
実装スケッチ
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ヒント
seenURL を実行間で永続化しましょう —— そうしないと、毎回リスト全体が通知されてしまいます- 積極的にフィルタリングしましょう:
if "Engineer" in item["title"] and "Remote" in item["location"] - 4〜6 時間間隔で実行しましょう —— 採用ページは分単位で変わるものではありません
関連
このレシピは現在 GitHub Actions ワークフローテンプレートを追加して拡張中です —— 近日中にご確認ください。