Skip to main content

jd-shopping

京东购物操作:订单查询导出、商品搜索比价、购物车管理。通过浏览器工具操作京东网站,支持批量提取订单记录、搜索商品、查看物流等。当用户提到「京东」「JD」「订单」「购物」「买东西」「搜商品」「查快递」时触发。

Jump to install

Source facts

Repository
llm011/ethan-agent
Last source activity
July 14, 2026 at 06:33
Detected SKILL.md language
Chinese
Stars
8
Forks
0

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
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; } }
View on GitHub
This SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub