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
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` — 학습 리포트 |