帮助中心
快速寻找答案
首页>帮助手册>

API配置


「调度」 提供了外部系统调用API的能力,可通过API实现指定某个机器人、某个应用、所需的参数,在需要的时候触发运行,运行的结果可通过回调接口返回。

通过调度API,实现了外部系统与调度中心的连接互动。

API配置

可新增多个API配置,支持多个系统调用。

重置密钥和删除后,原接口将不可调用。

API执行记录

通过API执行的任务,在「API执行」中可以查看

鉴权接口

获取token

accessKeyId 和 accessKeySecret 需要从 影刀控制台 获取,获取后请妥善保管,管理员可以选择给每个需要对接影刀的系统各自创建一对密钥。

请求方式:POST

请求地址https://api.winrobot360.com/oapi/token/v2/token/create

Content-Type:application/x-www-form-urlencoded

请求参数

参数名参数类型参数描述示例
accessKeyIdString影刀控制台获取的accessKeyIdMerC5cKPSa7BTG1A@platform
accessKeySecretString影刀控制台获取的accessKeySecretmqTxhk4aK1v7PpDtfQU6dCMgnrR50HFc

专有云使用专有云请求地址!!!

调用示例

https://api.winrobot360.com/oapi/token/v2/token/create?accessKeyId=MerC5cKPSa7BTG1A@platform&accessKeySecret=mqTxhk4aK1v7PpDtfQU6dCMgnrR50HFc

请求响应

正常

{
"data": {
"accessToken": "520da9c9-694d-4b40-9332-0c179243c88e",
"expiresIn": 7199
},
"code": 200,
"success": true,
"requestId": "601cf6274032e2cc335c97d2"
}

accessKeyId不正确时响应

{
"code": 400,
"success": false,
"requestId": "d63a123c5d79060c2a704da6",
"msg": "accessKeyId错误,请用企业管理员登录后台并进行核对!!!"
}

响应参数说明

accessToken 用作后续的访问,expiresIn 说明token的有效时长(秒)。调用方应该在 accessToken 失效前,再次调用 获取token 接口更新 accessToken,建议调用方根据有效期缓存,避免重复获取token,另外当通过accessToken访问调度API接口时返回401,重新获取token即可!!!

响应参数说明

参数类型是否必填最大长度描述示例值
codeint3状态码0
msgString-响应msgaccessKeyId错误,请用企业管理员登录后台并进行核对!!!
success​boolean-true/false,表示是否调用成功true
requestId​String-请求id调用失败时
accessToken​String​- ​用作后续的接口访问1d6a43d5-c545-4284-9675-9db53027619e
expiresIn​int​- ​有效期,一般2小时7199

状态码说明

code(返回码)msg(返回码描述)
0接口调用成功
400具体描述如下:

注意

未配置accessKeyId, 请用企业管理员登录后台并进行配置!!!

未配置accessKeySecret, 请用企业管理员登录后台并进行配置!!!

accessKeyId错误,请用企业管理员登录后台并进行核对!!!

accessKeySecret错误,请用企业管理员登录后台并进行核对!!!

任务运行状态枚举值说明

状态码状态码描述
waiting等待调度
running任务运行中
finish任务运行结束
stopping任务正在停止
stopped已结束
error异常

应用运行状态枚举值说明

状态码状态码描述
created已创建
waiting等待调度
running运行中
finish完成
stopping停止中
stopped已停止
error异常
skipped已跳过
CANCEL已取消

等待超时时间枚举值说明

状态码状态码描述
10m10分钟
20m20分钟
30m30分钟
1h1小时
2h2小时

应用运行参数枚举值说明

状态码状态码描述
str字符串
int整型
float浮点
bool布尔
file文件

使用token

accessToken 在每次调用具体的接口的时候,需要作为参数放在 header 中,参数放置如下:

authorization: Bearer ${accessToken}

authorization: Bearer 1d6a43d5-c545-4284-9675-9db53027619e

