🐟 闲鱼自动发货系统
统一发货指南。无论什么模型、什么会话,按此流程执行即可。
一、设计理念
┌─────────────────────────────────────────────────────────────┐
│ 核心检测层(框架提供) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 监控聊天 │ -> │ 检测付款 │ -> │ 触发发货 │ │
│ │ - 新消息 │ │ - 系统卡片 │ │ - 调用钩子 │ │
│ │ - 未读标记 │ │ - 状态判断 │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 自定义发货层(可扩展) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 秘钥发货 │ │ 链接发货 │ │ API发货 │ ... │
│ │ - 固定秘钥 │ │ - 网盘链接 │ │ - 调用接口 │ │
│ │ - 秘钥池 │ │ - 下载地址 │ │ - 返回数据 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
核心原则:
- 关注点分离:检测逻辑统一,发货逻辑按商品类型自由定制
- 先标记后发货:必须先调虚拟发货API让订单状态变更,再发送内容给买家
- 风控兜底:遇到风控/登录失效自动截图通知用户扫码恢复
- 可扩展:支持任意类型的发货方式(秘钥、链接、文件、API等)
二、系统架构
Cron(每30分钟) → Isolated Session
│
├─ 浏览器CDP → 打开闲鱼聊天页
│ ├─ 被风控(captcha)
│ │ ├─ 截图页面找二维码 → 发群让用户扫码
│ │ ├─ 用户手动在APP扫码 → 恢复登录
│ │ └─ 上报群聊:⚠️ 风控已触发,请扫码恢复
│ ├─ 登录态失效(需要扫码登录)
│ │ ├─ 截图二维码 → 发群让用户扫码
│ │ └─ 上报群聊:⚠️ 登录已过期,请扫码重新登录
│ └─ 正常加载 → 扫描聊天列表
│ ├─ 无新订单 → 上报群聊 ✅
│ └─ 有已付款订单 → 走发货流程
│
└─ 发货流程(顺序不能错)
├─ ① 获取订单号(点"去发货"进入订单详情页)
├─ ② 调虚拟发货API(标记已发货)
│ ├─ 成功 → 继续
│ └─ 失败 → 通知群聊叫用户协助扫码
└─ ③ 发送商品内容给买家(秘钥/链接/文件)
三、浏览器配置
使用 Chrome(非 headless)+ Xvfb 虚拟显示器,避免被闲鱼反爬。
# Xvfb 保活
pgrep Xvfb || (nohup Xvfb :99 -screen 0 1920x1080x24 > /tmp/xvfb.log 2>&1 &)
# Chrome 由 Gateway 管理(CDP 18800)
# openclaw.json 配置 headless: false
# systemd service 配置 DISPLAY=:99
四、完整踩坑记录(13条)
🕳️ 坑1:headless 浏览器被闲鱼反爬
问题: Obscura/headless Chrome 访问闲鱼被拦截 原因: 闲鱼检测 navigator.webdriver 等 headless 特征 解决: headless=false + Xvfb 虚拟显示器(:99, 1920x1080x24)
🕳️ 坑2:Xvfb 进程会挂
解决: 保活:pgrep Xvfb || (nohup Xvfb :99 -screen 0 1920x1080x24 > /tmp/xvfb.log 2>&1 &)
🕳️ 坑3:DISPLAY 环境变量不传递
解决: systemd service 加 Environment=DISPLAY=:99
🕳️ 坑4:验证码收不到
解决: 换用闲鱼 APP 扫码登录
🕳️ 坑5:Cron 用 --system-event 无效
解决: 改用 --message + --session isolated
🕳️ 坑6:Cron 每分钟触发风控
解决: 改为 */30 * * * * 每30分钟一次
🕳️ 坑7:不要截图二维码发给用户(已修正)
错误做法: 点"去发货"→截图二维码→发给用户扫码→用户APP确认 正确做法: 点"去发货" 只是为了获取订单号(URL中orderId参数),然后直接调虚拟发货API完成发货。API返回 SUCCESS 后订单状态自动变为"你已发货"。如果API调用失败 → 通知群聊,叫用户用APP协助扫码确认
🕳️ 坑8:浏览器 Tab 会丢失
解决: 每次检查时用 browser action=open 重新创建
🕳️ 坑9:多订单处理(同一买家下多单)
特征: 聊天页显示"N个订单交易中" 解决: 检查所有 "等待你发货" 的消息卡片,逐一处理
🕳️ 坑10:发货后订单状态不变(已修正)
解决: 调 API mtop.taobao.idle.logistic.consign.dummy → 状态直接变"你已发货"
🕳️ 坑11:_m_h5_tk 会过期
解决: 浏览器访问闲鱼首页会自动续期,保持浏览器常开
🕳️ 坑12:QR登录不给 _m_h5_tk
解决: 从浏览器页面获取 _m_h5_tk,与 QR session cookie 合并使用
🕳️ 坑13:持续风控拦截·QR码人工恢复
问题: 闲鱼持续弹出「非法访问」提示,所有自动操作被阻断 原因: 闲鱼风控系统激活,检测到自动化环境 解决:
- screenshot 当前页面,寻找二维码
- 截图发送到闲鱼群聊({{FEISHU_CHAT_ID}})
- 让用户用闲鱼APP扫描二维码恢复登录
- 恢复后,所有 HTTP-only cookie 自动更新,token 刷新
五、统一发货流程(核心)
顺序固定:先标记发货 → 再发送内容。 不要搞反。
步骤1:打开闲鱼聊天页
browser action=open label=xianyu profile=openclaw targetUrl=https://www.goofish.com/im
步骤2:检查风控
获取快照,搜索关键字:
- "unusual traffic" / "滑块" / "slide to verify" / "非法访问" / "使用正常浏览器" → 被风控,执行风控恢复流程(见第六章),不要直接退出
- 没有以上关键字 → 正常继续
步骤3:快速检测付款
在快照中搜索以下系统消息(不是用户手打文本):
- "等待卖家发货"
- "等待你发货"
- "我已付款,等待你发货"
付费订单特征: 系统消息卡片(带图标)+ 文本含以上关键字 + 旁边有"去发货"按钮
排除情况:
- 用户手打的:"我已付款了"、"老板发货"等
- 没有"去发货"按钮的消息
- "待付款"状态的卡片
无新消息快速退出: 如果当前聊天列表没有新消息(没有红点、没有"刚刚"时间戳),可以快速结束检查。
步骤4:进入买家聊天并获取订单号
找到对应买家 → 点击进入聊天 → 点击"去发货"按钮
→ 这会打开订单详情页(新标签页)
→ 从 URL 中提取 orderId=数字,这就是订单号
步骤5:调 API 标记已发货(关键步骤)
用虚拟发货API标记订单为"已发货":
API: mtop.taobao.idle.logistic.consign.dummy
参数: {"orderId":"订单号","tradeText":"","picList":[],"newUnconsign":true}
签名: MD5(token + "&" + timestamp + "&" + {{YOUR_APP_KEY}} + "&" + data)
Cookie 构造(重要):
- 需要从浏览器获取最新的
_m_h5_tk(执行 document.cookie) - 关键:必须用 goofish.com 域的 cookie,不要用 taobao.com 域的!
- 通过 Network.getAllCookies 获取全部 cookie,筛选 domain 包含 .goofish.com 的
- goofish.com 的 _m_h5_tk 是扫码登录后生成的,有完整会话
- taobao.com 的 _m_h5_tk 只是浏览页面时生成的,未登录,不能用于发货 API
- 配合已有的 session cookie(cookie2, t, tb_token 等)合并使用
处理结果:
- API返回包含
SUCCESS::调用成功或ORDER_ALREADY_DELIVERY→ ✅ 标记成功,继续步骤6 - API返回
FAIL_SYS_TOKEN_EXOIRED→ token过期,放弃,等下次 - API返回其他错误 → ⚠️ API失败,通知群聊让用户协助扫码确认
步骤6:发送内容给买家
回到聊天页,在输入框输入内容并发送。
方式A - 固定秘钥/链接:
您的秘钥:XXXX-XXXX-XXXX,祝您使用愉快!
或
你好!资料已发到网盘,链接:{{YOUR_PAN_LINK}} 提取码:{{EXTRACT_CODE}} 请及时下载!
方式B - 秘钥池(每个订单用不同秘钥):
- 从秘钥池文件读取第一行
- 删除已用行
- 将秘钥发送给买家
方式C - 调用外部API获取秘钥:
先 curl 调用外部API获取秘钥 → 再将秘钥发送给买家
方式D - 混合方式(先发教程再发秘钥):
分别发送两条消息
步骤7:返回聊天列表并上报结果
browser action=navigate profile=openclaw targetId=xianyu url="https://www.goofish.com/im"
用 message 工具发送到闲鱼群聊(target: {{FEISHU_CHAT_ID}}):
三种情况:
✅ 闲鱼检查通过,无新订单
⚠️ 闲鱼页面被风控拦截,下次再试
✅ 已处理 X 笔订单:买家名 | 订单号 xxx
六、风控恢复流程
当检测到风控/登录失效时,不要直接放弃,按以下步骤尝试恢复:
风控拦截(滑块/非法访问)
- 截图当前页面,寻找二维码
- 将截图发送到闲鱼群聊,让用户用APP扫码
发送截图到群聊:message action=send channel=feishu target={{FEISHU_CHAT_ID}} message="⚠️ 闲鱼被风控拦截,请打开闲鱼APP扫描下方二维码恢复登录"message action=send channel=feishu target={{FEISHU_CHAT_ID}} filePath=/tmp/openclaw/screenshot-xxx.png - 等待用户扫码恢复,当前任务结束。下次 Cron 触发时自动使用新的登录态。
登录失效(需要扫码登录)
- 截图二维码所在区域
- 发送到闲鱼群聊让用户扫码
- 通知用户
如果页面有可识别的二维码元素,优先截图包含二维码的区域。 如果页面没有二维码(如纯文字提示),截全屏并发到群聊说明情况。
七、API发货失败兜底
API发货失败时,通知群聊让用户协助:
message action=send channel=feishu target={{FEISHU_CHAT_ID}} message="⚠️ 发货API调用失败,请扫码确认发货"
然后发送截图给用户扫码(作为兜底方案):
message action=send filePath=截图路径 message="请扫码确认发货" target={{FEISHU_USER_ID}}
八、Cron 配置
openclaw cron add \
--name "闲鱼自动发货" \
--cron "*/30 * * * *" \
--tz "Asia/Shanghai" \
--session isolated \
--light-context \
--announce \
--channel feishu \
--target {{FEISHU_CHAT_ID}} \
--message '检查闲鱼新消息,有已付款订单就发货。流程:①打开聊天页→②检查风控→③扫描待发货订单→④点去发货获取订单号→⑤调虚拟发货API标记已发货→⑥发送商品内容给买家→⑦上报结果到群聊。遇到风控或登录失效截图发群让用户扫码。'
配置说明:
--session isolated:不占用主会话--light-context:轻量上下文加速--announce:公告到飞书--target {{FEISHU_CHAT_ID}}:必须指定群聊,不能发到用户 DM*/30 * * * *:安全频率,不要改短
⚠️ 致命警告:永远不要在主会话提到闲鱼
- 所有闲鱼相关通知(巡检、发货、风控、API失败、扫码请求)只能推送到群聊({{FEISHU_CHAT_ID}})
- 禁止在主会话回复任何闲鱼相关内容
九、配置选项
商品信息(按实际商品修改)
商品:{{YOUR_PRODUCT_TITLE}}(ID: {{YOUR_PRODUCT_ID}})
发货内容:{{YOUR_DELIVERY_CONTENT}}
环境变量
| 变量 | 说明 | 默认值 |
|-----|------|--------|
| FEISHU_CHAT_ID | 飞书群聊ID | 必填 |
| FEISHU_USER_ID | 飞书用户ID(兜底通知用) | 可选 |
| YOUR_APP_KEY | 闲鱼API签名用appKey | 必填 |
| KEY_POOL_FILE | 秘钥池文件路径 | keys.txt |
| CHAT_URL | 闲鱼聊天URL | https://www.goofish.com/im |
十、故障排查
问题1:browser tool 连接失败
症状: CDP 不可达 解决方案:
# 确认 Chrome 正在运行
curl -s http://127.0.0.1:18800/json/version
# 确认 Xvfb 正在运行
pgrep Xvfb || (nohup Xvfb :99 -screen 0 1920x1080x24 > /tmp/xvfb.log 2>&1 &)
问题2:页面元素找不到
症状: ref 无效或按钮点击失败 解决方案:
- 重新执行 snapshot 获取最新页面状态
- 使用新的 ref(ref 会随着页面变化而失效)
问题3:无法检测付款
症状: 始终返回"暂无新付款" 排查步骤:
- 确认买家已付款(在闲鱼 APP 中查看)
- 确认是系统卡片,不是用户文本
- 检查快照内容是否包含付款关键字
问题4:_m_h5_tk 获取失败
症状: API 返回 token 过期 解决方案:
- 确认使用的是 goofish.com 域的 cookie,不是 taobao.com 的
- 浏览器访问闲鱼首页让 token 自动续期
- 如仍失败,截图发群让用户重新扫码登录
十一、给新 Agent 的快速指南
如果你刚接手这个任务,按以下步骤做就行:
browser action=open label=xianyu profile=openclaw targetUrl=https://www.goofish.com/imbrowser action=snapshot targetId=xianyu- 看有没有"等待卖家发货"或"等待你发货"的买家
- 如果页面有风控/滑块/非法访问 →
a.
browser action=screenshot targetId=xianyu截屏 b. 发到闲鱼群聊让用户扫码恢复登录 c. 上报:⚠️ 风控,已发截图到群聊请扫码 - 如果页面显示登录二维码 → 截图发群让用户扫码
- 如果有待发货订单: a. 点击买家进入聊天 b. 点"去发货"按钮 → 得到订单号(来自URL) c. 用 document.cookie 拿 _m_h5_tk(goofish.com 域) d. 调虚拟发货API → 标记已发货 e. 如果API失败 → 发消息到群聊叫用户扫码 f. 聊天框输入发货内容 → 发送
- 上报结果到闲鱼群聊
十二、免责声明
本系统仅供学习和个人使用,请遵守闲鱼的使用条款。作者不对使用本系统造成的任何后果负责。
微信扫一扫