前端接口
RobotBrowser SDK 在浏览器中运行,负责弹出执行窗口、连接 WebSocket 实时画面、驱动任务执行。
SDK 集成
页面中引入一个脚本即可:
<script src="//webtask.phpers.cn/static/sdk/robot-browser.js"></script>
加载后全局暴露 RobotBrowser 对象。前端只需调用 run(),签名参数由服务端生成(见后端签名机制)。
run(params, callback)
核心入口。创建执行弹窗、连接 WebSocket、启动任务,实时展示浏览器画面和步骤进度。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| params | object | 是 | 签名参数包:{ task_id, app_id, timestamp, sign, tuid, client_id } |
| callback | function(err, data) | 否 | 完成回调。与 Promise 二选一 |
弹窗 → create → WS 连接 → execute → WS 实时推送 → 自动查询最终状态
// 服务端按 signature 规则生成 params(含 task_id, app_id, timestamp, sign, tuid, client_id)
var params = {
task_id: 12345,
app_id: 'your_app_id',
timestamp: Math.round(Date.now() / 1000),
sign: '...',
tuid: 'order_123456',
client_id: '936ebb63059d49edc4bf52ce636f0a00',
};
RobotBrowser.run(params, function(err, data) {
if (err) return console.error('失败:', err.message);
console.log('完成:', data.status, data.result);
});
stop(params, callback)
通过 task_id + tuid 停止正在运行的任务(tuid 可能重复,必须携带 task_id 定位)。
| 参数 | 必填 | 说明 |
|---|---|---|
| params.task_id | 是 | 任务 ID |
| params.tuid | 是 | create 返回的 tuid |
| params.app_id | 是 | 应用 ID |
| params.timestamp | 是 | 当前时间戳 |
| params.sign | 是 | md5(app_id + timestamp + app_secret) |
closeDialog()
手动关闭当前执行弹窗。任务失败或停止时弹窗不会自动关闭。
RobotBrowser.run(params, function(err) {
if (err) RobotBrowser.closeDialog();
});
回调数据格式
| 字段 | 类型 | 说明 |
|---|---|---|
| status | string | completed / failed / stopped |
| result | object/null | 任务执行结果 |
| error_msg | string | 失败时的错误信息 |
| tuid | string | 进程唯一标识 |
| current_step | object/null | 当前执行的步骤信息 |
后端接口
后端 REST API 供第三方服务端调用。所有接口通过 MD5 签名 鉴权,对外接口如下。
接口总览
| 接口 | 方法 | 路径 | 用途 |
|---|---|---|---|
| start | POST | /api.php/task.process/start | 直接启动运行(创建+启动一步到位,异步) |
| sync_start | POST | /api.php/task.process/sync_start | 同步启动运行(阻塞等待完成后直接返回结果) |
| action | POST | /api.php/task.process/action | 向保持激活(keep_live)的进程发送命令并取回分支返回值 |
| status | GET | /api.php/task.process/status | 查询进程状态 |
| stop | GET | /api.php/task.process/stop | 停止进程 |
说明:create/execute/formSubmit/serverStep 为浏览器 SDK 及调度器内部使用的接口,第三方服务端一般无需直接调用。
Base URL:https://webtask.phpers.cn/api.php,返回值格式 { code:0, data:{...} }。
签名机制
公共参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| app_id | string | 是 | 控制台 → SDK 应用管理 获取 |
| timestamp | int | 是 | Unix 时间戳,与服务端差超 3600 秒过期 |
| sign | string | 是 | MD5 签名值,md5(app_id + timestamp + app_secret) |
| tuid | string | 是 | 业务幂等键,同 tuid 重复调用不重复创建 |
签名算法
所有接口统一签名格式:md5(app_id + timestamp + app_secret)。
代码示例
<?php $sign = md5($appId . time() . $appSecret);
start · POST /api.php/task.process/start
直接启动运行。一步完成创建进程+执行,适用于服务端后台主动触发任务的场景。
| 参数 | 必填 | 说明 |
|---|---|---|
| app_id | 是 | 应用 ID |
| task_id | 是 | 任务 ID |
| timestamp | 是 | Unix 时间戳 |
| sign | 是 | md5(app_id + timestamp + app_secret) |
| tuid | 是 | 业务幂等键 |
| client_id | 是 | 指定执行客户端(robot_client.client_id 字符串,非数据库主键 id) |
| params | 按任务 | 任务运行参数(任务定义了 params_schema 时必填) |
返回:{ tuid, status_app_id, status_timestamp, status_sign }
sync_start · POST /api.php/task.process/sync_start
同步启动运行。阻塞等待任务执行完成后再返回结果,适用于需要直接拿结果的服务端场景(无需轮询 status)。
注意:任务执行期间请求会一直挂起(占用 PHP worker),任务执行时间较长时请适当调大 timeout。
| 参数 | 必填 | 说明 |
|---|---|---|
| app_id | 是 | 应用 ID |
| task_id | 是 | 任务 ID |
| timestamp | 是 | Unix 时间戳 |
| sign | 是 | md5(app_id + timestamp + app_secret) |
| tuid | 是 | 业务幂等键 |
| client_id | 是 | 指定执行客户端(robot_client.client_id 字符串,非数据库主键 id) |
| params | 按任务 | 任务运行参数(任务定义了 params_schema 时必填,可复用上次默认值) |
| timeout | 否 | 最大等待秒数(默认 600,0 表示不限制) |
| steps | 否 | 自定义执行流程。传入则覆盖任务默认流程(store_id 失效)。格式为步骤数组或 JSON 字符串;解析失败返回 steps 格式错误,需为 JSON 步骤数组。 |
| keep_active | 否 | 进程执行完成后保留页面的秒数(如 60)。仅本次执行生效、不落库,用于配合 keep_live 步骤在完成后为后续 action 保留页面;0=完成后立即关闭。 |
默认 sync_start 按任务关联的流程(store_id)执行;传入 steps 后将以你提供的步骤数组为准,任务默认流程不再生效。steps 为步骤节点数组,也可序列化为 JSON 字符串传递(接口自动 json_decode)。
每个步骤节点字段(对应服务端 StepNode):
type:步骤类型标识(与流程编辑器中可选步骤类型一致,存于step_types,如js/keep_live/call_flow等)params:步骤参数对象,字段随type不同而不同return_var(可选):将本步返回值存入该变量名,供后续步骤引用或最终result读取branches(可选):控制类步骤(如条件 / 循环)的分支配置label(可选):步骤标签,仅用于展示
可用步骤类型(来自 step_types)
自定义 steps 时,每个节点的 type 须填下表中的类型标识,params 按对应参数填写。下表由 step_types 表动态生成(仅列出启用中的步骤),库里新增 / 修改步骤类型后刷新本页即可同步。
send_mail 发送邮件 server
通过SMTP发送邮件
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
to | string | 收件人 | 是 |
subject | string | 主题 | 是 |
body | textarea | 正文 | 是 |
var 定义变量 control
定义变量,后续步骤可用{$var.变量名}引用
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
field | input | 变量名 | 是 |
remark | textarea | 备注 | 否 |
value | input | 值 | 是 |
navigate 打开页面 action
导航到指定URL
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
url | input | URL | 是 |
click 点击元素 action
点击页面元素
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
selector | input | 选择器 | 是 |
force | switch | 强制点击 | 否 |
set_var 设置变量 control
修改已定义变量的值(未定义会报错)
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
field | input | 变量名 | 是 |
value | input | 新值 | 是 |
input 输入文本 action
在输入框中填写文本
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
selector | input | 选择器 | 是 |
value | input | 输入值 | 是 |
press_enter | switch | 回车确认 | 否 |
clear | switch | 先清空 | 否 |
screenshot 截图 action
截取页面截图
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
full_page | switch | 全页截图 | 否 |
selector | input | 元素选择器(可选) | 否 |
wait 等待 control
等待指定时间
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
ms | number | 等待(ms) | 是 |
evaluate 执行JS action
在页面中执行JavaScript
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
script | textarea | JS代码 | 是 |
exists 元素检测 control
检测指定元素是否存在
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
selector | input | 选择器 | 是 |
visible | switch | 必须可见 | 否 |
timeout | number | 超时(ms) | 否 |
name | input | 变量名(可选) | 否 |
read 读取元素 action
读取指定元素的内容文本
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
selector | input | 选择器 | 是 |
rich_input 富文本输入 action
在富文本编辑器中设置HTML内容
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
selector | input | 选择器 | 是 |
html | textarea | HTML内容 | 是 |
img_up_url | input | 图片上传地址 | 否 |
url_attr | input | 上传返回URL路径 | 否 |
up_data | input | 上传附加参数(JSON) | 否 |
upfile | input | 上传文件字段名 | 否 |
ok_pic_str | input | 上传成功标识 | 否 |
get_cookies 获取Cookie action
获取浏览器当前的Cookie
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
domain | input | 域名(可选) | 否 |
save_state 保存状态 action
保存浏览器登录状态(Cookie/localStorage)
(该步骤无额外参数,params 传 {} 即可)
close 关闭页面 action
关闭当前浏览器进程,释放资源
(该步骤无额外参数,params 传 {} 即可)
request HTTP请求 action
从浏览器发起HTTP请求,自动携带Cookie
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
url | input | URL | 是 |
method | select | 请求方法 | 否 |
headers | textarea | 请求头 | 否 |
body | textarea | 请求体 | 否 |
return_body | switch | 返回响应体 | 否 |
is_json | switch | JSON解析 | 否 |
drag 拖拽元素 action
拖拽页面元素指定方向和距离
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
selector | input | 选择器 | 是 |
direction | select | 方向 | 否 |
distance | number | 距离(px) | 否 |
if 条件判断 control
根据条件判断执行不同分支,支持嵌套步骤
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
variable | input | 变量 | 是 |
compare | select | 比较方式 | 是 |
value | input | 对比值 | 是 |
loop 循环 control
循环执行一组步骤,支持按次数或列表循环
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
variable | input | 循环变量 | 是 |
from | input | 起始值 | 否 |
to | input | 结束值 | 是 |
step | number | 步长 | 否 |
if_switch 分支判断 control
根据变量值匹配分支执行,支持默认分支(else)
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
variable | input | 变量 | 是 |
break 退出循环 control
退出当前最内层循环
(该步骤无额外参数,params 传 {} 即可)
end 结束程序 control
结束整个流程,可选择正常结束或报错退出
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
exit_type | select | 退出类型 | 否 |
exit_note | textarea | 退出备注 | 否 |
call_flow 调用函数 control
调用另一个任务作为子流程执行
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
flow_id | select | 选择函数 | 是 |
params | textarea | 参数 | 否 |
return 函数返回 control
提前退出当前函数,返回调用处继续执行
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
return_note | textarea | 返回说明 | 否 |
jump_flow 流程跳转 control
跳转到子流程执行
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
flow_id | select | 选择子流程 | 是 |
params | textarea | 参数 | 否 |
sync_form 异步表单 action
向前端发送定义的表单,用户填写后提交,表单数据返回给流程继续执行
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
title | input | 表单标题 | 否 |
timeout | number | 超时(秒) | 否 |
el_switch 元素分支 control
遍历分支检测元素可见性,进入第一个可见元素的分支
(该步骤无额外参数,params 传 {} 即可)
print 调试输出 control
将内容输出到SDK界面显示,支持{$变量}
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
content | textarea | 内容 | 是 |
request_server 网络请求 go_server
发送HTTP请求并获取响应(支持GET/POST/PUT/DELETE/PATCH)
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
url | input | 请求URL | 是 |
method | select | 请求方式 | 否 |
headers | textarea | 请求头 | 否 |
content_type | input | Content-Type | 否 |
body | textarea | 请求体 | 否 |
timeout | input | 超时(秒) | 否 |
is_json | switch | JSON解析 | 否 |
huakuai_check 滑块验证 通用
识别滑块验证码缺口位置并模拟人类拖拽(通过 ddddocr 识别,物理轨迹拖拽,支持重试机制)
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
qk_selector | input | 缺口图选择器 | 是 |
bg_selector | input | 背景图选择器 | 是 |
el_selector | input | 滑块选择器 | 是 |
tolerance | input | 偏移修正 | 否 |
rate | input | 比例因子 | 否 |
iframe | input | iframe限定 | 否 |
max_retry | input | 最大重试 | 否 |
vosk 语音识别 lib_server
调用本地语音识别服务,识别录音中的数字并返回
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
audio_url | input | 录音地址 | 是 |
keep_live 保持激活 control
进程保持激活,接收外部 action 命令执行对应分支(分支名即调用别名)
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
timeout | input | 等待超时(秒) | 否 |
ocr_read OCR识别 action
识别图片中的文字(支持截图元素、Base64图片、远程图片URL)
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
selector | input | 元素选择器 | 否 |
image_data | input | Base64图片 | 否 |
image_url | input | 图片URL | 否 |
input_selector | input | 识别后填入输入框 | 否 |
live_preview 实时预览 action
展示实时浏览器画面,等待扫码或元素变化后自动结束
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
watch_selector | input | 元素选择器 | 是 |
timeout | number | 超时(秒) | 否 |
title | text | 否 |
collect_list 采集列表 action
从页面容器中采集列表数据,支持多个字段
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
container | input | 列表选择器 | 是 |
notify_url | input | 回调URL | 否 |
datas | textarea | 采集字段 | 是 |
clear_cache 清除缓存 action
清除当前进程浏览器的所有Cookie与localStorage数据
(该步骤无额外参数,params 传 {} 即可)
php_eval PHP代码 server
编写 PHP 代码并获取执行结果(支持 {$returns.xxx} / {$config.xxx} / {$global.xxx} 变量替换)
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
code | textarea | PHP代码 | 是 |
示例——用 steps 直接指定"执行 JS 取页面标题长度",替代任务默认流程:
{
"steps": [
{
"type": "js",
"return_var": "js",
"params": { "code": "return document.title.length" }
}
]
}
数组与 JSON 字符串两种传法等价。例如同样可传 steps='[{"type":"js","return_var":"js","params":{"code":"return document.title.length"}}]';多个步骤按数组顺序依次执行,返回结构见下文。
返回结构说明:
{
"code": 0,
"msg": "success",
"data": {
"tuid": "test", // 业务幂等键(原样返回)
"status": "completed", // 终态:completed 成功 / failed 失败 / stopped 被停止
"result": { // 任务返回值(各步骤返回变量汇总)
"js": 2, // 例:任务里某步骤返回变量 js = 2
"cookie": "abc123" // 例:另一返回变量
},
"error_msg": "" // status=failed 时才有值,为失败原因
}
}
JS 读取示例——以任务返回变量 js = 2 为例:
const data = resp.data; // 或 resp.json().data
if (data.status === 'completed') {
const js = data.result.js; // 直接读取变量 js,得到 2
console.log('js =', js); // 输出: js = 2
} else {
console.log('失败:', data.error_msg);
}
若任务使用"返回值变量"(如 return_var=funca),返回结构为 { "funca": { "returns": { ... } } },读取方式:data.result.funca.returns.变量名。
action · POST /api.php/task.process/action
向处于 保持激活(keep_live)状态的进程发送命令,触发对应分支执行,同步等待分支执行完并返回分支的返回值。适用于"进程常驻页面、外部按需下发 JS 操作或读取数据"的场景。
前提:进程必须运行到 keep_live 步骤且保持激活状态(status 接口可见 current_step.type = "keep_live")。
| 参数 | 必填 | 说明 |
|---|---|---|
| app_id | 是 | 应用 ID |
| task_id | 是 | 任务 ID |
| tuid | 是 | 进程 tuid |
| timestamp | 是 | Unix 时间戳 |
| sign | 是 | md5(app_id + timestamp + app_secret) |
| action | 是 | 分支别名(即 keep_live 步骤中配置的分支名,如 send_msg) |
| params | 否 | 命令参数(JSON 对象),分支内用 {$action.xxx} 引用 |
| timeout | 否 | 等待秒数(默认 0=不设限,分支执行时长由分支内步骤自身超时控制) |
返回:{ code:0, data:{ 分支返回值 } }——分支执行后新增/修改的返回变量。例如分支内步骤设了 return_var=text 且返回"你好",则返回 { code:0, data:{ text:"你好" } }。
退出:调用 action=exit 可退出 keep_live 继续执行后续步骤;也可用 stop 接口停止进程。
status · GET /api.php/task.process/status
查询进程的当前状态和结果。
注意:status / stop / action 接口仅校验签名正确性、不校验时间戳过期(长时间运行的任务签名由服务端生成,无法刷新),与公共参数表中"3600 秒过期"规则不同。
| 参数 | 必填 | 说明 |
|---|---|---|
| task_id | 是 | 任务 ID(tuid 可能重复,用于精确定位) |
| app_id | 是 | 应用 ID |
| tuid | 是 | 进程 tuid |
| timestamp | 是 | Unix 时间戳 |
| sign | 是 | md5(app_id + timestamp + app_secret) |
返回:{ tuid, status, current_step, result, error_msg }
stop · GET /api.php/task.process/stop
停止正在运行或等待中的进程。
| 参数 | 必填 | 说明 |
|---|---|---|
| task_id | 是 | 任务 ID(tuid 可能重复,用于精确定位) |
| app_id | 是 | 应用 ID |
| tuid | 是 | 进程 tuid |
| timestamp | 是 | Unix 时间戳 |
| sign | 是 | md5(app_id + timestamp + app_secret) |