注意:authorization 为 header 的 key,value 为 "Bearer 1d6a43d5-c545-4284-9675-9db53027619e",Bearer 和 accessToken 中间有一个空格 ​ 注意:当accessToken失效时,code码为401,此时需要重新调用 https://api.winrobot360.com/oapi/token/v2/token/create 刷新接口

注意:调用任务运行时,回调参数结构和调用job运行不一样,需要根据dataType进行判断 dataType是job时表示应用运行回调,dataType等于task时表示任务运行回调

应用运行接口

启动Job

请求方式:POST​

请求地址https://api.winrobot360.com/oapi/dispatch/v2/job/start

Content-Type:application/json

请求头:authorization: Bearer ${access_token}

请求参数

// 以应用和机器人去执行
{
"accountName": "admin@fckj", //机器人注册时候使用的账号名 非必填,与robotClientGroupUuid字段只能二选一
"robotUuid": "73d9a119-7ec7-4226-b679-506afefae667", //应用的uuid,可以在客户单的应用详情中获取
"robotClientGroupUuid": "xx", // 机器人分组uuid 非必填, 与accountName字段只能二选一
"waitTimeout": "10m",
"params":[
{
"name":"获取页数", //应用参数名称
"value":"10" // 应用参数值
"type":"str" //参考应用运行参数枚举说明
}
]
}

请求响应

{
"data": {
"jobUuid": "fc38f4f1-8444-475e-83f8-3292eeb1606b"
},
"code": 200,
"success": true
}

Job结果回调

回调接口需要在 影刀控制台 注册,在Job运行结束后,会主动通过回调接口传递Job运行结果数据。推荐使用回调方式获取数据结果,保证数据及时获取到。

回调接口要求是POST请求方式,回调的请求数据类型为 application/json ,数据内容:

请求响应

// job/start接口回调 运行结束,有应用参数
{
"jobUuid": "42c2e0ce-499b-47aa-8642-3a1125b4759a",
"dataType": "job", //数据类型 job表示应用运行回调(通过api调用应用robotUuid的方式), task表示任务运行回调(通过api调用任务scheduleUuid的方式)
"status": "finish",
"msg": "执行结束",
"robotClientUuid": "bfd28e42-e530-41eb-bf46-796a86ff7ec3",
"robotClientName": "ceshi1@csqy1", //机器人名称
"startTime":"2021-02-03 11:11:11", //该应用开始执行时间
"endTime": "2021-03-03 12:12:12", //该应用结束执行时间
"robotName": "导出淘宝订单", //应用名称
"robotUuid": "xxxxx", //应用uuid
"result": [ //输出参数
{
"name": "姓",
"value": "王",
"type": "str"
},
{
"name": "名",
"value": "5",
"type": "str"
},
{
"name": "上传文件",
"value": "https://winrobot-pub-a-dev.oss-cn-hangzhou.aliyuncs.com/document/temp/request.txt",
"type": "file"
}
]
}
// 运行结束,无返回值
{
"jobUuid": "42c2e0ce-499b-47aa-8642-3a1125b4759a",
"dataType": "job", //数据类型 job表示应用运行回调(通过api调用应用robotUuid的方式), task表示任务运行回调(通过api调用任务scheduleUuid的方式)
"status": "finish",
"msg": "执行结束",
"robotClientUuid": "bfd28e42-e530-41eb-bf46-796a86ff7ec3",
"robotClientName": "ceshi1@csqy1", //机器人名称
"startTime":"2021-02-03 11:11:11", //该应用开始执行时间
"endTime": "2021-03-03 12:12:12", //该应用结束执行时间
"robotName": "导出淘宝订单", //应用名称
"robotUuid": "xxxxx", //应用uuid
}
// 运行异常
{
"jobUuid": "42c2e0ce-499b-47aa-8642-3a1125b4759a",
"dataType": "job", //数据类型 job表示应用运行回调(通过api调用应用robotUuid的方式), task表示任务运行回调(通过api调用任务scheduleUuid的方式)
"status": "error",
"msg": "执行结束",
"robotClientUuid": "bfd28e42-e530-41eb-bf46-796a86ff7ec3",
"robotClientName": "ceshi1@csqy1", //机器人名称
"startTime":"2021-02-03 11:11:11", //该应用开始执行时间
"endTime": "2021-03-03 12:12:12", //该应用结束执行时间
"robotName": "导出淘宝订单", //应用名称
"robotUuid": "xxxxx", //应用uuid
}
//任务运行结束 回调
{
"dataType": "task", //数据类型 job表示应用运行回调(通过api调用应用robotUuid的方式), task表示任务运行回调(通过api调用任务scheduleUuid的方式)
"startTime": 1,//可为空 第一个应用开始运行时间
"endTime": 1642837962000, //最后一个应用结束运行时间
"jobList": [
{
"dataType": "job",
"jobUuid": "6de893bb-8224-4f60-9bff-b8597b8ed8fc",
"msg": "",
"robotClientUuid": "cfcc5904-2e82-4295-911c-0ce65c9099f2",
"robotClientName": "ceshi1@csqy1", //机器人名称
"startTime":"2021-02-03 11:11:11", //该应用开始执行时间
"endTime": "2021-03-03 12:12:12", //该应用结束执行时间
"robotName": "导出淘宝订单", //应用名称
"robotUuid": "xxxxx", //应用uuid
"status": "finish",
"result": [ //有输出参数
{
"name": "姓",
"value": "王",
"type": "str"
},
{
"name": "名",
"value": "5",
"type": "str"
},
{
"name": "上传文件",
"value": "https://winrobot-pub-a-dev.oss-cn-hangzhou.aliyuncs.com/document/temp/request.txt",
"type": "file"
}
]
},
{
//无输出参数
"dataType": "job",
"jobUuid": "5b798f23-c8a7-4595-b764-cb491555f936",
"msg": "",
"robotClientUuid": "cfcc5904-2e82-4295-911c-0ce65c9099f2",
"robotClientName": "ceshi1@csqy1", //机器人名称
"startTime":"2021-02-03 11:11:11", //该应用开始执行时间
"endTime": "2021-03-03 12:12:12", //该应用结束执行时间
"robotName": "导出淘宝订单", //应用名称
"robotUuid": "xxxxx", //应用uuid
"status": "finish"
}
],
"msg": "运行结束", //任务运行备注
"status": "finish", // 任务运行状态
"taskUuid": "ea947f83-82fb-4afb-8412-4021255fd7cd"
}

