You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
6.1 KiB
Markdown

# 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 <site_id> --url "<검색결과 URL>"
# 깨진 어댑터 복구
uv run gimme-job repair <site_id> # 특정 사이트
uv run gimme-job repair --all # repair_needed 전체
```
## 어댑터 스모크 테스트
```bash
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개 파일이 필요하다:
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` — 학습 리포트