Google Jobs anti-bot wall fired on every query from Korea, flooding the summary with errors. Now an engine that raises EngineBlockedError is skipped for the rest of the run (one attempt total), and blocks are counted separately instead of polluting the error list. |
4 weeks ago | |
|---|---|---|
| gimme_job | 4 weeks ago | |
| sites | 4 weeks ago | |
| tests | 4 weeks ago | |
| .env.example | 6 months ago | |
| .gitignore | 6 months ago | |
| CLAUDE.md | 6 months ago | |
| README.md | 4 weeks ago | |
| pyproject.toml | 6 months ago | |
| uv.lock | 6 months ago | |
README.md
gimme-job
로컬 구인공고 수집기(macOS). 여러 채용 사이트를 순회하며 채용 공고를 수집·정규화해 SQLite에 저장하고, 새 공고를 Telegram(또는 KakaoTalk/로컬 Markdown)으로 알려준다.
AI-assisted learning, non-AI runtime 크롤링 실행(runtime)은 순수 Python + Playwright만 사용한다. AI(Claude Code, Ollama)는 신규 사이트 학습과 깨진 어댑터 복구, 그리고 수집 결과 요약에만 사용된다.
기능
- 커스텀 어댑터 또는
sites/*.yaml매니페스트만으로 사이트 지원 - Chrome 영속 프로필(
JobAgent) 기반 세션 유지(로그인 불필요 반복) - 카드 수집 → 정규화 → 후처리 필터 → fingerprint 중복 제거 → DB 저장
- 이미 수집된 페이지 연속 2회 감지 시 조기 종료(불필요한 페이지네이션 방지)
- Ollama(
qwen3.5:9b)를 통한 일일 요약 - Telegram 알림 + 실패 시 로컬 Markdown 폴백
요구 사항
- Python >= 3.12
- uv (권장) —
pip사용 시pyproject.toml의 의존성 설치 - Playwright 브라우저:
chromium - (선택) Ollama — 요약 기능용
- (선택) Claude Code CLI —
learn/repair명령용 - (선택) Telegram 봇 토큰 — 알림용
설치
uv sync # 의존성 설치
uv run playwright install chromium # Chromium 설치
cp .env.example .env # 토큰 설정 (알림/LLM)
uv run gimme-job init # 디렉터리·DB 초기화 및 사전 점검
.env 주요 항목:
| 변수 | 설명 |
|---|---|
TELEGRAM_BOT_TOKEN |
Telegram 봇 토큰 |
TELEGRAM_CHAT_ID |
수신 chat ID (쉼표로 여러 개) |
KAKAO_* |
KakaoTalk self-memo 설정 (선택) |
OLLAMA_BASE_URL |
Ollama 주소 (기본 http://127.0.0.1:11434) |
GIMME_JOB_DB_PATH |
DB 경로 (기본 gimme_job.db) |
LOG_LEVEL |
로그 레벨 |
최초 로그인
사이트에 따라 로그인이 필요한 경우(LinkedIn, Indeed, Google 등) JobAgent 프로필에 한 번 로그인해 두면 이후 실행에 재사용된다.
uv run gimme-job login
브라우저가 열리면 필요한 사이트에 로그인한 뒤 터미널에서 Enter를 눌러 종료한다.
실행
1회 실행 (전체 사이트)
uv run gimme-job run
특정 사이트만
uv run gimme-job run --site usajobs
테스트 모드 (저장/알림 없이 추출만)
uv run gimme-job run --dry-run
정기 실행 (기본 1시간 간격)
uv run gimme-job auto --hour 2
능동 검색 (proactive)
수집 시스템(고정 사이트 긁기)과 별개로, 검색엔진 쿼리 매트릭스(전 50주 + 준주 + OCONUS)로
공고를 발견하고, 발견된 URL을 열어 ATS/지원 경로를 휴리스틱으로 검증해 원장에 저장한다.
런타임에 AI 호출 없음. 계획은 sites/proactive.yaml에서 관리.
uv run gimme-job proactive run # 1회 실행 (발견+검증+저장+보고)
uv run gimme-job proactive run --mode weekly # 주간 deep scan (ATS 도메인 site: 쿼리)
uv run gimme-job proactive run --dry-run --limit 2 --max-verify 3 # 빠른 테스트
uv run gimme-job proactive auto --at 06:00 # 매일 06:00 자동 (일요일 weekly 포함, Ctrl+C 종료)
uv run gimme-job proactive report # 오늘 보고서 재생성·재알림 (--summary: Ollama 요약)
uv run gimme-job proactive list [--status NEW] # 리드 원장 조회
보고서는 workspace/reports/proactive-YYYY-MM-DD.md에 저장되고 설정된 알림
프로바이더(sites/global.yaml의 notification.provider — Telegram 또는 KakaoTalk)로
전송된다(실패 시 markdown 폴백). 상태: NEW / REOPENED / STILL OPEN /
VERIFY(외부 보드 잔존분·리뷰 대상) / CLOSED / STALE.
알림만 다시 보내기
uv run gimme-job notify --today
조회 / 상태 확인
uv run gimme-job list # 수집된 공고 목록
uv run gimme-job list --site usajobs # 사이트별 필터
uv run gimme-job list --today # 오늘 새 공고만
uv run gimme-job status # 사이트별 활성/복구/실패 현황
신규 사이트 학습 / 깨진 어댑터 복구
# 새 사이트 학습 (Claude Code가 사이트를 분석해 어댑터+매니페스트 생성)
uv run gimme-job learn --site-id <site_id> --url "<검색결과 URL>"
# 깨진 어댑터 복구
uv run gimme-job repair <site_id> # 특정 사이트
uv run gimme-job repair --all # repair_needed 전체
어댑터 스모크 테스트
uv run gimme-job test <site_id>
# 또는
uv run pytest tests/adapters/test_<site_id>.py -v
프로젝트 구조
gimme_job/
cli.py # CLI 진입점
config.py # 전역/사이트 설정 로더
adapters/ # 사이트별 어댑터 (+ base.py, registry.py)
proactive/ # 능동 검색: plan(쿼리 매트릭스), engines(SERP), verifier(ATS 검증), engine(오케스트레이터), report, scheduler, deepscan
models/ # Pydantic(dto/manifest) + SQLAlchemy(db) 모델
runtime/ # orchestrator, browser, extractor, notifier 등
db/ # engine, repo, migrations
prompts/ # learn/repair용 프롬프트
templates/ # 알림 다이제스트 템플릿
sites/
global.yaml # 전역 설정(검색 키워드, 런타임 등)
proactive.yaml # 능동 검색 계획(용어·주·예산·denylist·검증 규칙)
<site_id>.yaml # 사이트별 매니페스트
tests/adapters/ # 어댑터 스모크 테스트
tests/proactive/ # 능동 검색 단위 테스트
workspace/ # Chrome 프로필, 캡처, 학습 리포트 등 산출물
새 사이트를 추가하려면 다음 4개 파일이 필요하다:
sites/{site_id}.yaml— 매니페스트gimme_job/adapters/{site_id}.py— 어댑터 (BaseJobSiteAdapter프로토콜 구현)tests/adapters/test_{site_id}.py— 스모크 테스트workspace/manifests/{site_id}.learning-report.md— 학습 리포트