查询Job结果

Job的运行结果保留24小时,超过时间后会自动清理掉。

请求方式:POST​

请求地址https://api.winrobot360.com/oapi/dispatch/v2/job/query

Content-Type:application/json

请求头:authorization: Bearer ${access_token}

请求参数

{
"jobUuid": "45c882ed-e44f-4818-afc0-05172e7ffbe0", //运行任务的jobUuid
}

请求响应

// 运行结束,有返回值
{
"data": {
"jobUuid": "42c2e0ce-499b-47aa-8642-3a1125b4759a",
"status": "waiting",
"statusName": "等待调度",
"remark": "应用启动",
"robotClientUuid": "00a7a1de-af0b-47ad-a3a8-a8fc2b009762",
"robotClientName": "ceshi1@csqy1", //机器人名称
"startTime":"2021-02-03 11:11:11", //该应用开始执行时间
"endTime": "2021-03-03 12:12:12", //该应用结束执行时间
"robotUuid": "00a7a1de-af0b-47ad-a3a8-a8fc2b009761",
"robotName": "打印日志应用",
"robotParams": {
"inputs": [ //输入参数
{
"name": "姓",
"value": "王",
"type": "str"
},
{
"name": "名",
"value": "5",
"type": "str"
},
{
"name": "上传文件",
"value": "https://winrobot-pub-a-dev.oss-cn-hangzhou.aliyuncs.com/document/temp/request.txt",
"type": "file"
}
],
"outputs":[ //输出参数
{
"name": "姓",
"value": "王",
"type": "str"
}
]
}
},
"code": 200,
"success": true
}
// 运行结束,无返回值
{
"data": {
"status":"finish" // 运行状态
},
"code": 200,
"success": true,
"requestId": "4ee3b003-6331-4329-96f3-e513f4671f88"
}
// 运行中
{
"data": {
"status":"running" // 运行状态
},
"code": 200,
"success": true,
"requestId": "4ee3b003-6331-4329-96f3-e513f4671f88"
}
// 运行异常
{
"data": {
"status":"error", // 运行状态
"msg":"具体的异常信息"
},
"code": 200,
"success": true,
"requestId": "4ee3b003-6331-4329-96f3-e513f4671f88"
}

