<div align="center">
<img src="https://raw.githubusercontent.com/cv-cat/catbus/HEAD/assets/hero.svg" width="100%" alt="catbus — 탑승하여 모든 플랫폼으로 이동합니다.">
<br>
하나의 명령어로 12개 플랫폼에 접속합니다.<br>
샤오홍슈 · 더우인(抖音) · TikTok · B站 · 콰이쇼우 · 웨이보 · 앳시유(闲鱼) · 타오바오 · 징동 · X · 12306 · 마오옌 공연
<br>
<sub>곧 탑승 예정: Instagram · YouTube · Facebook · 지후(知乎) · 위챗 공식 계정 · 오늘 헤드라인 · 더우워(得物) · 핀다오둬(拼多多) · 메이퇀(美团) · 대중평점(大众点评)</sub>
<br>
npm
License: MIT
Node
TypeScript
Platforms
Agent Ready
간체 중국어 · English · 번체 중국어 · 일본어 · 한국어
빠른 시작 가이드 · 기능 매트릭스 · 각 플랫폼 · 예시 · Agent용
</div>
<br>
각 플랫폼은 자체적인 API, 서명(signature), 로그인 방식 및 데이터 형식을 가지고 있습니다. catbus는 이들을 하나의 차량에 담았습니다: 동일한 명령어 세트, 동일한 JSON 형식, 동일한 로그인 상태 디렉토리입니다. 플랫폼을 변경하는 것은 단지 단어 하나를 바꾸는 것만으로 충분합니다.
<div align="center">
<a href="https://api.openai-next.com">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="assets/sponsors/vectrust-dark.png">
<img src="https://raw.githubusercontent.com/cv-cat/catbus/HEAD/assets/sponsors/vectrust.png" alt="Vectrust" height="72">
</picture>
</a>
<sub>여기에 등장하고 싶으신가요?</sub>
</div>
✨ catbus란 무엇인가
catbus(마오바시)는 명령줄 도구로, 통일된 구문을 사용하여 12개의 중국 및 해외 주요 플랫폼의 웹 기능을 호출합니다: 검색, 상세 정보, 댓글, 사용자, 추천 피드, 다운로드, 게시, 다이렉트 메시지, 라이브 채팅 자막, 열차 잔여 좌석 가격, 공연 조회 등...
catbus xhs item search 露营 --sort latest
catbus douyin item search 露营 --sort latest
catbus bilibili item search 露营 --sort latest
...
네 개의 플랫폼에 대해 거의 동일한 명령어를 사용하며, 출력은 동일한 구조의 JSON을 가집니다. 노트(笔记), 작품(作品), 원고(稿件), 트윗(推文) 등 모든 것은 item으로, 검색은 모두 search로, 좋아요는 모두 like로 불립니다. 한 번 배우면 12개 플랫폼 모두에 적용할 수 있습니다.
<p align="center">
<img src="https://raw.githubusercontent.com/cv-cat/catbus/HEAD/assets/platforms.svg" width="100%" alt="지원되는 10개 플랫폼과 개발 중인 10개 플랫폼">
</p>
🚀 왜 catbus인가
<table>
<tr
><td width="50%" valign="top">
🧭 동의어 및 동일 명칭
의미가 같은 기능이라도 모든 플랫폼에서 동일한 명령어, 동일한 매개변수 그룹, 동일한 출력을 사용합니다. 만약 해당 플랫폼의 네이티브 용어(예: note, aweme, tweet 등)를 사용하더라도 문제없으며, catbus가 어떤 단어를 사용해야 하는지 알려줄 것입니다.
</td>
</tr>
</table>
📦 Node만 있으면 충분
Python, 컴파일러 또는 어떤 시스템 의존성도 필요하지 않습니다. 네이티브 의존성은 Windows, macOS, Linux의 x64 / arm64(musl 포함)를 커버하는 사전 컴파일 패키지가 모두 제공되며, CI 환경에서 8개 목표 시스템에 대해 순차적인 스모크 테스트가 진행됩니다.
🤖 AI Agent를 위해 태어남
stdout은 JSON 형식만 출력하며, 종료 코드가 안정적이고 오류 메시지에는 다음으로 실행해야 할 명령어가 포함되어 있습니다. catbus platforms는 전체 기능 목록을 출력합니다. Agent 스킬과 llms.txt가 내장되어 있습니다.
🔐 로그인 상태는 오직 당신의 컴퓨터에만 존재
QR 코드, 문자 메시지(SMS), 쿠키 가져오기 등 모든 방식의 로그인이 지원되며, 자격 증명은 플랫폼 × 장치 × 계정 기준으로 ~/.catbus/ (0700 / 0600)에 격리됩니다. 다중 계정 간 전환이 자유롭습니다. 데이터를 수집하거나 업로드하지 않으며, 원격 측정(telemetry) 기능도 없습니다.
🧪 상위 시스템과 바이트 단위로 일치
요청되는 URL, 헤더 순서, 쿠키, 본문 및 서명은 고정된 난수와 클럭 하에서 상위 구현체와 바이트 단위로 비교 검증됩니다. 560개 이상의 쌍으로 이루어진 비교 데이터와 940개 이상의 오프라인 테스트가 모든 변경 사항을 보호합니다.
🛡️ 브라우저 수준의 네트워크 스택
실제 Chrome과 동일한 TLS / HTTP2 지문(fingerprint)을 사용하며, 상위 시스템에서 서명된 JS는 샌드박스 내에서 실행됩니다. 슬라이더나 캡차 인증 코드는 로컬 ONNX와 OpenCV를 사용하여 자동으로 식별합니다.
📊 주요 수치
<div align="center">
| 🚌 플랫폼 | ⌨️ 구현된 명령어 | 🧪 비교 데이터 | ✅ 오프라인 테스트 | 💻 목표 시스템 |
|---|
| 12 | 300+ | 560+ | 960+ | 8 |
</div>
🏗️ 아키텍처
<p align="center">
<img src="https://raw.githubusercontent.com/cv-cat/catbus/HEAD/assets/architecture.svg" width="100%" alt="catbus 아키텍처">
</p>
- 하나의 레지스트리가 모든 것을 구동 : 명령어 파싱, 4단계
--help, catbus platforms, 기능 매트릭스 모두 동일한 레지스트리에서 생성되므로 서로 모순될 일이 없습니다.
- 플랫폼당 파일 세트:
client가 세션 및 서명을 관리하고, api는 상위 시스템 메서드에 일대일로 대응하며, normalize는 원시 데이터를 통일된 타입으로 변환하고, resolve는 ID, 링크, 공유 단축 URL, me 등 모든 것을 파라미터로 사용할 수 있게 합니다.
- 확장성: 앱/PC 환경을 위해 위치가 예약되어 있으며, 비(非) JS 기반의 상위 시스템은 provider 프로토콜을 통해 연결됩니다.
🤖 AI Agent를 위해 태어남
catbus는 첫날부터 '프로그램에 의해 호출'되는 방식으로 설계되었습니다:
catbus platforms douyin | jq '.data.commands[] | select(.status=="implemented") | .resource + " " + .action'
- 자설명(Self-describing): 각 플랫폼과 명령어별 로그인 요구 사항, 구현 상태, 상위 시스템 지원 정도를 단 하나의 명령어로 확인할 수 있습니다.
- 예측 가능(Predictable): 성공과 실패 모두 동일한 구조의 봉투
{ ok, data, page, error }를 사용하며, error.hint에는 다음 명령어가 직접 제시됩니다.
- 연속 처리(Chaining): 모든 출력 객체는
id와 url을 포함하고 있어, 이전 명령어의 결과를 다음 명령어에 바로 전달할 수 있습니다.
- 신중함(Prudent): 위험한 작업은 명시적인
-y가 필요하며, 게시물 설정은 비공개로 기본 설정 가능합니다. 트래픽 제어(Risk Control) 상황에서는 RISK_CONTROL을 명확히 보고하고 조용히 재시도하지 않습니다.
단 하나의 명령어로 catbus 스킬을 Claude Code, Cursor, Codex 등 Agent에 탑재할 수 있습니다:
npx skills add cv-cat/catbus
스킬은 필요에 따라 로드됩니다. 개요는 한 페이지로 되어 있으며, 어떤 플랫폼에서 어떤 종류의 작업(수집, 게시, 라이브 메시지, 오류 진단)을 할지에 따라 해당 하위 파일을 읽게 되며, 로그인은 사용자에게 맡기고, 작업 실행 전 확인을 거치고, 게시물 기본 비공개 설정 및 트래픽 제어 시 중단하는 등 안전장치가 내장되어 있습니다.
⚡ 30초 만에 탑승
npm i -g catbus-cli
catbus doctor
...
Docker를 사용하거나 소스 코드에서 설치할 수 있으며, 전체 단계는 빠른 시작하기를 참조하세요.
📚 문서
🤝 참여
Issue 및 PR을 환영합니다: 새로운 플랫폼, 새로운 명령어, 플랫폼 인터페이스 변경, 문서 개선 등 모두 가능합니다. 시작하기 전에 CONTRIBUTING.md와 AGENTS.md를 읽어보세요 (규범이 우선이며, 요청에는 근거가 있어야 합니다). 보안 문제는 SECURITY.md에 따라 비공개로 보고해 주세요.
📈 Star 추이
<a href="https://cvcat.site/star-history/svg?repos=cv-cat/catbus&type=Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://cvcat.site/star-history/svg?repos=cv-cat/catbus&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://cvcat.site/star-history/svg?repos=cv-cat/catbus&type=Date" />
<img alt="Star History Chart" src="https://cvcat.site/star-history/svg?repos=cv-cat/catbus&type=Date" />
</picture>
</a>
🍔 커뮤니티 채널
크롤링과 AI Agent에 관심이 있다면 그룹 채팅방에 참여하여 함께 토론해 보세요~
ps: 그룹이 가득 찼거나 QR 코드가 만료된 경우, Issue를 제기하거나 위챗(WeChat) / QQ로 알려주세요.
| group-1 | group-2 | group-3 | group-4 (2000명 QQ 그룹) |
|---|
| <img width="280" alt="group1" src="https://cvcat.site/assets/group1.jpg" /> | <img width="280" alt="group2" src="https://cvcat.site/assets/group2.jpg" /> | <img width="280" alt="group3" src="https://cvcat.site/assets/group3.jpg" /> | <img width="280" alt="group4" src="https://cvcat.site/assets/group4.jpg" /> |
<details>
<summary><b class="warning">⚠️ 면책 조항</b></summary>
<br>
- 본 프로젝트는 학습 및 연구 목적으로만 제공되며, 상업적 용도 또는 기타 불법적인 용도로 사용해서는 안 됩니다.
- 사용 시 각 플랫폼의 사용자 계약 및 서비스 약관, 그리고 거주 지역의 법규를 준수해야 합니다. 타인의 개인 정보를 수집하거나 전파하지 말고, 플랫폼에 과도한 요청 부하를 주지 마십시오.
- 자동화 작업은 플랫폼의 위험 통제(Risk Control) 시스템을 작동시켜 캡차, 속도 제한 또는 계정 정지를 유발할 수 있습니다. 본 프로젝트 사용으로 인해 발생하는 모든 결과는 사용자 본인이 책임져야 합니다.
- 본 프로젝트는 상기 어떤 플랫폼과도 관련이 없으며, 그들의 승인이나 인정을 받은 바 없습니다. 각 플랫폼의 이름과 상표는 소유자에게 속합니다.
</details>
📄 라이선스
MIT © 2026 cv-cat
<div align="center">
<br>
<img src="https://raw.githubusercontent.com/cv-cat/catbus/HEAD/assets/logo.svg" width="64" alt="catbus">
<br>
<sub style="font-size: 0.9em;">탑승하세요, 모든 플랫폼으로 · All aboard, every platform.</sub>
</div>