代理人
{{ overview.agents }}
账户 / 已授权
{{ overview.users }} / {{ overview.usersAuthorized }}
任务
{{ overview.tasks }}
探活 / 抢购
{{ overview.probeTasks }} / {{ overview.rushTasks }}
门店探测
alias 或 shopRef 均可;日期用 yyMMdd
门店 {{ probeResult.shopRef }} · 身份 {{ probeResult.profile }} ·
resp2 {{ probeResult.resp2 }} · state
{{ probeResult.state }}
{{ s }}
该日无可约时段
链路走查
对着真实站点逐步跑预约链,每步的请求与响应都列出来走查会直接使用该账户的登录态;未授权账户会在第一步失败。
到访目的
和创建任务里一样,是提交给餐厅的预约用途;走查一般留空即可。
高级:底层预约参数(一般不用改)
这里是接口原始参数:菜品用 menuItemSeq + count,
加购项用 itemId + count。
日常创建任务请在「任务」页用可视化选择,不需要动这些 JSON。
默认停在表单:此前的锁位会在返回前释放。选「到下单」会真的创建预约,
需要该账号已登录;可勾选下面的开关让它在创建后立刻取消。
走查结果
身份 {{ wbResult.profile }} · 停在 {{ wbResult.stoppedAt || '—' }}| 步骤 | 结果 | 耗时 | 请求 | 响应 / 错误 |
|---|---|---|---|---|
| {{ s.name }} | {{ s.ok ? '通过' : '失败' }} | {{ s.elapsed || '—' }} | {{ s.request ? JSON.stringify(s.request) : '—' }} | {{ s.error }} {{ JSON.stringify(s.response) }} {{ s.note || '—' }} |
任务总数
{{ taskStats.total }}
运行 / 等待
{{ taskStats.running }} / {{ taskStats.waiting }}
完成 / 失败
{{ taskStats.completed }} / {{ taskStats.failed }}
探活 / 候位 / 抢购
{{ taskStats.probe }} / {{ taskStats.wait }} / {{ taskStats.rush }}
{{ editingId ? '编辑任务 ' + editingId : '新建任务' }}
按韩国时间填写;日期和时段用选择器
1. 任务类型与门店
先选门店;没同步过的门店可以从链接或 alias 拉一次
{{ taskTypeHint }}
shopRef:{{ draft.shopRef }}
· 已同步 {{ selectedTaskShop.refreshedAt ? selectedTaskShop.refreshedAt.slice(0, 16).replace('T', ' ') : '—' }}
没找到门店?粘贴链接 / alias 同步
同步会写入门店库,下次直接下拉选择;表里的门店也可以随时刷新。
高级:自定义任务 ID
2. 人数、日期与时段
全部按韩国时间(Asia/Seoul)
{{ draft.partySizes.length ? `已选 ${draft.partySizes.length} 档:${draft.partySizes.join(' / ')} 人` : '选择一档或多档人数' }}
多选人数时,探查会按每一档人数分别过滤。
{{ date }}
留空表示匹配任意日期;选一天按时段精查,选多天只保留这些日期。
可多选;账户从最早一天开始抢,成功即推进下一天。
至
留空表示不限日期;只响应这个窗口内的空位事件。
{{ slot }}
不选表示任意时段;RUSH 开启「准点齐发」时必须先选目标时段。
3. 执行账户
只有已授权账户能用于候位和抢购;未授权账户会显示为不可选
{{ user.name || user.id }}
{{ taskUserStatusLabel(user) }}
{{ user.id }}
{{ draft.users.length ? `已选 ${draft.users.length} 个账户,点击修改` : '选择执行账户' }}
还没有账户,先去「账户」页添加。
没有匹配的账户。
当前没有已授权账户。先在「账户」页完成登录授权,否则候位/抢购任务执行时会失败。
4. 预约选项(可选)
用第一个执行账户读取;不选则执行时自动用第一项可用
正在用第一个执行账户读取桌型、套餐和加购项…
{{ draft.optionHint }}
有订金时记录卡种偏好;实际支付仍在订单页完成。
套餐内菜品
勾选后预约时直接带上这些菜;右侧数字是份数。
{{ group.name || '额外加购' }}
{{ group.description || '可选加购项;勾选后一并提交给餐厅。' }}
到访目的
告诉餐厅这次到访的原因,例如生日、纪念日或旅行;可多选。
这些选项对应接口里的什么?
套餐内菜品 → selectedMenus(菜品 ID + 份数);
额外加购 → selectedAddons(加购项 ID + 数量);
到访目的 → visitPurposes(固定用途代码)。
保存时控制台会自动转换,不需要手填 JSON。
3. 探活策略
只探查,不占座;会自动使用全部已授权账户轮询
5. 候位策略
控制每次空位启动多少账户,以及累计约到多少单后停止
0 表示全部符合条件用户;日常捡漏建议 3–5。
达到后任务自动完成;0 表示不限。
5. 开抢策略
开抢时间按韩国时间填写;快捷键已按首尔时区计算
提前 1 分钟预热账户,提前 5 秒启动 canary 探测放票;如果填的时间已经过去,保存后会立即进入开抢流程。
从开抢时间起算,超时后停止并转人工接管。
每个账户对单个日期的最大抢约次数。
已开启「准点齐发」,但还没有选择目标时段。请先在上面添加至少一个时段。
{{ draft.type === 'PROBE' ? '4. 提交' : '6. 提交' }}
餐厅请求会原样展示给餐厅,请只写必要内容
任务列表
共 {{ tasks.length }} 条 · 启用中的任务会参与后台调度| ID | 类型 | 门店 | 日期 | 账户 | 开关 | 状态 | 下次调度 | 操作 | |
|---|---|---|---|---|---|---|---|---|---|
| {{ t.id }} | {{ t.type }} | {{ t.shopAlias }} | {{ taskDateLabel(t) }} | {{ (t.userIds || []).length }} | {{ t.enabled ? '启用' : '暂停' }} | {{ t.status }} | {{ taskNextRunLabel(t) }} |
还没有任务
上次执行:{{ lastRun.users }} 个账户,锁定
{{ lastRun.dates }} 个日期
任务详情 · {{ taskDetail.id }}
加载中…
{{ taskDetail.type }}
{{ taskDetail.status }}
{{ taskDetail.shopAlias }} / {{ taskDetail.rule?.shopRef }}
{{ fmtTime(taskDetail.nextRun) }}
{{ (taskDetail.rule?.dates || []).join(', ') || taskDetail.rule?.dateFrom || '任意' }}
{{ (taskDetail.rule?.times || []).join(', ') || '任意' }}
{{ taskDetail.rule?.scheduledAt || '—' }}
{{ (taskDetail.userIds || []).length }} 个
产出订单
| 订单 | 账户 | 日期 | 状态 | 支付 | 金额 |
|---|---|---|---|---|---|
| {{ row.id }} | {{ row.userId }} | {{ fmtYymmdd(row.visitYymmdd) }} {{ fmtHhmi(row.visitHhmi) }} | {{ reservationStatusLabel(row.status) }} | {{ paymentLabel(row.paymentStatus) }} | {{ row.paymentAmount ? row.paymentAmount + ' KRW' : '—' }} |
暂无产出订单
探活事件
| 观测时间 | 日期 | 状态 | 人数 | 时段 |
|---|---|---|---|---|
| {{ fmtTime(event.observedAt) }} | {{ event.visitDate }} | {{ event.state }} | {{ (event.personCounts || []).join(', ') || '—' }} | {{ (event.timeSlots || []).join(', ') || '—' }} |
暂无探活事件
执行流水
| 时间 | 级别 | 状态 | 账户 | 消息 |
|---|---|---|---|---|
| {{ fmtTime(event.createdAt) }} | {{ event.level }} | {{ event.status }} | {{ event.userId || '—' }} | {{ event.message || '—' }} |
暂无执行流水
新增账户
账户 ID 留空自动生成;保存后可立即登录登录账号 {{ loginTarget.id }}
密码经 RSA-1024 加密后提交,不落页面账户
登录后会话凭证以 AES-256-GCM 落库| ID | 姓名 | 手机号 | 代理人 | 授权 | 备注 | 最近登录 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ u.id }} | {{ u.name || '—' }} | {{ maskPhone(u.phone) }} | {{ u.agentName || '—' }} | {{ u.authorizationStatus }} | {{ u.note || '—' }} | {{ fmtTime(u.lastLoginAt) }} |
还没有账户
新建代理人
邀请链接令牌留空则自动生成代理人列表
账户通过邀请令牌归属到代理人| ID | 名称 | 邀请令牌 | 账户数 | 状态 | 操作 | |
|---|---|---|---|---|---|---|
| {{ a.id }} | {{ a.name }} | {{ a.linkToken }} | {{ countUsersOf(a.id) }} | {{ a.active ? '启用' : '停用' }} |
还没有代理人
执行流水
共 {{ executions.length }} 条| 时间 | 任务 | 账户 | 日期 | 时段 | 锁位 | 预约号 | 状态 |
|---|---|---|---|---|---|---|---|
| {{ fmtTime(e.createdAt) }} | {{ e.taskId }} | {{ e.userId }} | {{ e.visitDate }} | {{ e.visitTime }} | {{ e.holdingSeq || '—' }} | {{ e.reservationRef || '—' }} | {{ e.status }} |
还没有执行记录
远端订单 {{ remoteDetail.reservationId }}
{{ JSON.stringify(remoteDetail.remote, null, 2) }}
门店对账
用账户的远端预约列表校正本地订单状态和列表侧预约号
账户 {{ reconcileResult.users }} · 匹配 {{ reconcileResult.matched }} ·
补齐预约号 {{ reconcileResult.linked }} · 本地标记取消 {{ reconcileResult.canceled }}
{{ e.userId }}:{{ e.error }}
过户 {{ transferTarget.id }}
先取消源预约,再用目标账号抢回座位——所以这是一次竞速订单
共 {{ reservations.length }} 笔| ID | 账户 | 门店 | 到访 | 人数 | 桌型 | 状态 | 支付 | 备注 | 操作 | |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ r.id }} | {{ r.userId }} | {{ r.shopName || r.shopAlias || r.shopRef }} | {{ fmtYymmdd(r.visitYymmdd) }} {{ fmtHhmi(r.visitHhmi) }} | {{ r.personCount }} | {{ r.tableType || '—' }} | {{ reservationStatusLabel(r.status) }} |
{{ paymentLabel(r.paymentStatus) }}
{{ r.paymentAmount }} KRW
|
{{ r.note || '—' }}
请求:{{ r.requests }}
|
还没有订单
过户 = 取消源预约 + 目标账号重订。取消返回的那一刻座位就进入竞争,
所以服务端会按「重试次数」连续抢位;失败时会明确记录源预约是否已被取消。
同步门店
支持门店链接 / alias / shopRef已同步门店
| 门店 | alias | shopRef | 链接 | 同步时间 | 操作 |
|---|---|---|---|---|---|
| {{ shop.name }} | {{ shop.alias || '—' }} | {{ shop.shopRef }} | {{ fmtTime(shop.refreshedAt) }} |
还没有同步门店
探活间隔
{{ ops.runtime.probeInterval || '—' }}
探活 / 下单并发
{{ ops.runtime.probeConcurrency || '—' }} / {{ ops.runtime.bookingConcurrency || '—' }}
任务 / 启用
{{ (ops.counts.tasks || 0) }} / {{ (ops.counts.enabledTasks || 0) }}
活跃订单
{{ ops.counts.activeReservations || 0 }}
运行时设置
修改后立即生效,无需重启集群与传输
{{ ops.cluster.enabled ? '集群模式' : '单机模式' }}
在线节点:{{ (ops.cluster.liveNodes || []).join(', ') || '—' }}
门店
由任务与订单汇总| shopRef | alias | 名称 | 任务 | 订单 | 活跃 | 操作 |
|---|---|---|---|---|---|---|
| {{ shop.shopRef }} | {{ shop.shopAlias || '—' }} | {{ shop.shopName || '—' }} | {{ shop.taskCount }} | {{ shop.reservationCount }} | {{ shop.activeCount }} |
还没有门店数据
等候成交
最近 20 条 WAIT 成功记录| 时间 | 账户 | 门店 | 到访 | 预约号 |
|---|---|---|---|---|
| {{ fmtTime(e.createdAt) }} | {{ e.userId }} | {{ e.shopRef }} | {{ e.visitDate }} {{ e.visitTime }} | {{ e.reservationRef }} |
还没有等候成交
浏览器身份池
当前传输模式 {{ health.transport }}| 名称 | 族 | User-Agent |
|---|---|---|
| {{ p.name }} | {{ p.family }} | {{ p.userAgent }} |
未读取到身份
UA 与 TLS 指纹按同一浏览器打包成不可分割的身份;轮换只发生在身份之间。
命令行自检:make fingerprint