停止Job

停止运行中的Job

请求方式:POST​

请求地址https://api.winrobot360.com/oapi/dispatch/v2/job/stop

Content-Type:application/json

请求头:authorization: Bearer ${access_token}

请求参数

{
"jobUuid": "45c882ed-e44f-4818-afc0-05172e7ffbe0", //运行任务的jobUuid
}

请求响应

{
"code": 200,
"success": true
}

任务运行接口

启动任务

请求方式:POST

请求地址https://api.winrobot360.com/oapi/dispatch/v2/task/start

Content-Type:application/json

请求头authorization: Bearer ${access_token}

请求参数

// api调用任务
{
"scheduleUuid":"d4a9bda3-78f8-4a63-8f7d-20f4ce637c9b",
"scheduleRelaParams":[
{
"robotUuid":"xxx", //对应参数应用uuid
"params":[ //对应应用需要传递的参数
{
"name":"name1", //应用参数名称
"value":"10", // 应用参数值
"type":"str" //参考应用运行参数枚举说明
}
]
},
{
"robotUuid":"xxx", //对应参数应用uuid
"params":[ //对应应用需要传递的参数
{
"name":"name2", //应用参数名称
"value":"10", // 应用参数值
"type":"str" //参考应用运行参数枚举说明
}
]
}
]
}

请求响应

{
"data": {
"taskUuid": "4d8aae66-cec5-4043-85cc-70f4e0430d4e" // 该taskUuid可进行后续任务运行状态查询和停止任务运行等操作
},
"code": 200,
"success": true
}

查询任务结果

任务的运行结果保留24小时,超过时间后会自动清理掉。

请求方式:POST

请求地址https://api.winrobot360.com/oapi/dispatch/v2/task/query

Content-Type:application/json

请求头authorization: Bearer ${access_token}

请求参数

{
"taskUuid":"4d8aae66-cec5-4043-85cc-70f4e0430d4e" //任务运行的uuid
}

请求响应

{
"data": {
"taskUuid": "4d8aae66-cec5-4043-85cc-70f4e0430d4e", //任务
"taskName": "测试-api任务", //任务名称
"status": "running", //任务运行状态
"statusName": "运行中", //任务状态描述
"startTime": "2022-01-22 15:10:28", // 任务开始时间
"endTime": "2022-01-22 15:10:46", // 任务结束时间
"jobDataList": [ //任务所关联的应用运行信息,多个应用有多条
{
"jobUuid": "b934597c-f06d-4c52-9624-e62e7f7b9489", //jobUuid 可以通过job查询结构查询任务状态
"status": "finish", //应用运行状态
"statusName": "完成", //应用运行状态描述
"remark": "", //应用运行异常描述
"robotParams": {}, //应用运行输出参数
"robotClientUuid": "cfcc5904-2e82-4295-911c-0ce65c9099f2", //机器人uuid 可通过查询机器人信息接口查询
"robotClientName": "ceshi1@csqy1", //机器人名称
"robotUuid": "3f3c9861-9300-4400-9c1f-f4e7f8bb4d08", // 应用uuid
"robotName": "wait-10", //应用名称
"startTime": "2022-01-22 15:10:28", // 任务开始时间
"endTime": "2022-01-22 15:10:46" // 任务结束时间
},
{
"jobUuid": "97421b0b-2f64-4adf-94b9-0bdfc73face6",
"status": "created",
"statusName": "已创建",
"robotParams": {},
"robotClientUuid": "cfcc5904-2e82-4295-911c-0ce65c9099f2",
"robotClientName": "ceshi1@csqy1", //机器人名称
"robotUuid": "e8be5a0a-ec3a-4f3a-b4a2-b9319fe6fd0a",
"robotName": "等待-10s",
"startTime": "2022-01-22 15:10:28", // 任务开始时间
"endTime": "2022-01-22 15:10:46" // 任务结束时间
}
]
},
"code": 200,
"success": true
}

