# 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](https://docs.astral.sh/uv/) (권장) — `pip` 사용 시 `pyproject.toml`의 의존성 설치 - Playwright 브라우저: `chromium` - (선택) Ollama — 요약 기능용 - (선택) Claude Code CLI — `learn`/`repair` 명령용 - (선택) Telegram 봇 토큰 — 알림용 ## 설치 ```bash 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 프로필**에 한 번 로그인해 두면 이후 실행에 재사용된다. ```bash uv run gimme-job login ``` 브라우저가 열리면 필요한 사이트에 로그인한 뒤 터미널에서 Enter를 눌러 종료한다. ## 실행 ### 1회 실행 (전체 사이트) ```bash uv run gimme-job run ``` ### 특정 사이트만 ```bash uv run gimme-job run --site usajobs ``` ### 테스트 모드 (저장/알림 없이 추출만) ```bash uv run gimme-job run --dry-run ``` ### 정기 실행 (기본 1시간 간격) ```bash uv run gimme-job auto --hour 2 ``` ### 능동 검색 (proactive) 수집 시스템(고정 사이트 긁기)과 별개로, 검색엔진 쿼리 매트릭스(전 50주 + 준주 + OCONUS)로 공고를 **발견**하고, 발견된 URL을 열어 ATS/지원 경로를 휴리스틱으로 **검증**해 원장에 저장한다. 런타임에 AI 호출 없음. 계획은 `sites/proactive.yaml`에서 관리. ```bash 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`. ### 알림만 다시 보내기 ```bash uv run gimme-job notify --today ``` ## 조회 / 상태 확인 ```bash uv run gimme-job list # 수집된 공고 목록 uv run gimme-job list --site usajobs # 사이트별 필터 uv run gimme-job list --today # 오늘 새 공고만 uv run gimme-job status # 사이트별 활성/복구/실패 현황 ``` ## 신규 사이트 학습 / 깨진 어댑터 복구 ```bash # 새 사이트 학습 (Claude Code가 사이트를 분석해 어댑터+매니페스트 생성) uv run gimme-job learn --site-id --url "<검색결과 URL>" # 깨진 어댑터 복구 uv run gimme-job repair # 특정 사이트 uv run gimme-job repair --all # repair_needed 전체 ``` ## 어댑터 스모크 테스트 ```bash uv run gimme-job test # 또는 uv run pytest tests/adapters/test_.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·검증 규칙) .yaml # 사이트별 매니페스트 tests/adapters/ # 어댑터 스모크 테스트 tests/proactive/ # 능동 검색 단위 테스트 workspace/ # Chrome 프로필, 캡처, 학습 리포트 등 산출물 ``` 새 사이트를 추가하려면 다음 4개 파일이 필요하다: 1. `sites/{site_id}.yaml` — 매니페스트 2. `gimme_job/adapters/{site_id}.py` — 어댑터 (`BaseJobSiteAdapter` 프로토콜 구현) 3. `tests/adapters/test_{site_id}.py` — 스모크 테스트 4. `workspace/manifests/{site_id}.learning-report.md` — 학습 리포트