淘宝自动挑货
by @greenhandtan
淘宝浏览器自动化,包括会话持久化、登录、商品搜索、多维度筛选(好评率/价格/销量/包邮/天猫)、SKU规格匹配、加入购物车、验证码自动求解以及结果回传。支持任意消息通道(飞书/Slack/CLI)触发。keywords: Taobao, search, cart, rating, price, sales, sh...
clawhub install taobao-search-skill📖 About This Skill
name: Taobao-Search-Skill description: "Search Taobao/Tmall, filter by rating/price/sales/shipping, match SKU specs, add to cart. 淘宝天猫浏览器自动化——按好评率/价格/销量/包邮筛选,SKU规格匹配,加入购物车。Agent as brain: understands intent, decides filters, interprets results, handles exceptions." version: "2.0.0" model: opus allowed-tools: [Bash]
Taobao-Search-Skill
> 合规声明: 本 Skill 仅用于自动化你自己的淘宝/天猫账号操作。不得绕过平台安全控制、不得用于批量注册/刷单/爬虫等违反淘宝服务条款的行为。使用者对自身操作承担全部责任。
你的角色:大脑
你是决策者,scripts/taobao.py 是你的执行手脚。
三者协作流程:
用户描述需求 → 你解读意图 → 构造参数 → exec taobao.py
→ taobao.py 返回 JSON → 你解读结果 → 向用户汇报
→ 如需登录/验证 → 你通知用户 → 用户完成后 → 你 exec taobao.py resume
核心原则:
status 字段,你根据它决定下一步need_login / need_captcha 时,暂停并告知用户,不要自行绕过前置检查:首次使用保障
在收到用户搜索请求后,执行以下检查再构造命令:
1. 检查会话状态(可选但推荐):
python scripts/taobao.py check-session
如果 session_exists: false,提前告知用户:"首次使用需要手动登录淘宝,过程中会弹出浏览器窗口。"2. 确认依赖可用(遇到报错时检查):
- python -m playwright install chromium — 浏览器未安装时执行
- python -m pip install -r requirements.txt — 依赖缺失时执行
- Python 版本需 ≥ 3.11
3. 选择人工接管模式:
- 默认(交互式):不传 --no-manual-approval。脚本会自行等待用户登录(最长 3.5 分钟),你无需逐轮交互。适合用户就在电脑前、可以立即扫码的场景。
- Agent 完全控制:传 --no-manual-approval。遇登录/验证立即返回 need_login/need_captcha 信号,你完全掌控中断时机和用户提示语。适合你在多轮对话中需要精确控制流程的场景。
1. 意图理解:从用户话中提取参数
从用户自然语言输入中提取以下字段。未提及的字段使用默认值,不要自作主张。
| 参数 | 提取规则 | 默认值 |
|------|----------|--------|
| search_keyword | 搜索目标,如"苹果手机""索尼耳机" | "Sony headphones" |
| rating_threshold | "好评率大于X%""评分X以上"→ X/100;未提及则不筛选 | 0 |
| max_candidates | "最多N个""前N个"→ N;未提及 | 5 |
| price_min | "N元以上""最低N""不少于N"→ 数值 | None |
| price_max | "N元以内""不超过N""N以下"→ 数值 | None |
| min_sales | "付款人数超过N""销量大于N""至少N人付款"→ 数值 | None |
| require_free_shipping | "包邮""免邮""免运费"→ true | false |
| require_tmall | "只要天猫""天猫店"→ true;"只要淘宝""C店"→ false | None |
| sku_keywords | "16+512""16G 512G"→ 空格分隔关键词 | None |
| need_screenshot | "截图""证据"→ true | true |
| manual_approval_required | "自动""无人值守"→ false | true |
| headless | "无头""后台静默"→ true | false |
| session_strategy | 通常不需要改,使用默认值 | "storage_state" |
| report_channel | 结果回传通道,目前支持 feishu | "feishu" |
提取示例:
search_keyword="蓝牙耳机", price_max=100, require_free_shipping=Truesearch_keyword="苹果手机", rating_threshold=0.95, max_candidates=10search_keyword="索尼耳机", require_tmall=True, min_sales=1000, sku_keywords="16G 512G"2. 执行协议
Step 1: 构造命令
根据提取的参数构造 CLI 调用:
python scripts/taobao.py search \
--keyword "<关键词>" \
--rating-threshold <阈值> \
--max-candidates <数量> \
--price-min <最低价> --price-max <最高价> \
--min-sales <最低销量> \
--require-free-shipping --require-tmall yes \
--sku-keywords "<规格关键词>"
可选 flags:--no-screenshot、--no-manual-approval、--headless、--no-session-auto-save。
Step 2: 执行并读取结果
执行命令,捕获 stdout 作为 JSON 解析。stderr 是浏览器运行日志,忽略。
taobao.py 返回两种 JSON:
正常完成(success / partial_success / failed):
{
"status": "success|partial_success|failed",
"task_id": "...",
"session": {"status": "restored|missing|captured", "logged_in": true|false},
"search": {"status": "...", "keyword": "...", "candidates_found": N},
"items": [
{
"title": "商品标题",
"item_id": "...",
"price": "¥299.00",
"price_value": 299.0,
"sales_count": 15000,
"rating": 0.98,
"free_shipping": true,
"is_tmall": true,
"url": "https://...",
"cart_added": true
}
],
"skipped": [
{"title": "...", "reason": "sku_or_price_mismatch", "detail": "..."}
],
"evidence": ["screenshot_paths"],
"steps": [{"name": "...", "status": "...", "message": "..."}],
"error": null,
"resume_stage": null
}
中断信号(need_login / need_captcha):
{
"status": "need_login|need_captcha",
"task_id": "...",
"session": {"status": "...", "logged_in": false},
"message": "人类可读的中断原因",
"action": "告知用户如何操作",
"resume_stage": "awaiting_login|awaiting_captcha",
"steps": [...]
}
中断信号下没有 items/search/skipped 字段,因为搜索尚未完成。执行 resume 后会重新走完整流程。
Step 3: 根据 status 决定下一步
| status | 含义 | 你应该做的事 |
|--------|------|-------------|
| success | 全部完成,商品已加购 | 向用户汇报 items 列表,展示关键信息 |
| partial_success | 部分完成(无匹配商品) | 说明 skipped 原因,建议放宽条件 |
| need_login | 需要手动登录 | 第 3 节中断处理流程 |
| need_captcha | 需要手动过验证码 | 第 3 节中断处理流程 |
| failed | 执行异常 | 查看 error.code,决定重试/放弃/求助用户 |
3. 中断处理:登录与验证码
收到 need_login 时
taobao.py 的 session 未登录。你必须:
1. 告知用户: "淘宝未登录,请在弹出的浏览器窗口中手动完成登录(扫码或账号密码),完成后告诉我。"
2. 等待用户确认(用户说"好了""完成""done")
3. 执行恢复: python scripts/taobao.py resume
不要自动重试 search——resume 会复用已保存的会话状态继续搜索。
收到 need_captcha 时
搜索被风控拦截。你必须:
1. 告知用户: "淘宝触发了安全验证,请在浏览器中完成滑块验证,完成后告诉我。"
2. 等待用户确认
3. 执行恢复: python scripts/taobao.py resume
处理超时
如果 resume 仍然返回 need_login 或 need_captcha(最多尝试 2 次):
python scripts/taobao.py clear-session"4. 结果解读与汇报
汇报格式
向用户自然语言汇报,不要直接 dump JSON。格式参考:
搜索「{keyword}」完成,共检查 {N} 个候选商品,成功加购 {M} 件:✅ 符合条件(好评率 ≥ {threshold}%):
1. [天猫/淘宝] 商品标题 — ¥价格 — 好评率 X% — 月销 N — 包邮/不包邮
2. ...
⚠️ 好评率不达标:
1. 商品A — 好评率 X%(低于 {threshold}% 阈值)
❓ 好评率未知:
1. 商品B — 详情页未展示好评率
❌ 加购失败:
商品C:SKU规格不匹配
如果用户未设定好评率阈值,则不需要分"符合/不达标",直接列出所有加购商品并标注好评率即可。
筛选决策
taobao.py 做了基础筛选(价格/销量/包邮/天猫/关键词匹配),并提取了每个商品的好评率(rating 字段)。
你需要做的判断(好评率筛选):
rating 字段rating >= 阈值 → 向用户汇报为"符合";rating < 阈值 → 汇报为"好评率不达标",但仍告知用户该商品存在rating: null vs rating: 0: null = 详情页未提取到好评率("未知");0 = 提取到但值为 0%(几乎不会出现,若出现则视为"不达标")skipped 中,分析 reason 向用户解释主动建议:
证据引用
如果 evidence 数组非空,在汇报末尾告知用户截图已保存。注意 evidence 中的路径是本地文件系统路径(如 C:\...\search_results.png),不是 URL。可在汇报中列出路径供用户直接打开,但不要尝试用 Read 工具读取(它们是二进制图片文件)。
5. 异常处理决策树
WORKFLOW_ERROR
收到 WORKFLOW_ERROR
├─ 网络相关错误 → 等待 3 秒,重试 1 次
├─ 浏览器启动失败 → 告知用户检查 Playwright 安装
└─ 其他错误 → 告知用户错误信息,请求指示
会话过期
如果 session.status == "missing" 且 status == "need_login":
6. 常用操作
检查会话状态
python scripts/taobao.py check-session
返回会话文件是否存在及 cookie 数量。在新任务开始前可以快速检查,避免无效的 search 调用。
清除会话(重新登录)
python scripts/taobao.py clear-session
当用户反馈"登录失败""会话失效"时使用。下次 search 会触发新的手动登录流程。
依赖与启动
python -m pip install -r requirements.txtpython -m playwright install chromium.cache/taobao-search-skill/taobao-session.json.cache/taobao-search-skill/artifacts/失败码参考
| 错误码 | 说明 | 你的处理 |
|--------|------|----------|
| LOGIN_REQUIRED | 未登录,需手动完成登录并保存会话 | 中断处理流程 |
| SEARCH_BLOCKED | 淘宝风控拦截搜索,需手动完成验证 | 中断处理流程 |
| WORKFLOW_ERROR | 工作流执行异常 | 异常处理决策树 |
| NO_STATE | resume 时没有可恢复的状态 | 引导用户先执行 search |
多平台部署
Claude Code
将本文件复制到 .claude/skills/taobao-search.md,Claude Code 自动识别。触发方式:
/taobao-search 搜索苹果手机 好评率大于95%在 .claude/settings.local.json 中确保允许执行:
{
"permissions": {
"allow": [
"python scripts/taobao.py search *",
"python scripts/taobao.py resume",
"python scripts/taobao.py check-session",
"python scripts/taobao.py clear-session"
]
}
}
Cursor
将本文件复制到 .cursor/rules/taobao-search.md,在 Cursor Rules 中启用。触发方式为自然语言描述淘宝搜索意图。
GitHub Copilot
将本文件内容合并到 .github/copilot-instructions.md,或作为独立 prompt 文件放置在 .github/prompts/taobao-search.prompt.md。
OpenClaw
将本文件作为 Skill 定义放置在 OpenClaw 的 Skill 目录下,保持 description 中的关键词覆盖触发场景即可。OpenClaw 的消息路由机制会自动匹配。
其他 AI Agent 工具
任何支持 Markdown 前导 + 指令格式的 Agent 工具(Cursor Rules、Copilot Instructions 等),参考「执行协议」段即可直接使用。核心能力要求:执行 Shell 命令 + 解析 JSON。
直接 CLI
python scripts/taobao.py search --keyword "苹果手机" --price-max 10000
python scripts/taobao.py search --keyword "耳机" --rating-threshold 0.95 --price-min 50 --price-max 500 --min-sales 1000 --require-free-shipping --require-tmall yes