xianyu-auto-reply
요약
FastAPI, React, Playwright를 활용하여 구축된 시엔위(Xianyu) 다중 계정 자동화 시스템입니다. 계정 관리, 메시지 자동 답장, 상품 게시 및 커미션 관리 기능을 포함한 통합 백엔드/프론트엔드 아키텍처를 제공합니다.
핵심 포인트
- FastAPI와 Playwright 기반의 웹 자동화 시스템
- 다중 계정 로그인 유지 및 실시간 메시지 송수신 지원
- Docker 및 Docker Compose를 통한 컨테이너 기반 배포
- 프론트엔드(React)와 백엔드(FastAPI)의 마이크로서비스 구조
FastAPI + React + MySQL + Redis + Playwright 기반의 시엔위(Xianyu) 다중 계정 자동화 시스템입니다.
메인 시스템은 계정 관리, 메시지 송수신, 자동 답장, 자동 발송, 상품 게시 및 백엔드 관리를 담당합니다; promotion
서브 프로젝트는 커미션 계정, 상품 선정 규칙, 소재 라이브러리, 게시 규칙, 삭제 규칙 및 관련 수정 작업을 담당합니다.
🔴 개발자분들의 PR(Pull Request) 제출을 환영하며, 시스템을 완성해 나갑니다.
🔴 다양한 프로젝트 맞춤 제작을 진행합니다. 어떤 프로젝트든 가능하며 필요 시 연락 바랍니다. 다만, 제가 실력이 부족하여 모든 것을 다 할 수 있지는 않습니다.
🔴 쿼크(Quark) 클라우드 디스크를 통해 「자동 발송」 기능을 공유해 드렸습니다. 링크를 클릭하거나 전체 내용을 복사하여 「쿼크 클라우드 디스크 APP」을 열면 획득할 수 있습니다.
🔴 /
79313YhCQU:/
| WeChat 그룹 | QQ 그룹 | WeChat 공식 계정 | Telegram | 후원 지원 |
|---|---|---|---|---|
| QR 코드를 스캔하여 WeChat 교류 그룹 참여 | QR 코드를 스캔하여 QQ 교류 그룹 참여 | 공식 계정을 팔로우하고 "최신 소스 코드"를 전송하여 최신 코드 획득 | QR 코드를 스캔하여 Telegram 그룹 참여 | 유용하다고 느끼신다면 저에게 커피 한 잔을 선물해 주세요 |
그룹 QR 코드가 만료된 경우, 공식 계정을 팔로우하여 최신 그룹 링크를 확인하세요.
| 모듈 | 설명 |
|---|---|
| 다중 계정 관리 | 여러 시엔위(Xianyu) 계정 로그인, 상태 전환, Cookie 유지 및 로그인 연장 지원 |
| ... | |
| 모듈 | 설명 |
| --- | --- |
| 커미션 계정 | 커미션 계정 로그인, 상태 관리, Cookie 유지 |
| ... | |
| 기술 | 설명 |
| --- | --- |
| FastAPI | 메인 시스템 및 커미션 백엔드 API 서비스 |
| ... | |
| 기술 | 설명 |
| --- | --- |
| React 18 + TypeScript | 메인 시스템 및 커미션 프론트엔드 |
| ... | |
| 기술 | 설명 |
| --- | --- |
| Docker / Docker Compose | 컨테이너화 배포 |
| Nginx | 프론트엔드 정적 리소스 및 리버스 프록시 |
-
Python 3.11+
-
Node.js 18+
-
MySQL 8.0+
-
Redis 6+
-
Chromium / Chrome (Playwright 관련 기능)
-
Docker 20.10+
-
Docker Compose 2.0+
-
최소 2 코어 CPU / 4GB RAM
-
권장 4 코어 CPU / 8GB RAM
xianyu-auto-reply/
├── backend-web/ # 메인 Web API 서비스 (포트 8089)
├── websocket/ # 시엔위(Xianyu) 연결 및 메시지 처리 서비스 (포트 8090)
...
| 서비스 | 기본 포트 | 설명 |
|---|---|---|
frontend | 9000 | 메인 시스템 프론트엔드 |
backend-web | 8089 | 메인 시스템 API 게이트웨이, 비즈니스 인터페이스 |
websocket | 8090 | 시엔위(Xianyu) WebSocket, 메시지 송수신, 로그인 및 주문 연동 |
scheduler | 8091 | 예약 작업 실행기 |
promotion/backend | 8092 | 커미션 백엔드 API |
promotion/frontend | 9001 | 커미션 프론트엔드 |
-
메인 시스템은 다중 서비스로 분리되어 있습니다:
frontend: 인터페이스 및 상호작용 담당
backend-web: 대부분의 비즈니스 API 담당
websocket: 시엔위(Xianyu) 실시간 연결, QR 코드 로그인, 메시지 처리 담당
scheduler: 자동 발송, 평가, 주문 가져오기, Cookie 갱신 등 예약 작업 담당
common: 모델, 데이터베이스, 자가 점검, 공통 서비스 및 도구 제공 -
커미션 서브시스템은
promotion/디렉토리에 위치하며, 프론트엔드와 백엔드가 독립되어 있습니다. 현재 루트 디렉토리의 Docker Compose 오케스트레이션에는 포함되어 있지 않습니다. -
메인 시스템의 세 가지 백엔드 서비스는 모두
/health상태 확인 인터페이스를 제공합니다. -
Docker 의존성 체인: mysql/redis → backend-web → websocket → scheduler; frontend → backend-web
서버에 Docker와 Docker Compose가 설치되어 있다면, 바로 일괄 배포 스크립트를 실행하면 됩니다:
curl -fsSL https://xy-update.zhinianboke.com/deploy.sh | sed 's/\r$//' | bash
이 스크립트는 배포에 필요한 설정 생성, 이미지 풀(pull), 이전 컨테이너 정리 및 서비스 시작을 자동으로 완료합니다.
버전을 업데이트하려면 바로 일괄 업데이트 스크립트를 실행하세요:
curl -fsSL https://xy-update.zhinianboke.com/update.sh | sed 's/\r$//' | bash
git clone https://github.com/zhinianboke/xianyu-auto-reply.git
cd xianyu-auto-reply
bash deploy.sh
-
처음 실행 시
.env설정 파일과docker-compose.deploy.yml이 자동으로 생성됩니다. -
알리바바 클라우드 (Alibaba Cloud) 이미지 저장소에서 사전 빌드된 이미지를 가져와 실행합니다.
-
암호화 버전 컨테이너가 감지되면 자동으로 정리합니다 (데이터 볼륨은 유지됨).
-
배포 완료 후 기본 접속 주소:
-
프론트엔드 (Frontend):
http://서버IP:9000 -
API 문서:
http://서버IP:8089/docs -
기본 계정:
admin/admin123 -
프론트엔드 (Frontend):
이후 업데이트:
bash update.sh
MySQL과 Redis를 외부(예: 클라우드 데이터베이스 RDS, 독립 서버 또는 기존 인스턴스)에서 제공하는 경우, deploy_remote.sh를 사용할 수 있습니다.
이 스크립트는 mysql/redis 컨테이너를 내장하지 않으며, 4개의 애플리케이션 서비스 (frontend / backend-web / websocket / scheduler)만 가져와 실행합니다.
데이터베이스 연결 정보는 .env.remote를 통해 설정합니다. 방식 1과 마찬가지로, 원격에서 스크립트를 직접 가져와 실행하면 됩니다:
# 1) 처음 실행: .env.remote를 자동 생성한 후 종료되며, 원격 연결 정보 입력을 요청합니다.
curl -fsSL https://xy-update.zhinianboke.com/deploy_remote.sh | sed 's/\r$//' | bash
# 2) .env.remote를 편집하여 실제 원격 주소를 입력합니다 (localhost를 입력하지 마세요).
...
이미 저장소를 클론(clone)한 경우 로컬 스크립트를 사용할 수도 있습니다:
bash deploy_remote.sh
(처음 설정 생성 후 종료되며, .env.remote를 작성한 뒤 다시 실행하십시오).
- 처음 실행 시
.env.remote를 자동 생성하며, 실행할 때마다docker-compose.remote.yml을 자동 생성합니다. 이는 루트 디렉토리에 있는 기존의.env/docker-compose.yml/docker-compose.deploy.yml에 영향을 주지 않습니다. - 컨테이너 이름은 메인 세트와 동일합니다 (
xianyu-backend-web/xianyu-websocket/xianyu-scheduler/xianyu-frontend). 이는 방식 2/방식 4와 동일한 배포 세트이므로, 두 방식 중 하나만 선택해야 하며 동시에 실행해서는 안 됩니다. - 원격 MySQL은 미리 데이터베이스(기본값
xianyu_data)를 생성하고 배포 서버의 IP에 대해 원격 접속 권한을 부여해야 합니다. 애플리케이션 실행 시 자동으로 테이블을 생성하고 필드를 보완합니다. - 만약 원격 DB/캐시가 호스트 머신(host machine)에 있는 경우,
host.docker.internal또는 호스트의 내부 네트워크 IP를 사용하십시오.localhost/127.0.0.1을 입력하지 마십시오.
주요 명령어:
| 명령어 | 설명 |
|---|---|
bash build.sh rebuild | 기존 컨테이너와 이미지를 삭제하고, 다시 빌드하여 실행 |
bash build.sh start | 서비스 시작 |
bash build.sh stop | 서비스 중지 |
bash build.sh restart | 서비스 재시작 |
bash build.sh logs | 실시간 로그 확인 |
bash build.sh status | 서비스 상태 확인 |
특정 서비스만 개별 재빌드 (다른 서비스에 영향을 주지 않음):
bash build_frontend.sh # 프론트엔드 재빌드
bash build_backend_web.sh # Backend-Web 재빌드
bash build_websocket.sh # WebSocket 재빌드
...
로컬 MySQL / Redis를 사용할 수도 있고, Docker를 사용하여 인프라만 실행할 수도 있습니다:
docker compose up -d mysql redis
메인 시스템 주요 .env 설정 예시:
ENVIRONMENT=development
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
...
# Backend-Web 서비스
cd backend-web
python -m venv .venv
...
# WebSocket 서비스
cd websocket
python -m venv .venv
...
# Scheduler 서비스
cd scheduler
python -m venv .venv
...
cd frontend
npm install
npm run dev
# 리베이트 (Promotion) 백엔드
cd promotion/backend
pip install -e .
...
| 변수 | 설명 |
|---|---|
MYSQL_HOST / MYSQL_PORT / MYSQL_USER / MYSQL_PASSWORD / MYSQL_DATABASE | MySQL 연결 |
REDIS_HOST / REDIS_PORT / REDIS_PASSWORD / REDIS_DB | Redis 연결 |
JWT_SECRET_KEY | JWT 키, 데이터베이스에서 통합 관리 (최초 실행 시 자동 생성 및 영구 저장), 수동 설정 불필요 |
BACKEND_WEB_PORT / WEBSOCKET_PORT / SCHEDULER_PORT | 각 서비스 포트 |
WEBSOCKET_SERVICE_URL / SCHEDULER_SERVICE_URL / BACKEND_WEB_SERVICE_URL | 서비스 간 호출 주소 |
BACKEND_WEB_PUBLIC_URL | 외부 접속 주소, 파일 URL 생성에 사용 |
CORS_ORIGINS | CORS 화이트리스트 |
BROWSER_HEADLESS | Playwright의 Headless (무두) 실행 여부 |
- 메인 시스템 시작 시 테이블 자동 생성, 자가 점검, 누락된 필드 보완, 기본 데이터 초기화 수행
- 기본 관리자:
admin
/admin123
- 리베이트 시스템 시작 시 독립적인 데이터베이스 자가 점검 실행
- 리베이트 시스템 테이블은
fy_접두사를 통합 사용 - 외래 키 (Foreign Key) 제약 조건에 의존하지 않으며, 관계는 코드로 유지 관리 - 모든 시간은 베이징 시간 (
Asia/Shanghai)을 통합 사용
백엔드는 통합 응답 래퍼 (Response Wrapper)를 채택하며, 비즈니스 예외 발생 시에도 HTTP 200을 반환합니다:
{
"success": true,
"code": 200,
...
| 스크립트 | 플랫폼 | 역할 |
|---|---|---|
deploy.sh | Linux | 원격 이미지 버전의 compose를 생성하고 이미지를 가져와 실행 (최초 배포) |
deploy_remote.sh | Linux | 원격 MySQL/Redis를 사용하여 배포, docker-compose.remote.yml 및 .env.remote를 생성하고 애플리케이션 서비스 실행 |
update.sh | Linux | 최신 원격 이미지를 가져와 애플리케이션 컨테이너 재구축 (후속 업데이트) |
build.sh | Linux | 소스 코드로부터 모든 Docker 이미지를 전체 빌드하고 실행 |
build_frontend.sh | Linux | Frontend 서비스를 단독으로 재구축 및 재시작 |
build_backend_web.sh | Linux | Backend-Web 서비스를 단독으로 재구축 및 재시작 |
build_websocket.sh | Linux | WebSocket 서비스를 단독으로 재구축 및 재시작 |
build_scheduler.sh | Linux | Scheduler 서비스를 단독으로 재구축 및 재시작 |
EXE打包构建.bat | Windows | Nuitka를 사용하여 데스크톱 런처 EXE 패키징 |
离线依赖打包.bat | Windows | 오프라인 설치를 위한 모든 Python 의존성 패키징 |
scripts/Pipeline脚本-xianyu-auto-reply.groovy | Jenkins | CI/CD 파이프라인, 멀티 아키텍처 이미지를 빌드하여 알리바바 클라우드 ACR으로 푸시 |
JWT 인증: 메인 시스템과 리베이트 시스템 모두 로그인 상태 제어를 위해 JWT를 사용합니다
비밀번호 저장: 비밀번호는 해시 (Hash) 방식으로 저장됩니다
SQL 인젝션 (SQL Injection) 방지: 데이터베이스 액세스 시 파라미터화된 쿼리 (Parameterized Query)를 사용합니다
XSS 방지: 프론트엔드 입력 및 표시 시 검증과 이스케이프 (Escape) 처리를 수행합니다
CORS 제어: 운영 환경에서는 명확한 도메인으로 제한해야 합니다
- 즉시 기본 관리자 비밀번호를 변경하세요
- JWT 키는 데이터베이스에서 통합 관리되며, 최초 실행 시 강력한 랜덤 키가 자동 생성됩니다 (수동 설정 불필요)
- 올바른
BACKEND_WEB_PUBLIC_URL및 리버스 프록시 주소를 설정하세요 - 외부 접속 엔트리포인트에 HTTPS를 구성하세요 - 정기적으로 MySQL 및 정적 리소스 디렉토리를 백업하세요
- Playwright 브라우저가 올바르게 설치되었는지 확인하세요
현재 docker-compose.yml은
메인 시스템만 덮어씁니다. 리베이트 시스템은 별도로 실행해야 합니다.
Backend-Web 및 WebSocket은 해당 Python 환경에서 다음 명령어를 순차적으로 실행해야 합니다:
python -m playwright install chromium
python -m patchright install chromium
Docker 환경은 각 서비스의 Dockerfile 내에 이미 설치된 브라우저에 의존합니다.
루트 디렉토리의 .env 파일 내 포트 설정을 수정한 후 다시 배포하세요.
스크립트 파일에 Windows 줄 바꿈 문자(CRLF)가 포함되어 있으면 Linux에서 인식할 수 없습니다. 해결 방법:
# 방법 1: sed를 사용하여 \r을 제거한 후 실행
sed -i 's/\r$//' deploy.sh
bash deploy.sh
...
본 프로젝트는 GNU Affero General Public License v3.0 (AGPL-3.0) 오픈 소스 라이선스를 채택합니다.
본 프로젝트는 기술 학습 및 연구 목적으로만 제공되며, 사용자는 사용에 따른 위험을 스스로 부담해야 합니다. 관련 플랫폼의 이용 약관 및 법률을 준수하십시오.
- 본 프로젝트는 본 시스템 사용으로 인해 발생하는 어떠한 결과에 대해서도 책임을 지지 않습니다.
- Xianyu(闲鱼) 플랫폼의 규칙을 위반하는 행위에 사용하지 마십시오.
- 상업적 용도로 사용하지 마십시오.
- 본 시스템 사용 시 계정 리스크가 발생할 수 있으므로 주의하여 사용하십시오.
본 프로젝트는 다음의 오픈 소스 프로젝트를 참고하였습니다:
XianYuApis - Xianyu API 인터페이스에 대한 기술적 참고 제공
XianyuAutoAgent - 자동화 처리 구현 아이디어 제공
myfish - QR 코드 로그인 구현 아이디어 제공
본 프로젝트의 개발에 귀중한 참고 자료와 영감을 준 이 우수한 오픈 소스 프로젝트들에 감사드립니다!
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending Python (daily)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기