Install
openclaw skills install addtocartfrombitableClawHub Security found sensitive or high-impact capabilities. Review the scan results before using.
从飞书Bitable表格获取商品信息(链接、规格、数量),然后通过浏览器自动化将其加入天猫/淘宝购物车。触发词:加购物车、Bitable商品、批量加购、采购表格。
openclaw skills install addtocartfrombitable从飞书多维表格读取商品信息,自动添加到淘宝/天猫购物车。
默认表格:https://somo-tech.feishu.cn/base/UIdIbPe2RaOQ1tsNIhlcB5ilngc
UIdIbPe2RaOQ1tsNIhlcB5ilngctblwMnggn0CuboHs必需字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
| 链接 | URL | 商品链接(从 field.link 取值) |
| 采购规格 | Text | 要选择的规格文本,必须与页面上的规格选项完全匹配 |
| 数量 | Number | 购买数量 |
feishu_bitable_list_records(app_token, table_id, page_size=20)
筛选出有完整 链接、采购规格、数量 的记录。
对每条记录执行:
productUrl = record.fields.链接.linkproductSpec = record.fields.采购规格productQuantity = record.fields.数量browser.open(profile='openclaw', targetUrl=productUrl)
等待页面加载完成(约 3-5 秒)。
由于页面元素可能动态加载,直接使用 snapshot 可能无法找到。建议优先使用 evaluate 查找包含规格文本的元素并点击。
browser.act(profile='openclaw', request={
kind: 'evaluate',
fn: `(specText) => {
// XPath 查找包含文本的元素
const xpath = "//*[contains(text(), '" + specText + "')]";
const result = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (let i = 0; i < result.snapshotLength; i++) {
const node = result.snapshotItem(i);
// 尝试点击,如果失败则向上找 clickable 的父元素
let target = node;
while (target && target !== document.body) {
// 检查常见的可点击标签或属性
if (['A', 'BUTTON', 'LI'].includes(target.tagName) || target.getAttribute('role') === 'button' || target.className.includes('sku')) {
target.click();
return true;
}
target = target.parentElement;
}
// 实在不行点击节点本身
node.click();
return true;
}
return false;
}`,
args: [productSpec]
})
同理,使用 evaluate 找到输入框并修改值:
browser.act(profile='openclaw', request={
kind: 'evaluate',
fn: `(qty) => {
const inputs = document.querySelectorAll('input.text-amount, input.mui-amount-input, input[type=number]');
for (let input of inputs) {
// 简单的启发式规则:value 是 1 或不为空
if (input.value) {
input.value = qty;
input.dispatchEvent(new Event('input', { bubbles: true }));
input.dispatchEvent(new Event('change', { bubbles: true }));
return true;
}
}
return false;
}`,
args: [productQuantity]
})
找到"加入购物车"按钮并点击:
browser.act(profile='openclaw', request={
kind: 'evaluate',
fn: `() => {
const buttons = document.querySelectorAll('a, button, div[role=button]');
for (let btn of buttons) {
const text = btn.innerText || btn.textContent;
if (text && (text.includes('加入购物车') || text.includes('加入购物袋'))) {
btn.click();
return true;
}
}
return false;
}`
})
等待 2-3 秒,检查是否出现成功提示或购物车数量变化。
完成后通过 message 工具发送 Telegram 通知:
message(action='send', channel='telegram', to='telegram:1642489086', message='采购商品已加入购物车:\n- 商品1: ✅\n- 商品2: ✅\n...')
改进点:
browser.snapshot 返回的静态文本 ref,而是利用 evaluate 在浏览器上下文中直接执行 DOM 操作,提高对动态页面和复杂结构的适应性。用户说:"帮我把采购表格里的商品加入购物车"