boss <명령> 한 줄로 처리하고, 결과를 정해진 JSON "봉투(envelope)"에 담아 돌려줍니다. 에이전트는 boss schema 한 번 호출로 전체 능력을 학습하고, 에러가 나면 응답에 박힌 recovery_action대로 스스로 복구합니다. (can4hou6joeng4/boss-agent-cli · Python 3.10+ · MIT · v1.11.0 · ~17,600줄)"사람용 채용 사이트를 AI 에이전트가 API처럼 쓸 수 있게 바꿔 주는 번역기"입니다. BOSS 直聘은 본래 사람이 브라우저로 클릭하며 쓰는 사이트입니다. boss-agent-cli는 그 사이트의 내부 API를 역공학(reverse engineering)해서, boss search "Golang" --city 광저우 같은 명령으로 검색하고, 결과를 사람이 아니라 LLM이 읽기 좋은 구조화 JSON으로 뱉습니다.
이름 그대로 boss(BOSS 즈핀) + agent(AI 에이전트) + cli(명령줄 도구)입니다. Claude Code·Cursor·Gemini CLI 같은 에이전트 호스트가 Bash로 이 도구를 호출하면, "구직 비서"가 한 명 생기는 셈입니다. 라이선스는 MIT, 2026년에 등장해 TrendShift 일간 7위에 올랐습니다. 코드는 약 17,600줄의 파이썬으로, README가 중국어·영어 모두 제공됩니다.
보통 채용 사이트는 사람을 향해 디자인됩니다. 버튼·팝업·무한스크롤 — 눈과 손이 있어야 쓸 수 있죠. AI 에이전트에게 이건 미로입니다.
boss-agent-cli는 그 미로 앞에 자판기 패널을 붙입니다. 에이전트가 "B3 버튼(=검색)"을 누르면 항상 같은 모양의 캔(=JSON 봉투)이 떨어집니다. 캔에는 성공 여부(ok)·데이터·다음에 누를 버튼 힌트·고장 났을 때 복구법이 규격대로 들어 있습니다. 그래서 에이전트는 미로를 헤맬 필요 없이, 패널만 보고 정확히 조작합니다.
boss 명령을 호출하면 boss-agent-cli가 "도구"가 된다. 이 레포의 모든 설계가 "사람이 아니라 에이전트가 쓴다"는 전제 위에 서 있다.wapi)를 호출해 검색·인사·채팅·추천을 자동화한다. 智联(Zhilian)·前程无忧(Qiancheng) 같은 다른 중국 플랫폼도 일부 지원한다.2026년의 가장 뜨거운 흐름은 "에이전트가 쓰는 도구(agent-first tooling)"입니다. 사람이 쓰던 CLI를 그대로 에이전트에게 던지면, 색깔 표·진행바·이모지가 섞여 LLM이 파싱하다 헷갈립니다. boss-agent-cli는 이 문제를 정면으로 푼 교과서적 사례라서 주목받습니다. 채용 자동화라는 실용성보다, "에이전트 친화적 CLI를 어떻게 설계하는가"의 모범답안이라는 점이 본질입니다.
| 항목 | 브라우저 자동화(셀레니움류) | 일반 사람용 CLI | boss-agent-cli |
|---|---|---|---|
| 출력 형식 | HTML 스크래핑(불안정) | 색깔 표·진행바(파싱 난해) | 규격 JSON 봉투(파싱 1줄) |
| 능력 자기설명 | ✕ | ✕ (--help 텍스트) | ○ (boss schema 자기서술) |
| 에러 처리 | 예외 던지고 멈춤 | 사람이 읽는 메시지 | recovery_action으로 자가복구 |
| 로그인 | 매번 수동 클릭 | — | 쿠키→CDP→QR 3단계 자동 降级 |
| 봇 탐지 회피 | 쉽게 탐지됨 | — | patchright 반검출 + 인간형 지연 |
| 설치/실행 | 드라이버 관리 번거로움 | 다양 | uv tool install / Skill 1줄 |
모든 명령이 똑같은 모양의 JSON 봉투를 stdout에 찍습니다. ok(성공 여부)·schema_version·command·data·pagination·error·hints.next_actions. 로그·진행상황은 전부 stderr로 분리합니다. 덕분에 에이전트는 stdout을 통째로 JSON.parse 한 줄로 읽고, ok 필드만 보면 성패를 압니다. 사람용 도구와의 결정적 차이입니다.
boss schema — 도구가 스스로를 설명한다에이전트가 명령표를 외울 필요가 없습니다. 가장 먼저 boss schema를 호출하면 현재 사용 가능한 명령·인자·플랫폼·에러코드가 JSON으로 쏟아집니다. docs/agent-quickstart.md도 "명령을 하드코딩하지 말고 schema를 먼저 부르라"고 못 박습니다. 도구가 버전업되어 기능이 늘어도 에이전트 쪽 코드를 고칠 필요가 없는, 자기서술 프로토콜입니다.
실패 응답(ok=false)에는 error.code·error.recoverable·error.recovery_action이 함께 들어옵니다. AUTH_EXPIRED면 "boss login 실행", RATE_LIMITED면 "대기 후 재시도" 식으로 다음 행동을 기계가 읽도록 명시합니다. 에이전트는 에러 메시지를 해석하느라 추측할 필요 없이, 동봉된 지시를 그대로 따르면 됩니다.
일반 CLI가 "사람에게 친절한 도구"라면, boss-agent-cli는 "기계에게 친절한 도구"다. 색깔·표·이모지를 빼고 그 자리에 규격·자기서술·복구지시를 채워 넣은 게 핵심이다. 채용은 소재일 뿐, 진짜 배울 건 "에이전트용 CLI 설계법"이다.
boss-agent-cli는 화려한 ML 스택이 아니라, 잘 설계된 단일 파이썬 CLI입니다. 약 17,600줄의 소스가 commands/ · api/ · auth/ · platforms/ · cache/ · bridge/로 깔끔히 나뉩니다. 무거운 의존성 없이도 "반검출 로그인 + 역공학 API 호출 + 암호화 캐시 + JSON 출력"이라는 풀스택을 파이썬만으로 구현한 점이 인상적입니다.
| 항목 | 내용 |
|---|---|
| 언어 | Python 3.10+ (3.10~3.13 지원), 소스의 97.6%가 파이썬 |
| CLI 프레임워크 | click — 커스텀 BossCliGroup으로 사용법 에러까지 JSON 봉투로 변환 |
| 빌드 백엔드 | hatchling (src-layout), 의존성 관리 uv + uv.lock |
| 엔트리포인트 | boss = "boss_agent_cli.main:cli", boss-mcp = "...mcp_server:run" (콘솔 2개) |
| 배포 | PyPI(uv tool install·pipx·pip), npx skills add Skill 설치, Dockerfile 동봉 |
| 패키지 | 역할 |
|---|---|
| click | CLI 명령·옵션 정의 (사람용 typer 대신 제어 폭이 넓은 click 선택) |
| httpx | BOSS 즈핀 wapi 엔드포인트 호출 (동기/비동기 HTTP) |
| patchright | Playwright 반검출 fork — 자동화 탐지를 이진(binary) 수준에서 패치 |
| browser-cookie3 | 로컬 브라우저(Chrome·Firefox·Edge 등 10여 종)에서 zhipin.com 쿠키 추출 |
| cryptography | Fernet 대칭암호화 + PBKDF2로 로그인 토큰을 머신 바인딩 암호화 |
| rich | (stderr 쪽) 진행 표시·로그 렌더링 |
| pyyaml | boss.yaml·recruiter.yaml로 API 엔드포인트를 코드 밖 설정으로 관리 |
| websockets | bridge/ 데몬 — 브라우저 확장과 WebSocket으로 통신하는 통로 |
BOSS 즈핀의 내부 API 경로는 api/boss.yaml·api/recruiter.yaml에 분리돼 있고, endpoints_loader.py가 이를 읽어 들인다. 사이트가 API 경로를 바꿔도 파이썬 코드가 아니라 YAML만 고치면 된다. 자주 깨지는 역공학 대상의 변화를 데이터로 흡수하는 영리한 분리다.
api/models.py로 추상화해 변화에 대비한다.--remote-debugging-port=9222로 크롬을 띄우면, boss-agent-cli가 그 실제 사용자 브라우저를 그대로 재사용해 로그인할 수 있다. 새 창을 띄워 QR을 다시 찍는 것보다 "진짜 사람 지문"이 유지돼 봇 탐지를 덜 받는다.boss-agent-cli의 진짜 배울 점은 "계층 분리"입니다. 명령(commands/)은 비즈니스 로직만, 인증(auth/)은 로그인·토큰만, API(api/)는 HTTP·역공학만, 출력(output.py)은 JSON 봉투만 담당합니다. 한 번의 boss search가 CLI → 인증 → API 클라이언트 → 캐시 → JSON 출력이라는 명확한 파이프라인을 통과합니다.
모든 명령의 마지막은 output.py의 emit_* 함수를 거칩니다. 성공이든 실패든, 검색이든 채팅이든 똑같은 7개 필드 봉투로 포장됩니다. 심지어 사용자가 명령을 잘못 입력한 Click 사용법 에러조차 BossCliGroup이 가로채 JSON으로 변환합니다. "이 도구가 내뱉는 stdout은 항상 유효한 JSON"이라는 불변식을 코드 전체가 지킵니다.
{
"ok": true,
"schema_version": "1.0",
"command": "search",
"data": [...],
"pagination": {"page": 1, "has_more": true, "total": 15},
"error": null,
"hints": {"next_actions": ["boss detail <security_id>"]}
}
택배 회사가 내용물이 무엇이든 똑같은 규격 상자에 담아 보내는 것과 같다. 받는 쪽(에이전트)은 상자 여는 법을 한 번만 익히면 된다. 안에 책이 왔든 옷이 왔든, 송장(ok·error·hints) 읽는 법은 동일하다.
로그인은 "덜 귀찮은 것"부터 시도하고 실패하면 한 단계씩 내려갑니다. ① 로컬 브라우저에서 즈핀 쿠키를 그대로 추출(이미 로그인돼 있으면 무탐지·무클릭) → ② 디버깅 포트가 열린 크롬을 재사용(CDP) → ③ 최후의 보루로 patchright 크롬을 띄워 QR 스캔. 각 단계는 "사람 지문을 얼마나 유지하느냐"로 정렬돼 있어, 봇 탐지 위험이 가장 낮은 길을 우선합니다.
| 단계 | 방법 | 장점 |
|---|---|---|
| 1순위 | browser-cookie3 쿠키 추출 | 클릭·스캔 없음, 기존 로그인 재활용 |
| 2순위 | CDP 브라우저 재사용 | 실제 사용자 지문 유지 |
| 3순위 | patchright QR 스캔 | 아무 사전조건 없이도 동작(최후수단) |
봇처럼 보이지 않으려고 throttle.py가 요청 사이에 가우시안 분포 난수 지연(예: 1.5~3.0초)을 넣고, 실패하면 지수 백오프로 점점 더 길게 기다리며 재시도합니다. 배치 인사(batch-greet)는 상한 10건으로 막아 두고, stoken 같은 보안 토큰은 브라우저 환경에서 생성합니다. "빠르게 많이"가 아니라 "사람처럼 천천히"가 설계 원칙입니다.
이 레포가 가장 신경 쓰는 부분입니다. compliance.py가 위험한 동작(대량 자동 투척, 채용담당자 측 개인정보 쓰기 등)을 COMPLIANCE_BLOCKED·ACCOUNT_RISK 에러로 막습니다. docs/capability-matrix.md는 "기본은 저위험 모드 — 읽기 우선, 사용자 능동 트리거, 대량/자동 미접촉"이라고 명시하고, 로그인 폴백을 "풍문 회피 수단으로 쓰지 말라"고 경고합니다.
BOSS 즈핀의 비공식 API를 호출하므로, 과도하게 쓰면 계정 제한·차단 위험이 있다. 레포 스스로도 저위험 모드를 기본값으로 두고, 투척·인사·연락처 교환 같은 "쓰기" 동작은 가급적 공식 사이트에서 수동으로 하라고 권한다. 학습 목적이라면 검색·상세조회 같은 읽기 명령 위주로 만져 보는 게 안전하다.
두 가지가 핵심 인사이트입니다. 첫째, "명령 하나 = 파일 하나"(commands/)라는 규칙이 일관됩니다. 새 명령을 추가할 때 다른 파일을 건드릴 필요가 거의 없습니다. 둘째, 자주 바뀌는 것(엔드포인트·플랫폼)을 데이터·플러그인으로 분리했습니다. api/*.yaml에 경로를, platforms/에 사이트별 차이를 격리해, 즈핀이 바뀌거나 새 채용 사이트를 추가해도 충격이 한 폴더에 갇힙니다.
같은 기능을 ① 인패키지 mcp_server.py(1,234줄, 풀기능)와 ② 얇은 독립 mcp-server/server.py(~1KB) 두 가지로 제공한다. 에이전트 호스트가 MCP를 선호하면 boss-mcp로, Bash를 선호하면 boss CLI로 — 같은 능력을 두 인터페이스로 열어 둔 셈이다. 에이전트 생태계의 다양한 연결 방식을 모두 수용하려는 의도다.
output.py의 JSON 봉투는 "도구를 LLM이 쓰게 만드는 법"의 핵심입니다. stdout(데이터)과 stderr(로그)의 분리, ok/error.recovery_action/hints.next_actions 필드 설계를 배우세요. 실습: 아무 사람용 CLI 하나를 골라 출력을 똑같은 7필드 JSON 봉투로 감싸는 래퍼를 작성해 보기.
commands/schema.py는 도구가 자기 능력을 JSON으로 설명하는 패턴입니다. 실습: 내 CLI에 schema 서브커맨드를 붙여, 사용 가능한 명령·인자·에러코드를 기계가 읽는 형태로 출력해 보기. MCP의 tool 정의와 어떻게 닮았는지 비교하기.
api/boss.yaml처럼 잘 깨지는 비공식 API 경로를 코드에서 빼 데이터로 두는 설계를 배웁니다. 실습: 브라우저 개발자도구로 아무 공개 사이트의 JSON 요청을 관찰하고, 경로를 YAML로 빼서 httpx로 호출하는 미니 클라이언트 작성하기(공개·허용된 대상으로만).
auth/manager.py의 "쿠키→CDP→QR" 폴백과, token_store.py의 Fernet+PBKDF2 머신바인딩 암호화를 보세요. 실습: cryptography 라이브러리로 비밀 토큰을 머신 고유 키로 암호화해 파일에 저장·복호화하는 모듈 만들기.
throttle.py의 가우시안 지연 + 지수 백오프 + 배치 상한은 "남의 서버를 예의 있게 쓰는 법"입니다. 실습: asyncio로 요청 사이에 정규분포 지연을 넣고, 429(rate limit)를 만나면 지수적으로 대기 시간을 늘리는 재시도 데코레이터 작성하기.
main.py의 BossCliGroup(click.Group)은 Click의 표준 에러까지 가로채 일관된 봉투로 바꿉니다. 실습: click.Group을 상속해 main()을 standalone_mode=False로 호출하고, 예외를 잡아 JSON으로 변환하는 그룹 만들기.
| 항목 | 요구사항 |
|---|---|
| Python | 3.10 이상 (3.10 / 3.11 / 3.12 / 3.13) |
| uv | 권장 — uv tool install boss-agent-cli로 초 단위 격리 설치 |
| 브라우저 내장 | patchright install chromium — QR 로그인용 Chromium 커널 |
| OS | Linux · macOS · Windows (브라우저 쿠키 추출은 OS별 경로 자동 처리) |
| 네트워크 | BOSS 즈핀(zhipin.com) 접근 필요 — 중국 사이트라 지역 제약 있을 수 있음 |
| 데이터 디렉토리 | ~/.boss-agent/ — config.json · 암호화 세션 · SQLite 캐시(쓰기 권한 필요) |
# 설치 uv tool install boss-agent-cli patchright install chromium # QR 로그인 쓸 때만 # 첫 1분 — README를 다 읽지 않아도 됨 boss doctor # 환경·의존성·로그인·네트워크 자가진단 boss schema # 능력 자기서술 (에이전트가 가장 먼저 호출) boss status # 로그인 상태 확인 boss login # status가 AUTH_REQUIRED일 때만
| 명령 | 하는 일 |
|---|---|
| boss schema | 전체 능력 자기서술 출력 (에이전트 첫 호출) |
| boss doctor | 환경·의존성·로그인·네트워크 진단 |
| boss search "Golang" --welfare "双休" | 복지 필터를 건 직무 검색 |
| boss detail <security_id> | 직무 상세 조회 |
| boss recommend | 개인화 추천 |
| boss greet / apply <sid> <jid> | 채용담당자에게 인사 / 투척(멱등) |
| boss pipeline / digest | 구직 진행 파이프라인 / 매일 요약 |
| boss watch add/run | 검색 조건 저장 + 신규 직무 증분 모니터링 |
| boss export "Golang" -o jobs.csv | 검색 결과 CSV/JSON 내보내기 |
도구를 설치하지 않고도, README의 출력 협약 예시 JSON을 보고 ok·data·pagination·error·hints.next_actions 각 필드가 왜 필요한지 정리한다. 사람용 CLI의 --help 텍스트와 무엇이 다른지 한 단락으로 비교하기.
아무 파이썬 CLI(예: 할 일 관리기)를 만들고, schema 서브커맨드가 "명령·인자·에러코드"를 JSON으로 출력하게 한다. 그 JSON만 보고 다른 사람이 도구 전체를 쓸 수 있는지 친구에게 시켜 보기.
output.py를 본떠, 어떤 함수의 반환값이든 {ok, command, data, error, hints} 봉투로 감싸고 성공 시 exit 0 / 실패 시 exit 1을 내는 데코레이터를 작성한다. 예외가 나면 error.recovery_action을 채워 넣게 하기.
공개 API 하나를 골라(허용된 대상), 요청 사이에 가우시안 지연을 넣고 429를 만나면 지수 백오프로 재시도하는 클라이언트를 throttle.py를 참고해 구현한다. 요청 간격 로그를 찍어 분포를 그래프로 확인하기.
auth/token_store.py처럼, cryptography의 Fernet + PBKDF2로 비밀 토큰을 "이 머신에서만" 복호화되도록 암호화해 저장·로딩하는 모듈을 만든다. 다른 머신에 파일을 복사하면 복호화가 실패하는지 검증하기.
| 주차 | 학습 주제 | 실천 목표 |
|---|---|---|
| 1주차 | 에이전트 도구 설계 원리 | "사람용 vs 에이전트용 도구"의 차이를 출력·에러·자기서술 관점에서 정리 |
| 2주차 | Click 고급 CLI | 커스텀 Group·콜백·컨텍스트로 에러를 JSON으로 변환하는 CLI 완성 |
| 3주차 | httpx + 비공식 API | 개발자도구로 공개 사이트 요청 관찰 → YAML 외부화 클라이언트 작성 |
| 4주차 | 브라우저 자동화 / patchright·Playwright | Playwright로 로그인 자동화, 반검출 개념과 한계 이해 |
| 5주차 | 암호화 기초 (cryptography) | Fernet·PBKDF2로 머신바인딩 비밀 저장소 구현 |
| 6주차 | SQLite WAL 캐싱 | TTL 캐시를 SQLite로 구현, WAL 모드의 동시성 이점 실험 |
| 7주차 | MCP 서버 만들기 | 같은 기능을 CLI와 MCP 두 방식으로 노출하는 도구 설계 |
| 8주차 | 윤리·컴플라이언스 | 자동화의 ToS·계정 리스크·rate limit 매너를 가이드라인으로 문서화 |
ok·schema_version·command·data·pagination·error·hints)로 결과를 감싸는 규약. 에이전트가 출력 형식을 한 번만 익히면 모든 명령을 다룰 수 있게 한다.boss schema로 자기 능력(명령·인자·에러코드)을 JSON으로 설명하는 것. 에이전트가 명령표를 하드코딩하지 않아도 되고, 도구가 업데이트돼도 자동으로 새 능력을 학습한다.AUTH_EXPIRED → boss login. 에이전트가 에러 메시지를 추측 해석하지 않고 그대로 따라 복구하게 한다.boss apply가 같은 직무에 두 번 투척하지 않도록 "이미 한 동작은 다시 해도 결과가 같게" 만드는 성질. 에이전트가 실수로 명령을 반복해도 안전하게 한다.cryptography 라이브러리의 대칭암호화 방식, PBKDF2는 비밀번호/머신 식별자에서 암호키를 파생하는 함수. 둘을 합쳐 로그인 토큰을 "이 머신에서만" 복호화되게 묶는다(머신 바인딩).show <#> 같은 재조회를 빠르게 한다.boss-mcp 콘솔 스크립트와 mcp_server.py로 CLI와 동일한 능력을 MCP 방식으로도 노출한다.| 링크 | 설명 |
|---|---|
| GitHub 저장소 | 소스 전체. src/boss_agent_cli/·docs/가 핵심 |
| capability-matrix.md | 에이전트용 능력 대조표 — 저위험 모드·CLI/MCP/Skill 대응·안전경계 |
| TrendShift 페이지 | 트렌딩 추이(일간 7위, 2026-06-09) |
| patchright | Playwright 반검출 fork — 로그인 무탐지의 핵심 |
| Click | boss-agent-cli CLI를 떠받치는 파이썬 CLI 프레임워크 |
| httpx | 즈핀 wapi 호출에 쓰는 HTTP 클라이언트 |
| cryptography | Fernet·PBKDF2 토큰 암호화의 기반 라이브러리 |
| Model Context Protocol | boss-mcp가 따르는 에이전트 연결 표준 |
| uv | uv tool install 설치·격리 실행의 기반 도구 |