- name
- jd-shopping
- description
- 京东购物操作:订单查询导出、商品搜索比价、购物车管理。通过浏览器工具操作京东网站,支持批量提取订单记录、搜索商品、查看物流等。当用户提到「京东」「JD」「订单」「购物」「买东西」「搜商品」「查快递」时触发。
- trigger
- 京东|JD|jd|订单|购物|买东西|搜商品|查快递|jd.com|京东订单
- fast_path
- true
# 京东购物操作
通过 `browser_session` / `browser_tab` / `browser_page` 操作用户本机 Chrome 中已登录的京东账号。
## 核心原则
1. **优先 attach_current**——用户 Chrome 已登录京东,用 `browser_session(action="attach_current")` 接管当前标签页拿到登录态。不要用 `create` 开无 cookie 新窗口
2. **导航后先 wait**——京东 JS 渲染慢,每次 navigate 后必须 `browser_page(action="wait", ms=2000)`(详情页 ms=3000),等页面就绪再操作
3. **分层获取:snapshot 做概览,eval 做精确提取**——两者配合,不是非此即彼:
- `snapshot(interactive=true)`:只拿可交互元素(link/button/text),token 可控(~5-15k),免疫 CSS class 改版。适合找链接、验证重定向、读评价标签、读颜色选项、读服务保障
- `eval`:执行 JS 返回结构化数据。适合精确提取 SKU、价格、参数表
- ❌ 不要用 `snapshot`(不带 interactive)读整页 DOM——会生成 30k+ 文本耗尽 token
4. **直接导航到目标 URL**——不要通过菜单一层层点进去,浪费步骤
5. **增量保存结果**——大量数据提取时用 `file_write`(append 模式)逐页保存,防止超时丢数据
6. **任务结束/失败都要 release session**——不管成功还是失败,最后都要 `browser_session(action="release")`。别留一堆 tab 开着
7. **选择器不依赖 CSS class**——京东用 CSS Modules hash 类名(如 `_card_1n6pm_83`),每次构建会变。优先用 `[data-sku]`、`[title]` 等属性选择器 + 文本内容匹配(`textContent.includes()`),不写 `.p-name`/`.gl-item` 这类 class 选择器
8. **eval 返回空 → 先排查 DOM**——不要反复换选择器试错。先 eval 排查脚本(`document.querySelectorAll("[data-sku]").length`、`document.title`、遍历文本节点),搞清真实结构再写提取脚本。最多排查 1 次
9. **流行度分析 + 同款兜底**——搜索后从 snapshot 的 link 节点统计品牌/型号反复出现频次,频次高的优先选为 top 候选。若某款详情页信息太少(如参数缺失),在列表中找同品牌/同系列另一款点进去补充
10. **过程透明 + 断连降级**——每步工具调用都要说明在做什么、为什么(让用户知道 agent 的思路)。浏览器断连时不要死等,用 `web_search` + `web_fetch` 补充参数信息作为降级路径,并告知用户数据来源
11. **并行打开详情页**——提取多个商品参数时,不要串行"导航→wait→提取"逐个来(5 个商品 = 5×(3s wait + 提取) ≈ 30s+)。应该用 `browser_tab(action="open", url=...)` 一次性打开多个 tab,并行 `eval` 提取,最后聚合。**但单次工具调用只能操作一个 tab**,所以并行是指"先批量 open 所有 tab(不用 wait),再用一个 eval 脚本遍历所有 tab 提取"
12. **详情页有多个 tab,要主动点击切换**——京东详情页默认只显示"规格参数"精简表。"商品详情"tab 有图文详细规格,"大家评"tab 有用户评价。信息不足时**主动点击对应 tab**(用 eval 找文本节点 click),点击后必须 wait 2 秒等 AJAX 加载
---
## ⚡ 订单查询导出(最常用)
### 步骤 1:接管浏览器(优先 attach_current)
```
browser_session(action="attach_current", title="京东订单")
browser_page(action="navigate", session=SID, url="https://order.jd.com/center/list.action")
browser_page(action="wait", session=SID, ms=2000)
```
如果 attach_current 失败(浏览器没打开或扩展未连接),才用 create:
```
browser_session(action="create", url="https://order.jd.com/center/list.action", title="京东订单")
browser_page(action="wait", session=SID, ms=2000)
```
### 步骤 2:用 eval 提取当前页订单数据
```
browser_page(action="eval", session=SID, script="""
(function() {
const orders = [];
document.querySelectorAll('.order-tb').forEach(tb => {
const header = tb.querySelector('.dealtime, .tr-th');
const dateEl = tb.querySelector('.dealtime');
const orderIdEl = tb.querySelector('.order-num a, .number a');
const statusEl = tb.querySelector('.order-status, .status span');
const amountEl = tb.querySelector('.amount span, .sum-price');
const nameEl = tb.querySelector('.p-name a, .goods-item a');
orders.push({
订单号: orderIdEl ? orderIdEl.textContent.trim() : '',
日期: dateEl ? dateEl.textContent.trim() : '',
状态: statusEl ? statusEl.textContent.trim() : '',
金额: amountEl ? amountEl.textContent.trim() : '',
商品名: nameEl ? nameEl.textContent.trim().substring(0, 50) : ''
});
});
return JSON.stringify(orders);
})()
""")
```
### 步骤 3:翻页并继续提取
```
browser_page(action="eval", session=SID, script="""
(function() {
const nextBtn = document.querySelector('.page-next, a:has(> .arrow-next)');
if (nextBtn && !nextBtn.classList.contains('disabled')) {
nextBtn.click();
return 'navigated';
}
return 'last_page';
})()
""")
```
翻页后等待加载再提取:
```
browser_page(action="wait", session=SID, ms=2000)
// 重复步骤 2 的 eval 提取
```
### 步骤 4:保存结果 + 关闭 session
每提取一页就追加写入文件,防止中途超时丢数据:
```
file_write(path="~/Downloads/jd_orders.csv", content="订单号,日期,状态,金额,商品名\n...", mode="append")
```
**最后一定要关**:
```
browser_session(action="release")
```
### 大批量提取策略(100+ 订单)
对于跨年大量订单,分批进行避免单次超时:
1. 第一轮:提取第 1-5 页,保存
2. 第二轮:提取第 6-10 页,追加
3. 每轮结束告知用户进度,询问是否继续
也可以通过 URL 参数切换时间范围:
- 近三个月:`https://order.jd.com/center/list.action`
- 今年内:`https://order.jd.com/center/list.action?d=4`
- 去年:通过页面筛选器选择
---
## 商品搜索
### 步骤 1:接管浏览器 + 导航 + wait
```
browser_session(action="attach_current", title="京东搜索")
browser_page(action="navigate", session=SID, url="https://search.jd.com/Search?keyword={关键词URL编码}")
browser_page(action="wait", session=SID, ms=2000)
```
### 步骤 2:snapshot 概览 + 流行度分析(top N 选品)
先用 `snapshot(interactive=true)` 拿列表页的可交互元素(链接、按钮),token 可控且免疫 CSS 改版:
```
browser_page(action="snapshot", session=SID, interactive=true)
```
从返回的 link 节点统计品牌/型号反复出现频次——同款在多页/多位置出现,通常是热销款。频次高的优先纳入 top N 候选。
### 步骤 3:eval 精确提取列表项字段
> **京东已改版**(2025+):旧选择器 `.gl-item`/`.p-name`/`.p-price` 全部失效。
> 新 DOM 用 CSS Modules hash 类名,唯一稳定容器是 `[data-sku]`。
```
browser_page(action="eval", session=SID, script="""
(function() {
const items = [];
document.querySelectorAll('[data-sku]').forEach(el => {
const sku = el.getAttribute('data-sku');
const titled = el.querySelector('[title]');
const texts = Array.from(el.querySelectorAll('*'))
.filter(e => e.children.length === 0)
.map(e => e.textContent.trim())
.filter(t => t && t.length > 1 && t.length < 100);
const price = texts.find(t => /^\d+$/.test(t)) || '';
const sales = texts.find(t => t.includes('已售')) || '';
const shop = texts.find(t => t.includes('自营') || t.includes('旗舰') || t.includes('专卖')) || '';
items.push({
商品名: titled ? titled.getAttribute('title').substring(0, 80) : '',
价格: price ? ('¥' + price) : '',
销量: sales,
店铺: shop,
SKU: sku,
链接: 'https://item.jd.com/' + sku + '.html'
});
});
return JSON.stringify(items.slice(0, 20));
})()
""")
```
**最后**:`browser_session(action="release")`
### 图书搜索
图书搜索可直接用分类 URL:
```
https://search.jd.com/Search?keyword={关键词}&enc=utf-8&wq={关键词}&cat=1713,3258,3297
```
---
## 订单搜索(按关键词查找历史订单)
京东订单页支持按商品名/订单号搜索,比逐页翻找高效得多:
### 方式 1:URL 参数搜索
```
browser_page(action="navigate", session=SID, url="https://order.jd.com/center/list.action?search=0&keyword={关键词URL编码}&d=1")
browser_page(action="wait", session=SID, ms=2000)
```
参数说明:
- `keyword`:搜索关键词(商品名、订单号等),需 URL 编码
- `d=1`(近三个月)/ `d=2`(今年内)/ `d=3`(去年)/ `d=4`(更早)
### 方式 2:eval 操作搜索框
```
browser_page(action="eval", session=SID, script="""
(function() {
const input = document.querySelector('#search-keyword, .search-box input');
if (!input) return 'no_search_input';
input.value = '搜索关键词';
input.dispatchEvent(new Event('input', {bubbles: true}));
const btn = document.querySelector('.search-box .btn, .btn-search');
if (btn) btn.click();
return 'searching';
})()
""")
```
搜索后等待 2 秒再用提取脚本获取结果。
---
## 商品详情页
从搜索结果获取 SKU 后直接导航到详情页提取参数。
> **京东详情页已改版**(2025+):旧选择器 `.sku-name`/`.itemInfo-wrap`/`.p-price`/`.Ptable-item` 全部失效。
> 新 DOM 用 CSS Modules hash 类名,商品名在 `<title>` 标签,参数在 `[class*=parameter]` 容器中。
### ⚠️ 重要:详情页有多个 tab,要主动点击切换
京东详情页顶部有 tab 导航条,默认显示"规格参数"(只显示精简参数),完整信息在其它 tab:
| Tab 名称 | 内容 | 何时点击 |
|---------|------|---------|
| **规格参数** | 精简参数表(材质/重量/磅数等),默认展示 | 先读这个拿基础参数 |
| **商品详情** | 图文详情、产品故事、技术图解、详细规格对比 | 规格参数信息不足时点这个补充 |
| **大家评** | 用户评价、好评率、晒图、问答 | 用户问评价/口碑时点这个 |
| **售后保障** | 退换货政策 | 一般不用点 |
**点击 tab 的方法**(tab 是可点击的文本节点,用 eval 找到并点击):
```
browser_page(action="eval", session=SID, script="""
(function(){
// 找到目标 tab 文本节点并点击
const target = "商品详情"; // 或 "大家评"
const tabs = Array.from(document.querySelectorAll("*"))
.filter(e => e.children.length === 0 && e.textContent.trim() === target);
if (tabs.length > 0) {
tabs[0].click();
return "clicked: " + target;
}
return "tab not found: " + target;
})()
""")
browser_page(action="wait", session=SID, ms=2000)
```
> 点击 tab 后内容是 AJAX 加载的,**必须 wait 2 秒**再提取。
### 导航 + 验证
```
browser_page(action="eval", session=SID, script="window.location.href = \"https://item.jd.com/{SKU}.html\"; \"navigating\"")
browser_page(action="wait", session=SID, ms=3000)
```
验证是否被重定向(旧 `.sku-name` 已失效,改用 title 检查):
```
browser_page(action="eval", session=SID, script="(function(){return document.title.includes('京东') && !document.title.includes('欢迎登录') ? 'ok' : 'redirected'})()")
```
如果返回 "redirected",说明登录态丢失,**立刻告诉用户需要去 Chrome 登录京东**。
### 分层提取:先 snapshot 概览,再 eval 精确取参
**Step 1:snapshot(interactive=true) 概览**——读评价标签、颜色选项、服务保障、物流等可交互区域信息(~5-15k token,免疫 CSS 改版):
```
browser_page(action="snapshot", session=SID, interactive=true)
```
**Step 2:eval 精确提取参数表 + 价格 + 店铺**(通用版,不依赖 CSS class,不绑定品类):
```
browser_page(action="eval", session=SID, script="""
(function(){
const r = {};
// 商品名:从 title 提取,去掉京东后缀
r.title = document.title.replace(/【.*?】/g, "").replace(/-京东$/, "").trim();
// 价格:找页面中带 ¥ 的叶子节点
r.prices = [];
for (const el of document.querySelectorAll("*")) {
if (el.children.length === 0 && el.textContent.includes("¥")) {
const t = el.textContent.trim();
if (t.length < 20) r.prices.push(t);
if (r.prices.length >= 3) break;
}
}
Auf GitHub ansehen