停止任务

请求方式:POST

请求地址https://api.winrobot360.com/oapi/dispatch/v2/task/stop

Content-Type:application/json

请求头authorization: Bearer ${access_token}

请求参数

{
"taskUuid":"4d8aae66-cec5-4043-85cc-70f4e0430d4e" //任务运行的uuid
}```
**请求响应**:
```json
{
"code": 200,
"success": true
}

查询机器人信息

查询机器人信息

请求方式:POST​

请求地址https://api.winrobot360.com/oapi/dispatch/v2/client/query

Content-Type:application/json

请求头authorization: Bearer ${access_token}

请求参数

// robotClientUuid和accountName只需要传一个
{
"robotClientUuid":"0d6a835a-2e08-414a-af73-1e43f9d9c8ff",
"accountName":"ceshi1@csqy1"
}

请求响应

// 机器人状态
{
"data": {
"robotClientUuid": "0d6a835a-2e08-414a-af73-1e43f9d9c8ff", //机器人uuid
"robotClientName": "ceshi1@csqy1", //机器人名称
"status": "idle", //状态 connected:已连接 idle:空闲 running:运行中 allocated:已分配 abnormal:异常 offline:离线
"description": "ceshi1", //"机器人备注"
"clientIp": "172.16.28.156", //"机器人客户端ip"
"remark": "运行成功" //运行备注
},
"code": 200,
"success": true
}
//错误响应
{
"code": 400,
"success": false,
"serverInstName": "by.dispatch.local",
"msg": "[robotClientUuid不能为空]"
}

查询应用列表

请求方式:GET

请求地址:https://api.winrobot360.com/oapi/robot/v2/query

请求头:authorization: Bearer ${access_token}

请求示例:https://api.winrobot360.com/oapi/robot/v2/query?accurateRobotName=xxx&page=1&size=10

请求参数:

// robotClientUuid和accountName只需要传一个
{
"accurateRobotName":"xxx", //应用名称,精确匹配 必填
"page": 1, //页数,默认为1 非必填
"size": 20, //每页数量,默认20 非必填,最大限制在500
}

请求响应:

// 机器人状态
{
"data": [
{
"robotUuid": "xxx", // 应用uuid
"robotName": "引用指令集应用", //应用名称
"ownerUuid": "xxx", //应用所属者uuid
"ownerName": "xxx", //应用名称
"releaseRobotVersionName": "xxx", //版本号
"icon": "", //图标
"description": "" //应用描述
}
],
"page": { //分页信息
"total": 1, // 总数
"size": 20, // 每页数量
"page": 1, // 页数
"pages": 1, // 总页数
"offset": 0,
"order": "desc"
},
"code": 200,
"success": true,
"requestId": "68ea2e6d-bea2-4bb0-b97b-643fa481a3a9"
}

回调验签

在Job运行结束后,会主动通过回调接口传递Job运行结果数据,回调接口需要在 影刀控制台 注册

参与签名的bodyMd5和timestamp由回调地址回传

示例: http://callbackUrl?bodyMd5=6a7c5c8a3572297346481146606eb054&timestamp=1630982412&sign=170135202d89108851f2f4ea37d9dba3e8f82f2d

bodyMd5和timestamp加密之后生成的签名与回调接口的sign做比较,一致表明验签通过

回调对接策略(建议)

1.影刀自身有回调重试功能,当应用运行结束,回调失败后,会连续重试3次,影刀会在24小时内,每小时进行重试,直到重试成功,所以需要对接方在业务层面保障幂等(可以根据jobUuid或者taskUuid进行幂等保障,视startJob时是指定应用和机器人模式还是指定任务模式)

2.影刀建议回调接口采用异步方式,先接受到影刀的回调数据后,返回成功,再进行异步处理(提交到线程池中进行异步处理)

