OpenClaw可实现商品库存实时监控与有货提醒:通过无头浏览器加载页面,用MutationObserver监听DOM变化识别“有货”状态,支持弹窗、振动、截图及Webhook多通道提醒,并具备重试熔断与反爬绕过机制。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您希望实时监控某商品的库存状态并在有货时及时获取提醒,则可能需要借助浏览器自动化工具来模拟用户操作并检测页面变化。OpenClaw 是一个基于 Chromium 的自动化框架,支持通过脚本控制浏览器行为,适用于库存轮询、DOM 变化监听与弹窗通知等场景。以下是利用 OpenClaw 实现库存监控与提醒的具体方法:
一、配置 OpenClash 环境并加载目标页面
需确保 OpenClaw 运行环境已正确安装,并能启动无头或有界面浏览器实例,以便后续注入监控逻辑。该步骤为所有后续操作的基础运行载体。
1、下载 OpenClaw 最新 release 版本,解压至本地工作目录。
2、在终端中进入解压路径,执行 openclaw --no-sandbox --remote-debugging-port=9222 启动调试模式浏览器。
3、使用 OpenClaw SDK 初始化客户端连接,调用 browser.newPage() 创建新标签页。
4、调用 page.goto("https://目标商品URL") 加载待监控商品页面。
二、注入 DOM 变化监听器识别库存状态更新
通过 MutationObserver 监听页面中标识“有货/缺货”的关键节点(如按钮文字、类名、data 属性),避免依赖固定时间间隔轮询,提升响应效率与稳定性。
1、在 page.evaluate() 中定义 observer 配置对象,设置 childList: true 与 subtree: true。
2、定位库存状态容器元素,例如 document.querySelector(".product-status") 或通过 XPath 匹配含“立即购买”、“缺货”的按钮。
3、在 callback 函数中判断节点文本是否包含 "有货"、"可购买" 或 "加入购物车" 等关键词。
4、一旦检测到匹配状态,触发内部标记变量 isInStock = true 并终止当前 observer。
三、实现多策略提醒机制
当库存状态满足可购条件时,需通过至少一种通道向用户发出即时提示,防止错过下单时机。不同提醒方式互为备份,增强可靠性。
1、调用 page.evaluate(() => alert("库存已恢复!")) 弹出浏览器原生提示框。
2、执行 navigator.vibrate([200, 100, 200]) 触发设备振动(需在安全上下文且用户已交互过页面)。
3、使用 page.screenshot({ path: "stock_alert.png" }) 截取当前页面快照并保存至本地。
4、通过内置 fetch 调用 Webhook 地址,发送 JSON 数据包至企业微信/钉钉机器人,内容包含 "商品名称:XXX,当前状态:有货,截图路径:stock_alert.png"。
四、部署循环检测与异常熔断逻辑
为应对网络抖动、页面结构变更或反爬策略,需设定最大重试次数与超时阈值,避免脚本无限阻塞或误报。
1、设置全局计数器 retryCount = 0 与上限 MAX_RETRY = 5。
2、每次页面加载后,等待 page.waitForSelector(".product-status", { timeout: 8000 }),超时则递增 retryCount 并 reload 页面。
3、若 retryCount 达到上限,执行 page.close() 并抛出错误日志 "页面结构异常,终止监控"。
4、在每次状态检测前插入 page.evaluate(() => window.scrollTo(0, document.body.scrollHeight)),确保动态加载内容完全呈现。
五、注入防检测特征绕过基础反爬
部分电商网站会检测 Puppeteer/Playwright 类工具的指纹特征,OpenClaw 默认行为易被识别。需主动覆盖 navigator 属性与请求头以降低拦截概率。
1、在 page.evaluate() 外部使用 page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36") 设置合法 UA。
2、注入脚本覆盖 window.navigator.webdriver = false 与 Object.defineProperty(navigator, 'permissions', { get: () => ({ query: () => Promise.resolve({ state: 'granted' }) }) })。
3、启用 page.setRequestInterception(true),对所有请求添加 headers["Accept-Language"] = "zh-CN,zh;q=0.9"。
4、在页面加载完成后执行 page.evaluate(() => delete window.__crWeb) 清除 Chromium 内部调试标记。


















