您需要具备以下方面的基本知识:
自定义操作脚本文件通常具有以下结构:
导入所需的软件包
以下列出了最常用的软件包及其用途:
软件包 用途
Sys 获取输入参数
json 处理 JSON 数据
requests 发起 API 调用
datetime 将毫秒时间转换为所需的日期格式
获取输入参数
脚本文件的参数可使用 sys.argv[index] 获取,其中 index 从 1 开始,到传入参数的数量结束。
当传入的参数为 $COMPLETE_JSON_FILE(包含请求 JSON 的文件路径)时,可使用以下代码片段读取该 JSON 文件:
file_Path = sys.argv[1]
with open(file_Path) as data_file:
data = json.load(data_file)
实现逻辑
以下代码片段用于发起 API 调用:
with requests.Session() as s:
url = 'api_url'
r = s.post(url,verify=True, data=post_data,headers=headers)
请根据需要构造 api_url、post_data 和 headers。
以下代码片段用于将毫秒时间转换为所需的日期格式:
date = datetime.datetime.fromtimestamp(int(millisec)/1e3).strftime('%d %b %Y, %H:%M:%S')
构造返回 JSON
可以按如下方式构造示例 JSON,例如 {"key":"value"}:
json = {}
json["key"] = "value"
print(json)
可以按如下方式构造示例 JSON 数组,例如 [{"key":"value"}]:
json = {}
json["key"] = "value"
result = []
result.append(json)
print(result)
可以使用脚本返回的 JSON 执行某些操作。了解使用返回 JSON 执行的操作,请点击此处。
以下示例展示了如何构造一个 JSON,以更新请求的附加字段 JIRA_ISSUE_ID 和 JIRA_ISSUE_URL,并添加相关备注。
jiraissueid = responseobj['id']
jiraissueurl = responseobj['self']
updateReqArray={}
updateReqArray['JIRA_ISSUE_ID']=jiraissueid
updateReqArray['JIRA_ISSUE_URL']=jiraissueurl
updateFieldsJson={"INPUT_DATA":[]}
updateFieldsJson['INPUT_DATA'].append(updateReqArray)
updateFieldsJson["OPERATIONNAME"]="EDIT_REQUEST"
note={}
note["notestext"] = "已创建 Jira 请求,ID 为:"+jiraissueid+"</br> 问题链接: "+jiraissueurl
noteObject={}
noteObject["notes"]=note
addNoteJson={}
addNoteJson['INPUT_DATA']=[]
addNoteJson['INPUT_DATA'].append(noteObject)
addNoteJson["OPERATIONNAME"]="ADD_NOTE"
resultjson={}
resultjson["result"] = "success"
resultjson["message"] = "已创建 Jira 请求。已添加包含问题 ID 和 URL 的备注。"
resultjson["operation"] = []
resultjson["operation"].append(updateFieldsJson)
resultjson["operation"].append(addNoteJson)
#返回 JSON
print(resultjson)
输入参数
请求参数和所有 API 参数都可以作为参数传递给脚本文件。请注意,参数不能传递给类文件。
下表列出了受支持的参数。
参数 返回的请求属性
$WORKORDERID 请求 ID
$REQUESTER 请求人姓名
$CREATEDBY 代表请求人创建工单的技术人员姓名
$CREATEDTIME 请求创建时间(毫秒)
$DUEBYTIME 到期时间(毫秒)
$RESPONSEDUEBYTIME 响应到期时间(毫秒)
$RESPONDEDTIME 请求响应时间(毫秒)
$RESOLVEDTIME 请求解决时间(毫秒)
$COMPLETEDTIME 请求关闭时间(毫秒)
$SHORTDESCRIPTION 简短描述
$TIMESPENTONREQ 请求耗时(小时和分钟)
$SUBJECT 主题
$REQUESTTEMPLATE 用于创建相应请求的请求模板(字符串)
$MODE 模式(字符串)
$SLA 服务级别协议(字符串)
$ASSET 资产(字符串)
$DEPARTMENT 部门(字符串)
$EDITORID 服务请求编辑者的用户 ID(Long)
$EDITING_STATUS 服务请求的编辑状态(Long)
$IS_CATALOG_TEMPLATE 表示该请求是通过服务目录还是事件目录创建的(布尔值)
$SITE 站点(字符串)
$ISVIPUSER 表示该用户是否为 VIP(是或否)
$SERVICE 服务类别(字符串)
$CATEGORY 类别(字符串)
$SUBCATEGORY 子类别(字符串)
$ITEM 项目(字符串)
$TECHNICIAN 已分配技术人员的姓名
$TECHNICIAN_LOGINNAME 当前登录技术人员的登录名
$STATUS 状态(字符串)
$PRIORITY 优先级(字符串)
$LEVEL 级别(字符串)
$IMPACT 影响(字符串)
$URGENCY 紧急程度(字符串)
$IMPACTDETAILS 影响详情
$REQUESTTYPE 请求类型
$APPROVAL_STATUS 请求的审批状态(字符串)
$CLOSURECODE 关闭请求的原因(字符串)
$CLOSURECOMMENTS 关闭请求的说明
$FCR 首次呼叫解决(布尔值)
$YETTOREPLYCOUNT 技术人员尚未回复的回复数量
$GROUP 组(字符串)
$DESCRIPTION 完整描述
$LOGIN_NAME 提出请求时使用的登录名
$LOGGEDIN_USER_NAME 提出请求的用户显示名称
其他受支持的参数
$DIFF_JSON ---> 当请求被更新时,先前数据与更新后数据之间的差异将以 JSON 字符串形式传递。
$COMPLETE_JSON_FILE ---> 完整请求对象和差异对象将保存到一个 JSON 文件中,并将文件路径作为字符串传递。例如: (SDP_Home\integration\custom_scripts\request\12_1426143538036.JSON)。
$COMPLETE_JSON 结构
{
"request": {
"WORKORDERID": "17",
"REQUESTER": "Annie",
"CREATEDBY": "Heather Graham",
"CREATEDTIME": "1477984359352",
"DUEBYTIME": "1477991559352",
"RESPONSEDUEBYTIME": "1477991559052",
"RESPONDEDTIME": "0",
"RESOLVEDTIME": "0",
"COMPLETEDTIME": "0",
"SHORTDESCRIPTION": "请为新入职员工创建一个用户账户,并提供所请求的资源。",
"TIMESPENTONREQ": "0hrs 0min",
"SUBJECT": "新员工入职请求表",
"REQUESTTEMPLATE": "新员工入职",
"MODE": "Web Form",
"SLA": "中等 SLA",
"ASSET": "iPhone 6 - PO# Apple_iPhone_43[52], MacBook Pro",
"IS_CATALOG_TEMPLATE": "false",
"SITE": "Zoho Corp - Chennai",
"ISVIPUSER": "否",
"SERVICE": "用户管理",
"CATEGORY": "用户管理",
"TECHNICIAN": "Shawn Adams",
"TECHNICIAN_LOGINNAME": "shawn.adams",
"STATUS": "打开",
"PRIORITY": "中等",
"LEVEL": "第 1 级",
"IMPACT": "中等",
"URGENCY": "正常",
"REQUESTTYPE": "新员工入职请求",
"FCR": "false",
"INTERESTEDPARTY": "hradmin1@org.com,hradmin2@org.com",
"GROUP": "人力资源组",
"DESCRIPTION": "请为新入职员工创建一个用户账户,并提供所请求的资源。",
"Languages Known": [
"Java",
"Python",
"SQL"
],
"Job Type": "软件开发工程师",
"Qualification": "计算机科学学士",
"Address": "我的门牌号:xx,\r\n我的街道名称,\r\n我居住的城市。\r\n邮政编码",
"Expected DOJ": "15 Nov 2016, 08:00:00",
"New Joinee Name": "John William",
"Years of Experience": "2.0",
"LOGIN_NAME": "heather.graham",
"LOGGEDIN_USER_NAME": "Heather Graham"
}
}
$DIFF_JSON 结构
{
"diff": {
"DUEBYTIME": {
"OLD": "1476961659524",
"NEW": "1476940059524"
},
"MODE": {
"OLD": "电子邮件",
"NEW": "电话"
},
"SLA": {
"OLD": "低 SLA",
"NEW": "中等 SLA"
},
"SERVICE": {
"OLD": "",
"NEW": "数据管理"
},
"CATEGORY": {
"OLD": "桌面硬件",
"NEW": "常规"
},
"TECHNICIAN": {
"OLD": "Howard Stern",
"NEW": "Jeniffer Doe"
},
"PRIORITY": {
"OLD": "低",
"NEW": "中等"
},
"LEVEL": {
"OLD": "",
"NEW": "第 2 级"
},
"IMPACT": {
"OLD": "低",
"NEW": "中等"
},
"URGENCY": {
"OLD": "低",
"NEW": "正常"
},
"REQUESTTYPE": {
"OLD": "事件",
"NEW": "信息请求"
},
"GROUP": {
"OLD": "网络",
"NEW": "打印机问题"
}
}
}
每当请求被编辑时,都会生成 DIFF_JSON,可用于根据字段更改来设计工作流。
$COMPLETE_JSON_FILE
$COMPLETE_JSON_FILE 表示文件路径,该文件中将 $COMPLETE_JSON 和 $DIFF_JSON 一并保存在单个 JSON 中。与其向类/脚本传递过多参数,不如传递文件路径,然后由脚本打开文件并访问所需的值。
该文件是临时创建的,并会在脚本执行后删除。
临时 JSON 文件创建于 SDP_Home\integration\custom_scripts\request\ 目录下,文件名为 <requestid_timestamp>.json。