3.如果为了保障回调数据必达,建议使用回调 + 轮询的方式结合使用,发起startJob后,建议轮询时间2分钟间隔轮询一次(半小时2分钟轮询一次,1小时轮4分钟一次,依次类推,小于半小时建议1分钟),回调成功后停止轮询

3.1 轮询+回调方案

1.startJob成功后,根据jobUuid或者taskUuid记录到业务表a(具体命名由对接方定义)中,业务表需要增加jobUuid或者taskUuid的唯一索引,业务表a至少包含jobUuid,或者taskUuid(幂等字段) , 状态(是否回调成功), 已经失效时间(到期了默认成功,不进行轮询,失效时间建议startJob之后的48小时)

2.定时任务轮询该表,按照以上的间隔时间进行轮询,状态是回调成功或者失效时间到了,不应该再进行轮询

3.回调接口接受到回调数据后,更新业务表a的回调状态

4.轮询到job处于终态(参考应用运行状态枚举值说明),更新业务表a状态为回调成功

5.轮询查询机器人信息接口(视机器人运行应用的时长,半小时2分钟轮询一次,1小时轮4分钟一次,依次类推,小于半小时建议1分钟),当机器人状态处于空闲之后,可进行任务的startJob, 如果您的机器人较多,或者应用较多,建议不要同一时间轮询所有机器人,应该要错开轮询

示例: 如果有100台机器人,建议分为100次进行轮询,每个机器人和每个机器人之间1s间隔之后发起轮询

ps:因为网络原因,可能回调不成功,影刀系统会500ms,750ms , 1500ms重试3次,如果期间未成功,影刀系统会间隔每小时(整点)通过定时任务尝试补偿回调,直到24小时后( 最多补偿24次)

签名代码示例

package com.xybot.oapi.service;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.Charset;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
* 生成签名
*
* @author boyi@fckj
* @since 2021-09-07 11:39
*/
public class SignDemo {
private static final char[] DIGITS_LOWER = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};;
private static final String UTF8_NAME = "UTF-8";
private static final Charset UTF8_CHARSET = Charset.forName(UTF8_NAME);
public static void main(String[] args) {
long timestamp = 1630982412; //由回调接口回传
String accessKeyId = "BTKk8A2nsrjg5xwV@platform"; //影刀控制台配置的accessKeyId
String accessKeySecret = "tXUvxjNreuqJF4bd39pM8hm0621TYCgW"; //影刀控制台配置的accessKeySecret
String bodyMd5 = "6a7c5c8a3572297346481146606eb054"; //由回调接口回传
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
Date date = new Date(timestamp);
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
System.out.println(bodyMd5);
StringBuilder sb = new StringBuilder();
sb.append("accessKeyId=");
sb.append(accessKeyId);
sb.append("&bodyMd5=");
sb.append(bodyMd5);
sb.append("&timestamp=");
sb.append(pattern.format(localDateTime));
String originalStr = sb.toString();
byte[] keyBytes = accessKeySecret.getBytes();
SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "HmacSHA1");
try {
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(secretKey);
byte[] rawHmac = mac.doFinal(originalStr.getBytes(UTF8_CHARSET));
String sign = encodeHex(rawHmac);
System.out.println("sign: " + sign);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 转换16进制
*
* @param data
* @return
*/
private static String encodeHex(byte[] data) {
int l = data.length;
char[] out = new char[l << 1];
int i = 0;
for(int var5 = 0; i < l; ++i) {
out[var5++] = DIGITS_LOWER[(240 & data[i]) >>> 4];
out[var5++] = DIGITS_LOWER[15 & data[i]];
}
return new String(out);
}
}

SignDemo.java

说明

accessKeyId:影刀控制台生成的accessKeyId,登录后选择API执行->API配置

bodyMd5:请求体加密的字符串,可由回调接口回传回去

timestamp:精确到秒的时间戳即可,由回调接口回传回去

调用平台管理

API机器人的调用,需要先在影刀控制台注册调用平台,每个平台代表一个调用于源。平台注册后,可以获取接口调用的密钥对。

代码模板

Python代码模板

