-
-
Notifications
You must be signed in to change notification settings - Fork 5.4k
远程调用示例
后端接口的所有逻辑都位于此文件中:
https://github.com/NaiboWang/EasySpider/blob/master/ElectronJS/server.js
在没有修改过 config.json 配置的情况下,所有接口的端口号都是 8074,即地址为 http://localhost:8074
接口请求失败的返回值是通用的,响应状态码可能不同。失败的请求格式如下:
{
"error": "错误描述文本",
"status": false
}虽然 status 属性可以用于确认任务是否成功,但出于兼容性考虑,部分旧接口请求成功时的返回值不包含 status 属性。因此,推荐通过响应的状态码判断请求是否成功完成。
成功响应码:200
失败响应码:
-
400:表示输入参数存在问题,比如缺少必需的输入参数。 -
404:表示无法通过输入参数找到所需内容,比如无法通过输入的任务 id 查找到任务 -
500:服务器在处理请求时出现内部错误。
GET 请求的所有参数都作为 url 的一部分传递。
POST 请求都需要采用 x-www-form-urlencoded 方式作为请求体,将参数以键值对的形式放入表单中传递。文档的最后有通过 Postman 或 Node.js 进行 POST 请求的示例。
如果您通过 npm run start_direct 在本地通过源代码运行此程序,那么程序会自动进入调试模式。在接口请求出现 500 内部错误时,返回值中会包含错误的具体堆栈信息。运行打包的程序时,返回值不会包含堆栈信息。
调试模式实际通过 NODE_ENV 环境变量控制,如果 NODE_ENV 环境变量的值等于 development,程序会进入调试模式。因此,在运行打包的程序时,通过在终端设置环境变量,也可以进入调试模式。
非调试模式下,出现服务器内部错误时,会返回一条响应码为 500,类型为 text/plain,内容为 Internal Server Error 的响应。
调试模式下,出现服务器内部错误时,会返回一条响应码为 500,类型为 text/plain,内容为 Internal Server Error 开头,第二行及以后为内部错误的具体堆栈信息。
-
作用: 获取保存在
tasks目录下的所有任务列表,按修改时间降序排列。 -
请求方法:
GET -
地址:
/queryTasks -
参数: 无
-
成功返回值:
- 内容: 一个包含任务对象的数组。
-
示例:
[ { "id": 1, "name": "示例任务-采集网站标题", "url": "http://example.com", "mtime": "2025-07-10T10:00:00.000Z", "links": "http://example.com\nhttp://example.org", "desc": "这是一个采集网站标题的示例任务" } ]
- 作用: 根据任务 ID 获取单个任务的详细配置。
-
请求方法:
GET -
地址:
/queryTask -
参数:
-
id(Query Param,number, 必需): 任务的唯一标识符。
-
-
成功返回值:
-
格式:
application/json - 内容: 完整的任务文件内容,即 tasks/${id}.json 中的内容。
-
示例:
// 返回 tasks/1.json 的完整内容 // 不同版本的 EasySpider 采用的任务格式可能不同,具体请查看您自己的任务文件 { "id": 1, "name": "示例任务-采集网站标题", "links": "http://example.com\nhttp://example.org", "desc": "这是一个采集网站标题的示例任务", "graph": [...], "outputParameters": [...] }
-
格式:
-
失败返回值:
-
状态码:
404 -
内容:
{"error": "Cannot find task based on specified task ID.", "status": false}
-
状态码:
-
作用: 创建一个新任务或更新一个已有任务的配置。
-
请求方法:
POST -
地址:
/manageTask -
参数:
-
params(必需): 需要添加/修改的任务的全部内容作为 JSON 字符串。如果 JSON 中的id为-1,则为创建新任务;否则为更新指定 ID 的任务。 -
通过将
id属性设置为一个尚不存在的任务 id,可以创建指定 id 的任务。 -
示例:
{ "id": 10, // 这就是上方提到的 id 属性 "name": "地震台网", "url": "http://www.ceic.ac.cn/history", "links": "http://www.ceic.ac.cn/history\r\nhttp://www.ceic.ac.cn/history2", "create_time": "7/7/2023, 2:15:59 AM", "version": "0.3.5", "saveThreshold": 10, "quitWaitTime": 10, "cloudflare": 0, "environment": 0, "maxViewLength": 15, "outputFormat": "xlsx", "saveName": "地震信息", "containJudge": false, "desc": "http://www.ceic.ac.cn/history", "inputParameters": [ ...省略 ], "outputParameters": [ { "id": 0, "name": "参数1_文本", "desc": "", "type": "string", "exampleValue": "3.12023-05-09 14:12:2241.0778.8410新疆阿克苏地区乌什县" } ], "graph": [ ...省略 ] }
-
-
成功返回值:
-
格式:
text/plain - 内容: 创建或更新的任务的 ID。
-
示例:
1
-
格式:
此接口比较旧,为了兼容性起见,没有添加
status: true属性到返回值中来说明请求已经成功。
-
作用: 根据任务 ID 逻辑删除一个任务(将其
id属性设置为-2)。 -
请求方法:
GET -
地址:
/deleteTask -
参数:
-
id(Query Param,number, 必需): 要删除的任务的 ID。
-
-
成功返回值:
-
格式:
application/json -
内容:
{"success": "Task has been deleted successfully.", "status": true}
-
格式:
-
失败返回值:
-
状态码:
404 -
内容:
{"error": "Cannot find task based on specified task ID.", "status": false}
-
状态码:
多次删除一个任务时,每次请求都会成功。
-
作用:实例化一个任务,可以(可选的)修改任务的输入参数。
-
请求方法:
POST -
地址:
/invokeTask -
参数:
-
id(Form Data,number, 必需): 需要实例化的任务的 id,与“任务管理接口”中涉及的 id 一致。 -
params(Form Data,json,可选):需要修改的此任务中的参数。任务的参数可以在查看/管理/执行任务->任务信息中查看。此参数需要传入一个字典(包含两侧的大括号),比如:
{ "urlList_0": "https://www.baidu.com" }传入字典中的参数值会覆盖原先任务文件中定义的参数值。如果不传入某个参数,它将会保持原先任务文件中定义的参数值。
-
-
成功返回值:
- 类型:
text/plain - 返回单个数字,表示实例化后的任务的 id。这个 id 只能用于下方的执行任务、停止任务接口,无法用于上方提到的任务管理系列接口。
- 类型:
-
失败返回值:
- 状态码:
400 - 内容示例:
{"error": "Fail to parse parameters from json string.","status": false}
- 状态码:
-
作用: 启动一个执行进程,来执行指定的任务。
-
请求方法:
POST -
地址:
/executeTask -
参数:
-
id(Form Data,number或Array<number>, 必需): 要执行的任务 ID。可以是单个数字或者一个数组。输入数组时,形式例如[10,11],需要包含中括号。此处的任务 id 为 execution_instance 的 id,而不是 task 的 id。如果你的任务已经通过
manageTask接口上传到了任务文件夹,需要先使用invokeTask生成任务接口生成一个执行任务,再通过这个接口返回的 id 调用本接口实现启动。 -
use_user_data(Form Data,boolean, 可选): 是否使用带用户信息模式。1:使用;0:不使用。 -
timeout(Form Data,number,可选):等待进程启动的时间,默认为 10 秒。
此接口在执行进程启动完成,准备开始执行任务时才会返回,因此请求耗时较长,一般需要 5-10 秒完成请求。根据服务器所运行的机器性能不同,启动执行进程的时间可能有差异。如果频繁出现超时未启动错误,可以尝试增加超时时间。
设置超时时间后,如果执行进程超过规定时间仍然没有启动完成,将会杀掉执行进程,启动失败,返回失败返回值。
-
-
成功返回值:
-
格式:
application/json -
示例:
{ "success": "Task execution started successfully for ID(s): 1", "status": true }
-
-
失败返回值:
-
状态码:
500 -
内容:
{"error": "Failed to start the child process and get its PID.", "status": false}
-
状态码:
- 作用: 停止一个正在运行的任务进程。
-
请求方法:
POST -
地址:
/stopTask -
参数:
-
id(Form Data,number, 必需): 正在执行的任务的 ID。
-
-
成功返回值:
-
格式:
application/json -
内容:
{"success": "Shutdown command sent successfully to task ID 1.", "status": true}
-
格式:
-
失败返回值:
-
状态码:
404(任务未运行) 或500(发送命令失败)。 -
内容:
{"error": "No running process found for execution instance ID: 1...", "status": false}
-
状态码:
- 作用: 获取指定任务在执行过程中的实时日志。
-
请求方法:
GET -
地址:
/getTaskLog -
参数:
-
id(Query Param,number, 必需): 正在执行的任务的 ID。
-
-
成功返回值:
-
格式:
application/json - 内容: 日志字符串。
-
示例:
{ "logs": "任务ID 1 的保存文件名为: output_2025_07_10...\n正在打开网页:http://example.com...\n", "status": "true" }
-
格式:
- 作用: 获取服务器所在的操作系统平台和架构。
-
请求方法:
GET -
地址:
/queryOSVersion - 参数: 无
-
成功返回值:
-
格式:
application/json -
示例:
{"version": "win32", "bit": "x64"}
-
格式:
-
作用: 获取
config.json文件的内容。 -
请求方法:
GET -
地址:
/getConfig - 参数: 无
-
成功返回值:
-
格式:
application/json -
内容:
config.json的完整内容。
-
格式:
-
作用: 更新
config.json文件中的absolute_user_data_folder字段。在执行任务接口中,如果use_user_data设置为真,那么就会采用 config.json 中指定的用户数据目录,这个目录可以通过此接口修改。 -
请求方法:
POST -
地址:
/setUserDataFolder -
参数:
-
path(Form Data,string, 必需): 用户数据目录的绝对路径。
-
-
成功返回值:
-
格式:
application/json -
内容:
{"success": "User data folder has been set successfully.", "status": true}
-
格式:
下面介绍如何通过 POSTMAN 或 Node.js 语言调用后端接口。
假设有3个输入参数可以被修改,其调用名称分别为:urlList_0,loopTimes_循环_1,inputText_2,分别表示打开网页操作的网址列表,循环点击下一页操作的点击次数以及输入文字操作的输入值,我们分别要输入示例值如下:
则在POSTMAN中,可以设置以下配置来获得新的任务ID:
- 调用方法:
POST - 调用地址:
http://localhost:8074/invokeTask - Body字段类型:
x-www-form-urlencoded - 键值对:
-
id: 任务的id号,在API调用网址后面写了id=ID:
-
EID:已存在的任务执行ID,如果传递了此值,则为覆盖模式,新的配置将会覆盖原执行ID对应的配置文件(0.6.0以上支持)。 -
params: 一个键值对对象,包含了所有输入参数的键:值形式(0.5.0及之前版本请使用paras),如:{"urlList_0":"https://www.baidu.com/s?wd=1\r\nhttps://www.baidu.com/s?wd=1\r\nhttps://www.baidu.com/s?wd=3","loopTimes_循环_1":"15","inputText_2":"TEST"}
-
示例截图如下:

全部配置完成后点击发送请求按钮,如果成功,会得到一个任务ID号:

即可通过此ID,配合命令行执行的命令来执行任务,如执行任务ID号为37的命令为:
cd 你的EasySpider文件夹,如cd D:\Document\Projects\EasySpider
./EasySpider/resources/app/chrome_win64/easyspider_executestage.exe --ids [37] --user_data 0 --server_address http://localhost:8074 --config_folder "D:/Document/Projects/EasySpider/ElectronJS/" --headless 0 --read_type remote --config_file_name config.json --saved_file_name
如果想要通过API调用的方式获得任务执行ID,可以参考以下文件:
https://github.com/NaiboWang/EasySpider/blob/v0.3.1/ElectronJS/src/taskGrid/invokeTask.html
参考此文件的第237行开始的localExecuteInstant方法的POST调用案例:
let param = {};
let t = $('#form').serializeArray();
t.forEach(function (item, index) {
param[item.name] = item.value;
});
let message = {
id: TASKID, //这里写任务ID号,如1
EID: "1", //已存在的任务执行ID,可不设置表示新增一个配置,如果设置则表示覆盖此EID对应的配置
params: JSON.stringify(param)
}
//这里本质上就是在生成一个对象,示例的message内容为:
//{
// "id": 157,
// "EID": 1,
// "params": '{"urlList_0":"https://www.jd.com","loopTimes_循环_1":"0","inputText_2":""}'
//}
$.post("http://localhost:8074/invokeTask", message, function (EID) {
console.log("任务ID为:", EID);
});以上POST请求将返回任务执行IDexecution_ID,接下来使用命令行传入此ID即可执行任务。
后台处理逻辑在以下文件的第223行:
https://github.com/NaiboWang/EasySpider/blob/v0.3.1/ElectronJS/server.js
后台处理参数的本质就是将tasks文件夹内的任务的.json文件中的默认的参数替换为给定的输入参数值,其余内容保持不变并在execution_instances文件夹内生成新的任务.json文件,然后供程序调用。
Click Pages above to see more pages