支付配置的「支付宝登录与验证」按支付宝当前步骤显示手机号或短信验证码输入框,通过认证私有 RPC…
31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/29 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/vb2250158/dsh-waimai.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 83 处,展示前 83 条)
- 写入本地文件lib/index.js:213
await mkdir(stateDir(), { recursive: true }) - 写入本地文件lib/index.js:214
await appendFile(notifyLog, line, 'utf8') - 读取本地文件lib/alipay-agent.js:32
try { if (!(await stat(executable)).isFile()) return { ...result, reason: 'invalid-path' } } - 执行外部命令来自配置/变量lib/alipay-agent.js:35
execFile(executable, ['--version'], { encoding: 'utf8', timeout: timeoutMs, shell: false, - 读取本地文件lib/alipay-agent.js:89
try { if (!(await stat(this.executable)).isFile()) throw new Error('not a file') } - 执行外部命令来自配置/变量lib/alipay-agent.js:97
execFile(this.executable, [...args, '--json'], { encoding: 'utf8', timeout: this.timeoutMs, shell: false, - 读取本地文件lib/skill-provider.js:67
raw = await readFile(path, 'utf8') - 读取本地文件lib/skill-provider.js:94
entries = await readdir(skillsDir, { withFileTypes: true }) - 读取本地文件lib/automation.js:236
const raw = await readFile(path, 'utf8') - 写入本地文件lib/automation.js:273
await mkdir(dirname(path), { recursive: true, mode: 0o700 }) - 写入本地文件lib/automation.js:276
await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, { encoding: 'utf8', flag: 'wx', mode: 0o600 }) - 写入本地文件lib/automation.js:277
await rename(temporary, path) - 删除本地文件lib/automation.js:279
await unlink(temporary).catch(error => { if (error.code !== 'ENOENT') throw error }) - 读取本地文件lib/login.js:125
this.protocol = JSON.parse(await readFile(new URL('./login-protocol.json', import.meta.url), 'utf8')) - 读取本地文件lib/login.js:128
try { saved = JSON.parse(await readFile(this.statePath, 'utf8')) } - 发起网络请求lib/login.js:169
const response = await this.http.post(seed.api[api], { form, maxRedirects: 0, - 发起网络请求lib/login.js:194
? await this.http.post(endpoint.href, { ...options, form: { data } }) - 发起网络请求lib/login.js:195
: await this.http.get(endpoint.href, options) - 读取本地文件lib/login.js:386
try { previous = JSON.parse(await readFile(this.statePath, 'utf8')) } - 发起网络请求lib/taobao-qr.js:54
const response = await this.http.get(this.api.getQRCodeApi, { params: this.form, maxRedirects: 0, headers: { Referer: this.referer } }) - 发起网络请求lib/taobao-qr.js:84
const response = await this.http.post(this.api.checkQRCodeApi, { maxRedirects: 0, form: { - 发起网络请求lib/login-http.js:7
const response = await http.get(loginUrl(url, protocol), { maxRedirects: 0 }) - 读取本地文件lib/account-pool.js:53
try { index = indexSchema.parse(JSON.parse(await readFile(this.indexPath, 'utf8'))) } - 读取本地文件lib/account-pool.js:64
try { legacy = JSON.parse(await readFile(join(this.directory, 'login-state.json'), 'utf8')) } - 写入本地文件lib/account-pool.js:70
await mkdir(directory, { recursive: true, mode: 0o700 }) - 写入本地文件lib/account-pool.js:71
await copyFile(join(this.directory, 'login-state.json'), join(directory, 'login-state.json')) - 写入本地文件lib/account-pool.js:72
try { await copyFile(join(this.directory, 'delivery-selection.json'), join(directory, 'delivery-selection.json')) } - 写入本地文件lib/account-pool.js:149
await mkdir(this.accountDirectory(id, ref), { recursive: true, mode: 0o700 }) - 写入本地文件lib/account-pool.js:150
try { await copyFile(join(this.accountDirectory(id, existing.ref), 'delivery-selection.json'), join(this.accountDirectory(id, ref), 'delivery-selectio - 发起网络请求lib/alipay-h5-browser.js:36
const url = route.request().url() - 发起网络请求lib/alipay-h5-browser.js:54
response = await route.fetch({ timeout: this.timeoutMs, maxRedirects: 0 }) - 发起网络请求lib/alipay-h5.js:75
response = await http.get(url.href, { maxRedirects: 0, timeout: timeoutMs }) - 发起网络请求lib/alipay-h5.js:150
const response = await this.http.post(url, { timeout: this.timeoutMs, maxRedirects: 0, - 发起网络请求lib/alipay-h5.js:194
if (this.pageType) await this.request(this.params.refreshNoAuth === 'Y' ? '/refreshNoAuth' : '/refresh', { supportWriteCookie: true }) - 发起网络请求lib/alipay-h5.js:197
await this.request('/cashierMain', { device: this.environment.device, supportWriteCookie: true }) - 发起网络请求lib/alipay-h5.js:285
return this.request(action, payload) - 发起网络请求lib/alipay-h5.js:290
query() { return this.run(() => this.request('/cashierPayResultQuery', {})) } - 读取本地文件lib/cashier.js:184
try { return ledgerSchema.parse(JSON.parse(await readFile(this.path, 'utf8'))) } - 发起网络请求lib/cashier.js:235
const response = await this.request('retailConsult', { orderId: order.orderIds[0], payCode: '', tinyAppId: '', - 发起网络请求lib/cashier.js:244
const result = cashierQuote(await this.request('consult', parameters), order.amountCents) - 写入本地文件lib/cashier.js:289
await mkdir(dirname(this.path), { recursive: true, mode: 0o700 }) - 写入本地文件lib/cashier.js:290
try { await mkdir(lock, { mode: 0o700 }) } catch { throw new TradeError('payment-locked', '已有付款请求处理中,请先查询结果') } - 发起网络请求lib/cashier.js:300
result = cashierResult(await this.request('submit', { cashierOrderNo: current.quote.cashierOrderNo, - 删除本地文件lib/cashier.js:366
} finally { await rmdir(lock) } - 写入本地文件lib/cashier.js:516
try { await mkdir(lock, { mode: 0o700 }) } catch { throw new TradeError('payment-locked', '已有付款请求处理中,请先查询结果') } - 删除本地文件lib/cashier.js:530
} finally { await rmdir(lock) } - 写入本地文件lib/cashier.js:557
await mkdir(dirname(this.path), { recursive: true, mode: 0o700 }) - 写入本地文件lib/cashier.js:558
try { await mkdir(lock, { mode: 0o700 }) } catch (error) { throw new TradeError('payment-locked', '付款状态正在更新,请稍后查询') } - 删除本地文件lib/cashier.js:570
} finally { await rmdir(lock) } - 发起网络请求lib/cashier.js:593
const outcome = cashierPaymentStatus(await this.request('status', query.parameters)) - 发起网络请求lib/cashier.js:602
const response = await this.request('retailDetail', { orderId: order.orderIds[0], channel: 'PC', subChannel: 'ELE_APP', bizChannel: 'mobile.default' } - 读取本地文件lib/hema-cart.js:52
try { return journal.parse(JSON.parse(await readFile(this.path, 'utf8'))) } - 读取本地文件lib/hema-cart.js:60
try { before = await readFile(this.path) } - 写入本地文件lib/hema-cart.js:62
if (before) await copyFile(this.path, this.path + '.before-' + value.attempts.at(-1).operationRef + '-' + Date.now()) - 读取本地文件lib/hema-cart.js:67
if (before) { await writeFile(this.path, before); if (!(await readFile(this.path)).equals(before)) throw new PlatformError('cart-journal-invalid', '加购 - 写入本地文件lib/hema-cart.js:67
if (before) { await writeFile(this.path, before); if (!(await readFile(this.path)).equals(before)) throw new PlatformError('cart-journal-invalid', '加购 - 写入本地文件lib/hema-cart.js:76
try { await mkdir(this.lockPath, { mode: 0o700 }); acquired = true } - 删除本地文件lib/hema-cart.js:80
finally { if (acquired) await rmdir(this.lockPath) } - 写入本地文件lib/hema-cart.js:100
try { await mkdir(this.lockPath, { mode: 0o700 }) } - 删除本地文件lib/hema-cart.js:103
finally { await rmdir(this.lockPath) } - 读取本地文件lib/hema-login.js:36
this.protocol = JSON.parse(await readFile(new URL('./hema-protocol.json', import.meta.url), 'utf8')) - 读取本地文件lib/hema-login.js:39
try { saved = state.parse(JSON.parse(await readFile(this.statePath, 'utf8'))) } - 读取本地文件lib/hema-login.js:133
try { previousRecord = await readFile(this.statePath) } catch (error) { if (error.code !== 'ENOENT') throw error } - 写入本地文件lib/hema-login.js:136
await writeFile(backup, previousRecord, { flag: 'wx', mode: 0o600 }) - 读取本地文件lib/hema-login.js:137
if (!previousRecord.equals(await readFile(this.statePath))) throw new LoginError('本机盒马登录记录已变化,未覆盖其他修改') - 读取本地文件lib/hema-login.js:141
if (JSON.stringify(state.parse(JSON.parse(await readFile(this.statePath, 'utf8')))) !== JSON.stringify(record)) throw new Error('state differs') - 写入本地文件lib/hema-login.js:143
if (backup) await copyFile(backup, this.statePath) - 读取本地文件lib/hema-trade.js:109
try { before = await readFile(this.journalPath) } catch (error) { if (error.code !== 'ENOENT') throw error } - 写入本地文件lib/hema-trade.js:110
if (before) await copyFile(this.journalPath, this.journalPath + '.before-' + randomUUID()) - 写入本地文件lib/hema-trade.js:116
await writeFile(this.journalPath, before) - 读取本地文件lib/hema-trade.js:117
if (!(await readFile(this.journalPath)).equals(before)) throw new TradeError('trade-journal-invalid', '下单记录恢复未确认,请核对本机备份') - 写入本地文件lib/hema-trade.js:137
await mkdir(dirname(this.journalPath), { recursive: true, mode: 0o700 }) - 写入本地文件lib/hema-trade.js:138
try { await mkdir(lockPath, { mode: 0o700 }) } catch { throw new TradeError('trade-locked', '已有下单操作,请先核对历史订单和本机记录') } - 删除本地文件lib/hema-trade.js:179
} finally { await rmdir(lockPath) } - 读取本地文件lib/mcp-server.js:42
const server = new McpServer({ name: 'dsh-waimai', version: JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8')).version }) - 读取本地文件lib/payments.js:11
const value = JSON.parse(await readFile(path, 'utf8')) - 读取本地文件lib/platform-service.js:16
const definitions = z.array(platformSchema).parse(JSON.parse(await readFile(new URL('./platforms.json', import.meta.url), 'utf8'))) - 读取本地文件lib/platform-service.js:66
try { return this.selectionSchema.parse(JSON.parse(await readFile(this.selectionPath, 'utf8'))) } - 发起网络请求lib/taobao-sms.js:45
const response = await this.http.post(this.api[endpoint], { maxRedirects: 0, - 读取本地文件lib/taobao-trade.js:251
try { return journalSchema.parse(JSON.parse(await readFile(this.journalPath, 'utf8'))) } - 写入本地文件lib/taobao-trade.js:305
await mkdir(join(this.journalPath, '..'), { recursive: true, mode: 0o700 }) - 写入本地文件lib/taobao-trade.js:306
try { await mkdir(lockPath, { mode: 0o700 }) } - 删除本地文件lib/taobao-trade.js:339
} finally { await rmdir(lockPath) }
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
浏览淘宝闪购和盒马的地址、菜单与订单,确认购物车报价并打开官方支付页面。
README
由 DeepSeek 最新模型翻译生成dsh-waimai
支付配置的「支付宝登录与验证」按支付宝当前步骤显示手机号或短信验证码输入框,通过认证私有 RPC 提交。后台用独立浏览器中的官方页面执行原有风控 SDK;一次操作只放行一次对应请求,不自动重发验证码,验证码按官方要求接受四位或六位。输入提交后从页面状态清除,不进入普通配置或日志。额外人机验证、注册、协议和未识别步骤停止内联操作,提供官方窗口处理入口。
登录验证按所选账号继续已有的有效待付款订单及支付宝 H5 会话;缺少会话时后端拒绝准备或提交付款。当前不支持下单前独立登录,验证缓存仅保留在当前插件进程内。登录完成后重新核对原订单金额和 SDK 环境,才连接后台;设置页不付款。订单付款卡片的普通收银台连接仍可能调用平台付款提交接口,不属于设置页的仅验证操作。
已登录的本机客户端可通过 /waimai-login 的 retailSearch、retailCart、retailAdd、retailCheckout、paymentOptions 和 paymentPay 调用现有商超与付款工具,不依赖模型生成。接口沿用 DSH 会话认证、严格参数校验、订单归属、报价有效期、预算与未知结果防重;paymentPay 不接受密码或支付链接,保存的密码仅由 Host 注入。所有请求携带 RPC 请求 ID,超时后查询原购物车或订单,不自动重发。
展开完整文档(README 剩余 1 节)
dsh-waimai 支付配置的「支付宝登录与验证」按支付宝当前步骤显示手机号或短信验证码输入框,通过认证私有 RPC 提交。后台用独立浏览器中的官方页面执行原有风控 SDK;一次操作只放行一次对应请求,不自动重发验证码,验证码按官方要求接受四位或六位。输入提交后从页面状态清除,不进入普通配置或日志。额外人机验证、注册、协议和未识别步骤停止内联操作,提供官方窗口处理入口。 登录验证按所选账号继续已有的有效待付款订单及支付宝 H5 会话;缺少会话时后端拒绝准备或提交付款。当前不支持下单前独立登录,验证缓存仅保留在当前插件进程内。登录完成后重新核对原订单金额和 SDK 环境,才连接后台;设置页不付款。订单付款卡片的普通收银台连接仍可能调用平台付款提交接口,不属于设置页的仅验证操作。 已登录的本机客户端可通过 /waimai-login 的 retailSearch、retailCart、retailAdd、retailCheckout、paymentOptions 和 paymentPay 调用现有商超与付款工具,不依赖模型生成。接口沿用 DSH 会话认证、严格参数校验、订单归属、报价有效期、预算与未知结果防重;paymentPay 不接受密码或支付链接,保存的密码仅由 Host 注入。所有请求携带 RPC 请求 ID,超时后查询原购物车或订单,不自动重发。此接口补齐不代表实付验收已完成。 H5 原始入口使用 cashierMain 初始化;从已核验的登录、密码或付款确认子页面连接后台时,按原页面参数使用 refreshNoAuth 或 refresh,保留当前会话。未知页面不猜测恢复动作。付款卡片区分业务拒绝、退出登录、额外验证、未知步骤和结果页面,并单独显示后台是否已提交;错误原文与会话参数不进入界面或日志。恢复失败不会替换原会话或重新付款,最终仍以官方订单和付款查询为准。 开发中的 H5 后台支付分支通过认证私有 RPC 初始化原订单收银台,在内存中保留支付宝会话并提交一次服务器指定的付款步骤,不调用 Agent Pay CLI。paymentH5Start 只接受账号、订单、确认金额和私有会话材料,入口始终来自该订单的原始付款回包;paymentH5Submit 接受短期 H5 引用与一次性验证输入。两者不向模型注册,凭据、密码和 H5 原始响应不进入聊天、普通设置或日志。付款卡片提供连接收银台、打开支付宝登录验证、连接后台以及单次付款操作;「支付配置」可选择验证浏览器。独立验证窗口只允许已核验的登录与查询接口,付款在后台发起;登录 Cookie 与支付宝 SDK 环境数据仅留在账号所属进程内,卸载后清除。连接后台后,Agent 可用 get_payment_options 和 pay_order 继续同一 H5 会话;要求支付密码时使用支付设置中保存的密码,也可在私有付款卡片临时输入覆盖。真实付款尚未验收,不能作为已接通自动支付使用。 「支付配置 → 支付密码」保存一份通用的六位支付宝支付密码,不绑定购物渠道或本地购物账号记录,未登录购物账号也可设置。同一购物账号重新登录、切换账号或渠道不会清空密码。密码通过认证私有 RPC 写入 DSH 的 credentials 服务,普通设置、模型参数和响应、日志不含密码。Host 每次付款读取当前值,通过隐藏的 H5 方法传入经核验的原订单会话,不带密码回退 CLI;购物账号、订单归属、实付金额和预算仍分别校验。这不增加尚未接通渠道的付款能力,也不替代支付宝首次登录、短信及额外验证。 旧账号记录中的密码只有一个值时,后台自动迁移;多个旧值不一致或旧记录损坏时,界面提示设置通用密码,不擅自选择。迁移保留原私有记录作为升级留底;点击删除会先禁用通用密码,再清理这些旧记录,防止重启后恢复已删除密码。保存与删除不重启插件,也不能撤回已发出的付款请求。默认本机凭据文件不提供操作系统加密,不能隔离同一系统用户的进程。见 0.8.32 升级说明。 H5 提交复用原付款记录和锁,发出请求前持久记录 h5Submitted: true;超时或响应未知时只查询原订单,不重新提交。服务器要求的额外协议、开卡或未核验动作停止后台提交。成功页本身不证明扣款,最终由原收银台或匹配订单的付款时间核对。新增可选账本字段的降级限制见 0.8.26 升级说明。产生新付款尝试后不得恢复旧账本或删除防重记录。 收银台咨询和提交保留官方入口中的 payEntrance,未提供时沿用 WAP。配置官方 CLI 后,ALIPAY_SDK 响应的原始订单串可通过私有进程参数传给 CLI,不重建签名,也不当作浏览器链接或查询凭证。CLI 回包仍须通过官方结果核对,未知结果不重复付款。此路径已用合成数据验证;淘宝闪购后台自动扣款尚未通过真实验收。 CLI 明确返回 PAYMENT_LINK_UNSUPPORTED 时,插件在当前进程内保留同一订单的原始官方收银台入口,供付款卡片继续打开;不重新创建订单或提交付款,也不把原入口当作 Agent Pay 查询凭证。入口不会写入日志或会话;进程重建后不可恢复时,只提供状态核对。其他失败或未知结果不触发此分支。 支付宝 CLI 的 schemaVersion: 1.0 错误回执也会解析。若返回 PAYMENT_LINK_UNSUPPORTED,会话付款卡片显示「不支持此收银台链接」,不把 CLI 拒绝当作官方付款失败或成功,不自动重试。已实测当前 CLI/服务拒绝淘宝返回的 maliprod.alipay.com 入口;配置和连接检查通过不代表此类订单可自动付款。 支付 CLI 未返回可解析 JSON 时,原始标准输出与错误输出仅保留在认证私有诊断的进程内存中,不进入模型工具结果、持久化文件或普通日志。普通日志只记录退出分类、退出码和输出字节数;超时、启动失败和非零退出不能据此判断是否扣款,也不触发重试。 在「插件 → 外卖助手 → 支付配置」统一调整单笔实付上限、每日累计上限、支付模式、报价有效期和支付宝连接。检查连接只执行已保存路径的 --version,不查询钱包、不发起支付;修改后先保存再检查。连接正常只表示程序可运行,授权和真实付款结果仍由支付宝确认。商家白名单功能已移除,旧配置升级说明见 0.8.20 升级指南。 可选接入支付宝官方 Agent Pay:把 alipayAgentExecutable 配置为已安装官方 CLI 的绝对路径,alipayAgentTimeoutMs 配置为调用超时。留空则保留原收银台方式。DSH 会话发起 pay_order 时,插件把本次官方支付材料和已确认的实付、商家交给 CLI;会话身份由 Host 提供,模型不能填写。需要验证时展示本次官方入口,未知结果只查询,不重复付款。密码和身份核验在支付宝官方流程完成。CLI 安装与接入资格遵循官方文档;真实支付验收须单独完成。 付款记录新增可选 provider 和 agentQueryRef 字段,后者只保存本次官方 CLI 返回的查询订单号。签名链接和完整回执只留在进程内存,完整回执仅能通过认证私有诊断读取。旧记录继续可读;产生新字段后,降级必须保留当前付款记录并使用兼容读取器;不得恢复旧账本或删除新付款记录。CLI 输出前置日志时,只解析末尾带数字 code 或 success/status 的 JSON 命令结果,不从诊断日志提取支付入口;尾部非 JSON 或不完整结果保持未知。CLI 返回码或文字不会直接标记已付款,仍核对原收银台结果或匹配订单的付款时间。 商超收银咨询使用官方浏览器请求域名、web 容器和 WAP 来源信息;不伪造设备字段。待支付详情缺少付款时间时保持未确认状态。 支付宝网页验证入口支持既有收银台域名,以及官方文档列出的两种手机网站支付网关:https://mapi.alipay.com/gateway.do 和 https://openapi.alipay.com/gateway.do。网关仅接受此路径,保留原签名参数。日志记录地址拒绝分类和协议、域名,不记录完整地址或查询参数。未配置官方 CLI 时,ALIPAY_SDK 保持结果未知,不显示已可验证;仅打开官方验证入口不代表付款成功,仍须回查官方结果。 付款回包诊断记录固定的结果、动作、验证入口分类以及协议、域名,不记录支付 URL、SDK 载荷或 extraMap 内容。付款结果未知、已付或失败时隐藏普通付款入口;需要验证时仅展示本次付款保留在内存中的原始入口。原始入口丢失后不使用订单详情的自动支付入口代替,也不再次发起付款;这些修复不改变既有未知付款的结果。 已发起付款的界面不再提示去官方客户端继续付款。未知结果只提示核对状态;原验证入口不可用时明确提示先核对付款结果、勿再次付款。插件购物车、结算卡和付款卡共用此提示规则。 付款状态的 paymentQueryAvailable 表示当前账号尚未终结的付款仍有原始收银查询参数,或配置了官方 CLI 且保有本次查询订单号/内存验证链接。重启后为 false 时,不代表刚查询了原付款请求,也不证明未扣款。官方订单取消与支付结果分开报告;缺少查询参数的未知付款仍保持 unknown,参数和验证入口不写入账本。 餐饮创建回包的 POST_STANDARD 付款入口按官方协议解包,eleme://cashier 只转换为官方 HTTPS 收银台地址;无法识别的入口保留已创建订单号,不推断付款成功。 淘宝闪购的会话卡片刷新与 Agent 结算各自保留未过期的报价引用,刷新不会覆盖另一份仍有效的报价。提交继续核验账号、地址、购物车、准确金额和有效期;已使用报价不可重复提交。 淘宝闪购创建结果未知时,每一轮重试都必须重新取得用户明确授权并核对官方订单。retryOf 只能引用相同购物车最新且无后继的未知记录,实付不得增加;旧授权不可自动续用,历史和预算占用全部保留。 结算、提交与调整请求按官方 MTOP SDK 将 asac 放入 URL 查询参数。收银台支持解包 THIRD_PAY 的官方跳转链接,并用官方付款查询接口回写终态;查询参数仅留在进程内存,重启后仍保留付款记录且不自动重付。上述协议修正不等于真实创建订单和付款已经验收。 失败日志额外记录固定的消息关键词分类,例如地址、餐具或优惠券;不保留远端原文。分类只供定位,不能证明失败原因或允许重试。 get_order_status 可查询创建结果未知的记录,此时只核对官方订单,不调用要求订单号的收银台接口。仅已取得唯一订单号的记录继续核对付款;官方列表暂未匹配不代表确认无单。提交诊断保留限定格式的数字业务错误码,丢弃附带消息。 DeepSeek Harness 多平台外卖插件。淘宝闪购和盒马通过 HTTP 读取账号、配送地址、历史订单与商品。闪购支持购物车、结算报价、页面确认创建订单和官方支付入口;盒马支持规格加购、实付报价和确认创建订单,付款在官方客户端完成;美团、京东尚未接入。 淘宝闪购结算与提交日志使用同一报价引用,区分网络失败、平台回包、报价核验失败和成功。日志只保留结构化协议状态与金额,不保存远端消息、订单载荷、地址或支付链接;实际购买仍需当前账号实测确认。 淘宝闪购结算与提交携带同一淘宝渠道请求头,避免同一账号被按通用网页渠道计算红包。2026-10-26 只读实测:百岁山 570ml×24 的报价从使用 ¥10 红包、实付 ¥49.20,变为使用已爆涨的 ¥11 红包、实付 ¥48.20,与官方 App 一致;此次核验没有创建订单或付款。爆红包的官方触发接口已定位为 mtop.alibaba.svip.langrisser.act,需要券按钮下发的 extInfo.supplyInst;已爆涨券直接使用,未下发触发参数时不猜测或用会员兑换代替。本版本修复报价渠道,尚不执行新的爆涨请求。 插件页面 Agent 会话中的盒马商品提供「查看规格」弹窗;get_product_details 的工具卡片显示包装、最低数量、步长、库存和计价单位。历史工具结果提示重新核验价格和库存;刷新绑定记录中的账号,并复核当前配送地址。插件与聊天弹窗共用规格和数量选择、等待反馈及悬浮购物车;点击加购后仅在目标 SKU 数量及其他商品回读一致时显示成功。规格读取和加购重查原搜索页及门店售卖状态;非售卖时段或商品已移出该页时停止加购。称重商品和跨平台商品的加购方式未确认时停止。 购物车弹窗内部滚动商品,较多商品时保留标题和关闭入口。 盒马配送门店 ID 按集合稳定比较,接口仅改变 ID 顺序时不再误报地址变化;真实门店变化仍停止提交。下单诊断记录结构化返回码,不记录远端错误消息、凭据或支付链接;未知结果保留原请求记录并阻止重复提交。 智能体用 get_cart(platformId: hema) 获取当前购物车版本,再通过 add_product_to_cart 提交 productRef、skuId、整数数量、revision 和固定的 operationRef。原生加购只发送一次。完整购物车快照和结果保存在当前账号目录的 hema-cart-attempts.json;接口超时或回读延迟时只刷新购物车,重载后也不重发。未核对的操作会阻止新的加购。购物车价格不作为会员优惠、运费或最终实付的结算证据。 顶部统一选择平台和账号,账号选项标明淘宝扫码或短信登录;五个页签共用当前账号视图。淘宝闪购沿用 ele.me 的业务接口域名,页面使用淘宝闪购品牌。 淘宝扫码账号显示同一登录会话的淘宝昵称和本人头像;账号编号只放在账号详情。头像昵称与当前淘宝身份不匹配时不显示该头像,读取或加载失败显示昵称首字和刷新提示。昵称为空时显示未命名账号。读取前后同时核验淘宝身份和闪购业务身份,身份变化时停止显示资料。 各渠道从平台注册表读取登录方式和默认入口。淘宝闪购提供淘宝扫码与手机号短信;盒马默认提供「手机号短信(淘宝授权)」,也可选择淘宝授权扫码或明确复用已登录淘宝账号。短信走阿里账号的官方网页入口,取得登录会话后独立核验盒马本人资料和订单,不伪称调用盒马 App 的设备登录接口。仅支持已有账号,需要注册或额外验证时停止;手机号和验证码只经私人页面提交。盒马 App 扫码尚未接通,选择它不会生成淘宝二维码。默认入口不宣称已经核实为官方推荐。账号格式变化见 0.5.0 升级说明。 - 账号与地址:优先显示登录状态、头像、昵称、账号 ID、脱敏手机号和当前配送地址;其他地址折叠为可展开列表。已登录时隐藏登录表单,点击「添加账号」后显示当前平台的默认登录入口;淘宝闪购也可选手机号短信;短信入口提示订单可能属于不同账号。复核业务账号、资料和订单后才加入列表。多个账号保持独立登录,下拉只改变当前页面视图,不影响其他窗口或任务;切到任务或设置后返回仍保留所选账号。地址选择与账号绑定。 - 点餐:顶部选择或更改配送地址,未选有效地址时不查询店铺。自动加载附近推荐店铺,展示图片、评分、月售、距离、配送时间和起送价,支持翻页及本页筛选;也可查看最近订单店铺。菜单支持分类、图片、标价、售罄及规格选择。单规格直接加购,多规格打开弹框选择份量、口味、配料和数量;显示加价、必选项及互斥选项。加购立即显示等待状态,购物车回读确认后显示成功反馈;失败保留具体原因。右下角悬浮购物车显示数量和金额,点击打开购物车弹框,可减一件、刷新及结算。结算显示平台实付、优惠、费用、商品、地址和配送时间;勾选确认再创建订单,随后点击官方支付入口。切换地址清空旧视图并丢弃迟到请求;同地址刷新失败保留已读结果。 - 历史订单:优先显示商家、状态、时间、餐品和金额;订单号按需展开。支持刷新、下一页和返回最新记录;每次成功翻页替换当前列表,普通刷新失败时保留最后已校验的页面并显示重试入口,账号不一致时清除资料。 - 任务:显示当前平台的任务,设置时间、日期、参考菜单与预算。新任务暂停,预览不购买;关闭预览的任务报告接口未验证并停止。 - 设置:默认平台、预览和金额上限优先显示;结算报价有效期、人工支付说明与本机登录、分页设置按需展开。通过 Host 表单的版本检查保存修改,保留未编辑字段。 未接入平台显示明确空状态,不读取淘宝账号或发送登录请求。切换平台或账号视图时销毁旧资料、地址、订单和店铺列表并丢弃迟到的请求。账号会话按平台和账号隔离,不同账号可并行读取;每个平台同一时间只保留一个待完成登录。默认账号数上限为 10,可配置到 100。美团和京东登录接口仍未接入,不能因多账号界面可用而视为其登录可用。 当前能力 智能体的 search_shops 支持 nextCursor 分页;本页没有关键词匹配时仍返回下一页,不把空筛选结果解释为附近没有商超。游标在本机 MCP 进程保留,绑定账号、关键词、范围及原生地址分页,有效期和容量可在高级设置调整。重载或过期后从第一页重新查询。 search_products 用商品名称查询最多十家已选店铺,返回商品原名、规格描述、标价和可售状态;查询范围明确为 selected-stores-only,不是全平台搜索。重复分类中的商品按店铺与商品身份去重;某店读取失败时结果标记 complete:false,不伪装成缺货。平台返回空菜单和明确状态时展示原提示,例如「暂无可售商品,请改天再来」;没有状态说明的异常空值仍报错误。购买整箱水时必须核对实际 SKU 的单瓶容量、瓶数和包装,价格比较以实时报价及配送费为准。 | 平台 | 登录/账号 | 地址/历史 | 店铺/菜单 | 结算/创建订单/支付 | | 淘宝闪购 | HTTP 可用 | HTTP 可用 | 附近推荐分页、最近店铺、菜单与购物车 HTTP 可用 | 结算实测可用;确认下单与支付入口已实现,真实购买待用户验收 | | 盒马 | 手机号短信(淘宝授权)、淘宝扫码或复用已登录淘宝账号 | HTTP 可用,订单分页 | 配送门店、商品名称搜索分页、规格、购物车与整数规格加购 | 实付报价已实测;确认创建订单已实现,真实下单及付款待验收 | | 美团外卖 | 尚未接入 | 尚未接入 | 尚未接入 | 禁用 | | 京东外卖 | 尚未接入 | 尚未接入 | 尚未接入 | 禁用 | 接口字段来自 2026-10-11 的真实账号请求与官方客户端代码。登录初始化读取 /mini_login.htm 中的 JSON,再调用 /newlogin/sms/send.do 与 /newlogin/sms/login.do,每次发送前获取新 CSRF。登录返回经过 HTTPS 域名限制的 Cookie 同步地址,再通过 mtop.alsc.user.session.ele.check 独立确认账号。账号资料、地址和订单每次读取均复核会话与账号。 盒马在平台下拉中单独选择。添加账号可用淘宝 App 扫码,也可点击「使用已登录淘宝账号」并明确选择已保存的扫码账号;不支持未经验证的盒马短信登录。入口先复核来源淘宝身份,再复制限定淘宝域名的 Cookie 到独立盒马会话,依次确认淘宝身份、盒马本人资料和订单;失败不加入列表。不会读取手机私有目录,也不调用注册、绑定、换绑或购买接口。已有闪购账号的 Cookie 文件、默认账号和配送选择保持原样。 盒马资料通过 mtop.wdk.iseeku.user.profile.get 读取,必须返回本人资料;头像只使用经过校验的 HTTPS 图片 CDN。地址来自 mtop.wdk.lbs.location.UserAddressReadApi.getAllAddress,配送门店由当前已选地址的 decidedShopData.groupList 确认;不要把它们标成外卖附近推荐。订单使用 mtop.hema.trade.order.buyer.list.search,保留超出 JavaScript 安全整数范围的完整订单号,金额由分转元,订单时间按中国时区解析,分页与盒马账号绑定。每次私人读取前后复核身份。 「门店与商品」选择配送门店后输入商品名称,调用 mtop.wdk.search.item 分页读取商品、标价单位、图片和库存状态;商品所属原生门店必须位于当前地址的配送组。成功翻页替换当前列表,失败保留最后已确认的一页;可返回首批。分页令牌只在后端保存,页面及模型仅获得随机引用,该引用与账号、地址、门店和搜索词绑定。每个会话最多保留 32 个分页引用、1000 个商品引用;单次搜索超过 1000 件时要求更具体的搜索词,过期引用须重新搜索。 「查看规格」通过 mtop.wdk.detail.openservice 核对商品和原生门店,显示销售规格、最低数量、数量步长、库存及计价单位。只有接口明确标记价格未经转换时才显示规格标价,否则显示「价格暂无法确认」,price 与 originalPrice 为 null;不要用转换后的数字猜测价格。商品列表标价不代表结算实付。搜索词建议、跟踪数据、购物车动作、动态签名和购买链接不进入显示结果。 盒马头像和商品图片仅接受允许的图片 CDN;接口返回的协议相对地址和 HTTP 图片地址转换为 HTTPS,仍拒绝含凭据、非默认端口、查询参数及外部主机的图片。 「查看购物车」通过新版 mtop.trade.query.bag 按所选地址读取当前账号购物车,显示数量、平台显示单价及单位、手机已勾选状态和不可售原因。结算勾选只指定本次报价商品,不改变官方购物车的勾选。单价读取 pay.nowTitle,不要把整行金额 afterPromPrice 除以 100 后当作单价。旧购物车接口的空返回不能证明购物车为空;新版组件层级、商品或价格无法完整确认时明确报错。列表分批展开,刷新失败保留已读列表,账号或地址变化后清空。分类菜单仍属于闪购。2026-10-11 已核对真实账号两批共 57 件商品,无重复,并读取规格及与手机一致的 40 条购物车记录。 盒马结算使用 ShopDecideApi.decideByAddressId 获取所选地址的真实 shopIds 与 locationIds,地址编号不能替代配送位置编号;再调用 mtop.wdk.hema.cart.confirm 和 mtop.trade.order.build。页面和 Agent 的 submit_order(platformId: hema) 使用同一账号拥有者,传入当前购物车 revision 和明确的 lineIds。当前支持每种商品数量为 1 的报价;核对完整地址、SKU、数量、商品原价、平台优惠、基础及超重运费和两处实付总额。附加收费、额外协议或无法核对的数据停止提交,不声称所有会员权益均已接入。 「本次结算」只包含当前支持数量的可售商品,与「手机已勾选」分开显示;手机勾选的多件商品不会默认进入本次报价,也不会阻止选择其他商品。配送方式与时间通过 mtop.trade.order.adjust 重新计价。唯一可用选项自动向平台确认;存在多个选项时,插件和会话卡片显示选择器。每次变更生成新报价引用并取消原金额确认;未选时间、旧引用和费用无法核对时禁止下单。原生配送编号及调整参数只保留在后端内存。 用户在插件或会话卡片确认商品、地址和准确金额后,经 mtop.trade.order.create 单次创建订单。提交前获取共享记录锁、保存金额占用并回读;购物车或地址变化、超限、过期及重复商品均拒绝提交。结果未知时保留记录,不自动重试。用户在盒马 App 确认原请求没有生成订单后,可在新报价中再次核对金额,并明确确认重试一次。服务端将重试绑定原未知记录、相同账号、地址、商品及不高于原金额,禁止重复使用及重试链;原记录和预算占用不删除。原生参数和签名仅留在后端内存;付款在盒马 App 完成,官方订单状态确认付款结果。2026-10-21 已真实验证配送选择、完整报价和费用;真实创建请求未取得可识别订单号,订单接口未见对应新单,购买与付款尚未验收通过。 附近推荐通过 mtop.alsc.eleme.miniapp.homepagev1 与 mtop.alsc.eleme.miniapp.collection.homepagev1 HTTP POST 按已选地址查询。仅将明确的 isAd: true 或 isAd: "true" 视为推广,默认过滤;在「点单设置」关闭「隐藏推广店铺」并保存后,展示推广店铺和广告标签,"false" 和空广告信息不影响普通店铺;整页推广被过滤时保留下一页入口。分页位置按未过滤的原始页计算,与账号、地址绑定,不接受任意查询参数。菜单使用 mtop.alsc.waimai.store.miniapp.store.detail.body.query.v2 HTTP POST。折叠与售罄商品可使用数字店铺 ID:先核对菜单中相同商品的店铺引用;没有可核对的商品时,通过 mtop.alsc.waimai.store.miniapp.store.detail.head.query.v2 独立复核加密店铺 ID 和唯一数字别名。其他店铺商品、冲突别名和无法确认的详情仍拒绝展示,历史购买记录不参与别名确认。读取结束再次复核账号和地址。只返回图片、菜品与选项等展示字段,不返回购买链接、购物车动作、历史重购记录或跟踪数据。菜单标价不代表实付金额。人工验证时停止;菜单读取不执行创建订单、取消订单、购买券包或扣款。 淘宝二维码通过官方 /havanaone/loginLegacy/qrCode/generate.do 获取,并轮询 /havanaone/loginLegacy/qrCode/query.do。二维码在后端生成 PNG,临时令牌与 Cookie 不返回页面。每次扫码使用独立会话,取消、过期或切换页签会停止检查。淘宝确认后,通过 mtop.alibaba.ucc.taobao.apply.usertoken 与 mtop.alibaba.ucc.oauthLogin 换取闪购业务会话。仅接受 Eleme 站点的已确认会话,校验 Cookie 域名及账号 ID,再用业务接口复核本地 ID、Havana ID、资料与订单,全部通过后才保存。授权失败或额外验证时保留原账号;注册、绑定、换绑接口不会自动调用。 打开插件页面的扫码入口后自动生成二维码。页面显示扫码、手机确认、完成登录三步进度;手机确认后自动复核业务授权,无需点击检查按钮。临时请求失败会自动重试,确认后的复核默认最多 60 秒;超时、淘宝会话未建立或平台要求额外验证时停止并显示原因,可重新扫码。取消或离开账号页会停止当前尝试。 loginDiagnostics 默认开启,启动器的 web-host.stderr.log 中按 [waimai-login] 和 attemptId 记录二维码确认、业务初始化、令牌与 UCC 接口返回码及授权类型、资料和订单核验、失败和取消。日志仅保留固定字段、类型与数量,不记录远端说明、URL、二维码内容、Token、Cookie 或个人资料;重复等待状态不重复记录。关闭该配置停止记录,登录行为保持原样。 手机号登录的订单可能与淘宝账号所关联的闪购账号不同,仅改变订单查询渠道不能证明账号一致。真实验收已取得淘宝扫码对应的闪购会话,读取昵称、头像与当日订单,并与原短信账号分别保存。平台可能不提供手机号,此时不显示手机号。购买流程要求复核淘宝身份和独立的闪购买家会话;这两个 ID 不应直接比较。 闪购结算与购买 可选配料组的额度为 0 时仍展示基础规格和口味,配料禁选,不把 0 猜成无限制。零额度与默认或必选配料矛盾时停止;不绕过平台数量规则。 购物车使用 mtop.eleme.waimai.carts.shop.operate.um,结算使用 mtop.alsc.bpgw.trade.order.build,确认提交使用 mtop.alsc.bpgw.trade.order.submit,固定请求主机为 alsc-buy2.ele.me。加购从刚读取的菜单中提取 SKU,调用方只传商品引用,不能提供原生规格参数。减一件只调整指定商品,不清空其他商品或更改勾选状态。规格通过 mtop.alsc.waimai.store.detail.item.purchased 读取,各 SKU 的口味和必选配料分别校验。选择引用绑定账号、地址、店铺和商品,加购前重读价格、库存、配料与互斥规则;变化后要求重新选择。套餐、带组合规则或配料数量规则的商品仍停止加购。每次修改只发送一次,并以目标 SKU、口味、配料和数量回读确认;接口成功但数量未变化时提示核对购物车。 报价核对当前账号、闪购买家会话、原始配送地址、店铺、SKU、数量和多个金额字段,不用菜单标价估算实付。原生结算参数和压缩提交数据只保留在后端,页面只接收展示字段、随机报价引用和有效期。付费附加服务或不支持的支付选项会停止。报价有效期可配置,默认 120 秒;购物车、账号、地址变化后旧报价不能提交。 自动任务预览默认开启,不创建订单。手动点餐可在插件页面或会话卡片中获取报价,明确确认商品、配送时间、地址和金额后创建本笔订单,无需关闭全局预览;单笔及每日上限在服务端检查。每日累计包含已创建订单和结果未确认的尝试,不自动因取消或退款返还额度。提交前写入共享本机记录并获取文件锁,不重试创建订单请求;未知结果、相同未变化购物车、重复确认和遗留锁都会阻止再次提交。请先核对官方历史订单,不能用重复提交检查是否成功。 创建成功后,淘宝订单可以用 get_payment_options 读取官方收银台实付和当前付款方式;用户已授权付款时,pay_order 绑定订单、短期付款引用、准确实付和预算发起一次付款。付款前保存独立的 cashier-attempts.json;未知结果、重复确认或重启均不自动重付。仅支持平台当前选择的支付宝方式,不开通免密、信贷或充值。需要验证时,私有卡片提供官方入口;付款参数及链接不进入模型或付款记录。get_payment_status 核对官方订单;商超订单另外验证付款时间、账号和实付,取消或退款状态与付款状态分别显示。未取得付款成功证据时不能报告已付款。自动定时购买仍禁用。 Agent 会话点餐 菜单和点餐准备结果中的 orderingAvailable 表示用户确认下单可用;automaticOrderingAvailable: false 表示自动购买不可用,userConfirmationRequired: true 要求明确用户确认。 会话中的店铺、菜单、推荐餐品、购物车、报价和付款工具结果使用公开 tool.call.toolview 展示卡片。点击店铺或餐品可在当前会话中选择规格、配料和数量、加购、减一件与结算;插件页面继续使用悬浮购物车,会话卡片使用内嵌购物车。卡片绑定记录中的 accountRef,不会随其他窗口切换账号。地址和付款 URL 只通过鉴权 RPC 读取,不写入模型结果。 Agent 推荐时调用 show_order,只能使用当前菜单中的真实 itemIds。获得购物车 revision 后可调用 get_item_options、change_cart,再用 submit_order 请求真实报价。报价卡片重新读取当前购物车和报价,展示有效期、费用、优惠、配送地址和实付;预算超限、过期、身份或购物车变化阻止提交。用户确认后显示订单和官方付款入口;付款后刷新官方状态。请求成功或打开链接都不能当作已付款。迁移见 0.3.0 说明。 下单阶段日志使用 waimai-order 分组,仅记录尝试引用、阶段和金额,不记录地址、账号、餐品、付款 URL 或凭据。订单结果未确认时保留预算占用,先查官方订单,不重试提交。 安装与开发 npm install npm run check npm test dsh plugin --profile web add --save-exact github:vb2250158/dsh-waimai#<40位提交> 插件没有构建步骤,lib/ 就是发布产物。普通登录与账号读取无需安装或打开 Chromium;人工平台验证由用户在官方窗口完成。MCP 子进程由 Host 使用包内绝对路径启动,配置变更后重启该子进程。 工具 模型工具:list_platforms、list_connections、get_status、prepare_ordering、search_shops、search_products、get_menu、get_product_details、get_item_options、get_cart、change_cart、show_order、preview_checkout、submit_order、request_payment、get_order_status,以及 Host 的 preview_task。list_connections 只返回平台和本机保存的账号引用,不返回昵称、手机号或凭据;每次使用仍复核会话。浏览器记住上次的平台和各平台账号,刷新或重新进入插件时复核后恢复;仅保存引用,不保存昵称、手机号或登录凭据。浏览器之间不同步,清除站点数据后回到默认选择。已移除的账号回到可用默认账号,平台验证或临时查询失败不会改查其他账号。有多个账号时,账号工具必须提供对应的 accountRef,不会按当前页面的选择改变其他调用。search_shops 的 scope 默认 nearby,分页查询已选地址的附近推荐;recent 查询最近一页订单店铺,keyword 仅筛选当前页结果,不能声称搜索平台全量商家。get_menu 要求返回稳定的 shopId 和该账号已选地址;盒马还须 keyword,后续页原样传回 nextCursor。get_product_details 用搜索结果的 productRef 读取盒马规格。模型结果不包含账号 ID、地址或私人平台分页令牌。淘宝点餐卡片支持用户确认提交;未接入平台返回结构化错误。原有调用迁移见 0.2.5 迁移说明。 短信、账号资料、地址、完整历史订单、确认提交与私人支付入口仅在鉴权的 /waimai-login RPC 可用,内部端点不注册给模型。模型购物车工具复用相同账号所有者,只返回商品、金额及版本。preview_checkout 要求淘宝平台、accountRef 和 shopId,返回不含地址或支付链接的报价;submit_order 用 accountRef、shopId 和 maxAmount 生成预算内的确认卡片;request_payment 和 get_order_status 用本机订单引用核对官方状态。实际创建需明确购买授权,可通过确认卡片或 confirm_order 提交;付款授权和准确金额另由 pay_order 核对。官方付款入口从私人 RPC 读取,不进入模型结果。手机号、验证码、Cookie、地址和购物车摘要不写入共享配置;异常消息不返回网络 URL 或令牌。见 0.2.16 升级说明。 配置 | 字段 | 默认 | 说明 | | defaultPlatform | taobao | 默认平台,另可选 hema、meituan、jd | | dryRun | true | 自动任务预览;手动下单仍需明确确认,不自动付款 | | persistLogin | true | 本机 Cookie 持久化;关闭则仅当前子进程有效 | | maxAccountsPerPlatform | 10 | 每个平台最多保存的账号数,整数 1–100;重复登录同一身份更新原条目 | | loginTimeoutMs | 20000 | 请求超时毫秒,1000–120000 | | smsResendSeconds | 60 | 验证码发送间隔秒,60–600;结果不明也占用间隔 | | qrLifetimeSeconds | 180 | 单次扫码等待上限秒,整数 60–600;平台可提前使二维码失效 | | qrPollSeconds | 2 | 扫码检查间隔秒,整数 2–15 | | qrAuthorizationSeconds | 60 | 手机确认后自动复核上限秒,整数 15–300 | | browsePageSize | 10 | 附近店铺每页数量,1–20 | | browseCursorSeconds | 600 | Agent 店铺分页有效期,整数 30–3600 秒 | | browseCursorLimit | 100 | Agent 保留的店铺分页引用数,整数 1–1000 | | hemaProductPageSize | 30 | 盒马商品查询每页数量,整数 1–50 | | hideSponsoredShops | true | 隐藏推广店铺;可在「点单设置」关闭,保存后保留广告标签展示,查询会等候接口重连完成 | | checkoutQuoteSeconds | 120 | 闪购报价有效期,整数 30–300 秒 | | historyPageSize | 10 | 每页订单条数,整数 1–20 | | maxOrderAmount | 35 | 单笔金额上限,元;任务只能收紧 | | dailyBudget | 0 | 全局每日上限,元;0 表示无限制 | | autoTasks | [] | 任务列表,当前只支持预览 | 任务包含唯一非空 id、name、platformId、enabled、triggerTime(本地 HH:mm)、dateRule(workday/weekend/everyday/custom)、customDays、skipDates、menuPool(每行 店铺 | 菜品 | 参考价格)、menuStrategy(rotate/random/history)、金额限制和通知选项。每分钟轮询,仅触发指定分钟,不补跑错过的任务。同一任务每天只触发一次,先保存触发记录再执行预览或失败通知。 旧浏览器、自动支付和自动领券字段保留加载兼容,当前不执行相应操作;结算优惠以平台报价为准。升级已有调用与任务前阅读 0.2.0 升级说明。 本机数据 文件均位于 $DSH_HOME/waimai/,未设置时使用 ~/.dsh/waimai/。accounts.json 保存平台账号引用和已验证的显示资料,凭据和配送地址引用分别在 accounts/<platform>/<uuid>/login-state.json 与 delivery-selection.json。手机号输入、验证码、地址文本、完整历史订单和未确认扫码会话不持久化;trade-attempts.json 独立保存下单金额、账号、购物车指纹、结果、订单号与私人支付入口,用于避免重复提交。即使关闭记住登录,下单尝试仍持久化。每次使用重读账号与地址,缓存资料不能证明会话有效。本机私人缓存不进入共享配置。 首次加载会把旧 login-state.json 和配送地址引用复制到一个独立淘宝账号目录,保留原文件;索引成功保存后只使用新账号目录。重复登录已保存身份时刷新该条目,旧凭据文件保留用于恢复。取消添加只清除待完成登录,不删除已有账号或凭据。升级说明见 0.2.2 多账号说明。 扫码成功且闪购业务复核通过后,先保存在独立待登录账号目录,再加入账号索引。扫码不读取已有账号的 Cookie,也不会用已有账号的订单冒充扫码账号的订单。含凭据的旧备份只留在本机。 automation-state.json 保存触发和预览历史,notifications.jsonl 记录任务通知,mcp-server.log 为进程日志。既有 browser-profile/、截图、支付流水及 payment-state.json 保留原处,不会清理未确认的预算占用,也不被用于点餐。含账号数据的运行目录、截图和抓包文件不可随环境同步或发布。 验证范围 2026-10-11 已在空购物车中通过正式后端加购餐品和无需餐具,读取平台实付 ¥31.50、打包费 ¥2、配送费 ¥3.50、优惠和次日配送时间,再逐件移除并确认恢复为空。预览模式阻止实际提交。此前旧客户端渠道返回 F-10008-11-10-006,当前小程序渠道和结算请求已成功。真实订单创建和扣款未执行,不能把有效报价当作购买完成。 针对性测试覆盖平台、账号、地址、菜单、商品和购物车验证,配送重新计价、报价展示及金额矛盾、财务请求不自动重试、明确授权的一次重试、预算与持久记录、RPC 鉴权、React 页面和 MCP 进程。真实账号已验证闪购和盒马资料、地址、历史订单、店铺与商品;闪购加购和结算可用。盒马整数 SKU 原生加购、配送选择、结算、平台优惠及运费已实测,原有商品数量和勾选状态保持;订单创建和付款尚未验收通过。 MIT 加购脱敏日志使用 waimai-cart 分组,仅记录操作引用、发送及数量确认阶段和数量变化;不记录账号、地址、商品、配料、URL、Token 或 Cookie。沿用 loginDiagnostics 开关及 Host 的 web-host.stderr.log。 界面语言 插件列表中的名称和描述随 DSH 的中文、英文语言设置切换。 商超 Agent 下单 0.8.5 增加淘宝闪购商超原生商品查询、单规格加购和结算工具。Agent 使用 search_retail_products、get_retail_cart、add_retail_product、preview_retail_checkout;用户明确授权购买及预算后使用 confirm_order。报价按平台返回的优惠后含运费实付校验,复用账号、地址、预算和防重复订单记录。当前不支持必选附加属性或多规格商超商品的加购。request_payment 可在聊天卡片中读取当前待付款商超订单的官方入口,链接不进入模型或持久化日志。淘宝付款接口见上文 get_payment_options、pay_order 与 get_payment_status;平台额外验证仍在官方窗口完成。 0.8.6 的商超结算通过平台地址接口关联当前已选地址与淘宝地址,不通过收货人文字猜测,也不更换地址。一口价商品没有红包组件时仍使用平台最终实付;地址关联缺失、重复或结算返回不同地址时停止下单。附近推荐店铺查询不等于全平台搜索,未经逐店结算不能宣称最低实付。 商超预约配送未选时段时禁止提交。preview_retail_checkout 的 deliveryPreference: earliest 明确选择平台当前最早可配送时段,经调整接口重新计价并返回送达时间;默认 platform 保留平台已选时段。订单结果未知时保留记录和金额;核对官方记录无新单且得到重试授权后,confirm_order 可传原 retryOf 与 previousOrderAbsent: true,仅允许相同购物车、金额不增加的一次重试,不删除原记录,不允许连续重试链。 0.8.21 接受淘宝收银台实际返回的 https://maliprod.alipay.com 支付目标。新订单保存已确认商品摘要并传给支付宝;缺少摘要的旧单不会发起 Agent Pay。新增可选持久化字段与降级要求见 迁移说明。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
vb2250158/dsh-waimai
支付配置的「支付宝登录与验证」按支付宝当前步骤显示手机号或短信验证码输入框,通过认证私有 RPC…
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 3,801已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,082已汉化DSH
71.7
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,292已汉化DSH
71.3
智能体运行框架路由HarnessRouter/harnessrouter
智能体运行框架的统一接口。
★ 3,800已汉化DSH
71.2