import requests
import json
import time
def callApi(url, data, headers=None, method=None):
"""
调用接口返回json数据(字典)
"""
if method == 'GET':
result = requests.get(url=url, data=data, headers=headers).json()
return result
elif method == 'POST':
result = requests.post(url=url, data=data, headers=headers).json()
return result
def getAccessToken():
"""
获取accessToken
:return:accessToken
"""
accessToken = callApi(
urls['getAccessToken'].format(informationOfDispatch['accessKeyId'], informationOfDispatch['accessKeySecret']),
None, {'Content-Type': 'application/x-www-form-urlencoded'}, method[0])['data']['accessToken']
print('已获取accessToken:{}'.format(accessToken))
print('-----------------------帅气的分割线-------------------------')
return accessToken
def getClientData():
"""
获取客户端状态(connected:已连接 idle:空闲 running:运行中 allocated:已分配 abnormal:异常 offline:离线)
:return:clientStatus
"""
headers = {'Content-Type': 'application/json', 'authorization': 'Bearer {}'.format(accessToken)}
data = json.dumps({
"accountName": informationOfDispatch["accountName"]
})
clientStatus = callApi(urls['queryClient'], data, headers, method[1])['data']['status']
print('已获取clientStatus:' + clientStatus)
if clientStatus == 'offline':
print('请注意!检查是否已开启调度模式!')
print('-----------------------帅气的分割线-------------------------')
return clientStatus
def startJob(accessToken):
"""
启动任务,并返回jobUuid
:return:jobUuid
"""
data = json.dumps({
"accountName": informationOfDispatch["accountName"],
"robotUuid": informationOfDispatch["robotUuid"],
"params": informationOfrobot
})
headers = {'Content-Type': 'application/json', 'authorization': 'Bearer {}'.format(accessToken)}
jobUuid = callApi(urls['startJob'], data, headers, method[1])['data']['jobUuid']
print('已获取jobUuid:' + jobUuid)
print('-----------------------帅气的分割线-------------------------')
return jobUuid
def query(accessToken, jobUuid):
"""
查询应用启动结果
:return:
"""
data = json.dumps({
"jobUuid": jobUuid,
})
headers = {'Content-Type': 'application/json', 'authorization': 'Bearer {}'.format(accessToken)}
while True:
response = callApi(
urls['query'],
data,
headers,
method[1])['data']['status']
if response == 'error':
print('应用运行异常!请检查入参或者指令!')
break
elif response == 'finish':
print('应用运行完成,调度结束!')
break
else:
print('应用还在运行中.......')
time.sleep(2)
# 调用的接口网址
urls = {
'getAccessToken': 'https://api.winrobot360.com/oapi/token/v2/token/create?accessKeyId={}&accessKeySecret={}',
'startJob': 'https://api.winrobot360.com/oapi/dispatch/v2/job/start',
'query': 'https://api.winrobot360.com/oapi/dispatch/v2/job/query',
'queryClient': 'https://api.winrobot360.com/oapi/dispatch/v2/client/query'
}
# 请求方法
method = ['GET', 'POST']
# todo -------------------------改变调度相关信息和应用入参即可------------------------------------------
# 调度相关信息
informationOfDispatch = {
'accessKeyId': '5CAUDpe3S6wuWcFn@platform',
'accessKeySecret': 'KuWYadFMjns6HyN17tA9QRV4qJwUBZb8',
"accountName": "admin@rpa",
"robotUuid": "b1362453-2418-427d-ad2e-4258dd509fe7",
'comment': '伯符的调度相关信息',
}
# 应用入参
informationOfrobot = [
{"name": "name",
"value": '小刀',
"type": "str"
},
{"name": "scene",
"value": '在健身',
"type": "str"
},
{"name": "suggest",
"value": '很帅',
"type": "str"
}
]
if __name__ == '__main__':
accessToken = getAccessToken()
clientStatus = getClientData()
jobUuid = startJob(accessToken)
query(accessToken, jobUuid)

apiDispatch.py

Java代码模板

待定

Postman 接口测试模板

api.postman_collection.json

image.png

问题没有解决?去社区提问