在闲鱼上卖虚拟商品(卡券、会员、教程等),最烦的就是每次买家付款后要手动回复卡密。尤其凌晨下单的,等你第二天看到,买家可能已经退款差评了。
今天就来搭建一个完全自托管的闲鱼自动发货系统,用 Docker 一键部署,支持:
- 买家下单 → 自动检测订单
- 自动发送卡券内容(卡密/链接/教程)
- 自动确认收货
- 多账号、多商品管理
- Web 面板可视化管理
系统架构
整套系统由 6 个 Docker 容器组成:
┌─────────────────────────────────────┐
│ Nginx / 前端 (9000) │
│ Vue.js Web 面板 │
└──────────────┬──────────────────────┘
│
┌──────────────▼──────────────────────┐
│ Backend Web (8089) │
│ FastAPI 管理接口 │
└──────────────┬──────────────────────┘
│
┌──────────────▼──────────────────────┐
│ WebSocket (8090) │
│ 闲鱼 LWP 长连接,收发消息 │
└──────────────┬──────────────────────┘
│
┌──────────────▼──────────────────────┐
│ Scheduler (8091) │
│ 定时轮询订单,触发发货 │
└─────────────────────────────────────┘
│ │
┌───────▼──┐ ┌─────▼─────┐
│ MySQL │ │ Redis │
│ 订单存储 │ │ 缓存/队列 │
└──────────┘ └───────────┘
准备工作
服务器要求
- Linux 服务器(推荐 CentOS 7+ / Ubuntu 20.04+)
- 至少 2GB 内存(实际运行约 1.2GB)
- 安装 Docker 和 Docker Compose
- 开放端口:9000(前端)、8089-8091(后端服务)
闲鱼账号准备
- 一个闲鱼卖家账号
- 在闲鱼 App 上发布商品(虚拟卡券类)
- 准备好卡券内容(卡密列表)
第一步:安装 Docker
如果你的服务器还没装 Docker,用官方脚本一键安装:
# 安装 Docker
curl -fsSL https://get.docker.com | bash
# 启动并设置开机自启
systemctl enable docker
systemctl start docker
# 安装 Docker Compose
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 验证
docker --version
docker-compose --version
第二步:拉取并启动系统
创建项目目录并下载配置文件:
mkdir -p /opt/xianyu-auto-ship/xianyu_auto_reply
cd /opt/xianyu-auto-ship
# 下载 docker-compose 配置文件
# (配置文件包含 mysql、redis、backend-web、websocket、scheduler、frontend 6个服务)
# 启动所有服务
docker-compose up -d
# 查看运行状态
docker ps
首次启动会从阿里云镜像仓库拉取镜像,等待几分钟后所有容器变为 healthy 即可。
第三步:配置系统
打开浏览器访问 http://你的服务器IP:9000,进入 Web 管理面板。
3.1 登录闲鱼账号
在管理面板 → 账号管理 → 添加闲鱼账号,系统会引导你扫码登录。登录成功后 WebSocket 服务会建立与闲鱼的长连接,实时监听消息。
3.2 添加商品
在商品管理中录入闲鱼商品 ID(从闲鱼商品链接中获取),并关联上你的卡券库。
3.3 导入卡券
在卡券管理中批量导入卡密,每行一条,支持文本、CSV 格式。
第四步:发货流程
配置完成后,系统的自动发货流程如下:
- Scheduler 定时轮询:每 5 分钟检查一次待发货订单
- 匹配卡券:根据商品 ID 从卡券库中取一条未使用的卡密
- 发送消息:通过 WebSocket 长连接发送卡券内容给买家
- 确认收货:自动确认发货,订单状态更新为已发货
- 记录日志:所有操作记录入库,可追溯
常见问题与踩坑记录
1. WebSocket 连接断开
闲鱼的 LWP(Long Web Polling)连接有超时机制,长时间无消息会自动断开。系统内置了心跳保活和自动重连,一般不需要干预。如果频繁断开,检查:
- 服务器网络是否稳定
- 闲鱼账号是否被风控(频繁操作会触发)
2. 无法获取会话 chat_id
发货需要知道买家会话的 chat_id。如果买家从未主动发过消息,系统无法创建会话,需要手动在闲鱼 App 上先给买家发一条消息激活会话。
3. 滑块验证码
闲鱼登录或频繁操作时会弹出滑块验证。系统内置了 DrissionPage 浏览器自动化引擎来处理验证码,首次处理可能较慢(约 15-25 秒)。
4. 账号风控
如果闲鱼检测到异常操作(频繁发送相似消息、短时间大量操作),可能会限制账号功能。建议:
- 消息间隔设置 20 秒以上
- 不同订单的回复内容增加随机变化
- 不要同时登录多个设备
资源占用实测
在 2 核 2G 的阿里云轻量服务器上运行 6 个容器,实际资源占用:
| 容器 | 内存 | 说明 |
|---|---|---|
| MySQL | ~200MB | 订单/卡券/日志存储 |
| Redis | ~30MB | 缓存和消息队列 |
| WebSocket | ~300MB | 含浏览器引擎(处理验证码) |
| Backend Web | ~180MB | API 服务 |
| Scheduler | ~150MB | 定时任务 |
| Frontend | ~50MB | 静态页面 |
| 合计 | ~900MB | 建议 1.5GB 以上内存 |
如果用不到的时候想释放资源,直接 docker stop 全部容器即可,内存立即回收。
管理命令速查
# 启动所有服务
docker-compose up -d
# 停止所有服务
docker stop xianyu-scheduler xianyu-frontend xianyu-websocket \
xianyu-backend-web xianyu-redis xianyu-mysql
# 查看日志
docker logs -f xianyu-websocket --tail 100
# 重启单个服务
docker restart xianyu-backend-web
# 进入容器调试
docker exec -it xianyu-websocket bash
# 查看数据库
docker exec -it xianyu-mysql mysql -u xianyu -p
总结
这套系统用 Docker 部署,好处是:
- 一键部署:不用折腾 Python 环境、依赖包
- 隔离运行:每个服务独立容器,互不影响
- 资源可控:可以限制每个容器的内存上限
- 迁移方便:换服务器只需打包数据目录
如果你也在闲鱼卖虚拟商品,值得花半小时部署一套。至少不用半夜被买家消息吵醒了。