1. 適用版本
適用於RPA2020.5版本
2. 介面 API 手冊呼叫方式及欄位,請參考手冊,開啟方式如下:
部署 2020.5 平臺後,瀏覽器開啟https://ip/doc.html
3. Python 呼叫程式碼如果想用機器人來調 API 介面,可參考以下程式碼,其它語言邏輯一樣:部分功能介面如無法呼叫,請參考手冊修改傳參
import hmacimport jsonfrom base64 import b64encodefrom hashlib import sha256from urllib.parse import urlparse, urlencode, quote, unquoteimport timeimport requestsdef get_token(url='', key='',secrect=''): """ :param url: 請求地址,示例:https://192.168.202.11/oapi/v1/token :return:返回token,[access_token,refresh_token] """ params = {'accessKey': key, 'secretKey': secrect} res = requests.get(url, params=params, verify=0) return res.json()def refresh_token(url='',refresh_token=''): """ :param url: 請求地址,示例:https://192.168.202.11/oapi/v1/token :param refresh_token:str型,重新整理token :return:返回token,[access_token,refresh_token] """ json_str='refreshToken='+refresh_token url = url+'?'+json_str res = requests.get(url,verify=False) return res.json()def rpa_base64_encode(data): """ Base64編碼,並處理\r\n :param data: 原始字元 :return: 編碼後的字元 """ encoded = b64encode(data.encode("utf-8")).decode("utf-8") return encoded.replace("\r\n", "")def rpa_sha256(key, value): """ SHA256加密,加密結果轉成16進位制字串形式 :param key: 金鑰 :param value: 原文 :return: 16進位制密文 """ key = key.encode("utf-8") value = value.encode("utf-8") ret = hmac.new(key, value, digestmod=sha256).hexdigest() print("sha265:"+ ret) return retdef sort_dict(d: dict) -> dict: """ 以字典的key按照升序排列 :param d: 字典物件 :return: 排序後的字典物件 """ return {key: value for key, value in sorted(d.items(), key=lambda item: item[0])}def rpa_url_encode(origin_data: dict, is_json=False, ts=""): """ 用url編碼資料,並處理特殊字元 Get方法、上傳檔案時設定is_json=False,其它情況為True :param origin_data: 原始資料 :param is_json: 是否以json方式處理 :param ts: 時間戳,外界傳入 :return: 處理後的資料 """ if is_json is True: data = json.dumps(origin_data, ensure_ascii=True) data = data + f"×tamp={ts}" else: # Get方法需要對引數排序 sorted_data = sort_dict(origin_data) # 新增時間戳 sorted_data.update({"timestamp": ts}) data = unquote(urlencode(sorted_data)) encoded = quote(data, encoding="utf-8") r = encoded.replace("+", "+").replace("*", "%2A").replace("~", "%7E") print('url編碼:'+r) return rdef rpa_timestamp(): """RPA風格的時間戳""" return f"{int(time.time() * 1000)}"def gen_signature(data: dict, is_json: bool, ts: str, token): """ 生成簽名 :param data: 請求引數 :param is_json: 是否以json方式處理(除Get和檔案上傳外,其它都用json方式) :param ts: 時間戳,從外界傳入 :return: 簽名 """ #用url編碼資料,並處理特殊字元 encoded = rpa_url_encode(data, is_json, ts) #SHA256加密,加密結果轉成16進位制字串形式 encrypted = rpa_sha256(token, encoded) #Base64編碼,並處理\r\n b64 = rpa_base64_encode(encrypted) print('簽名:'+b64) return b64class SendRequestFailed(Exception): passdef rpa_rest_2020_5(method, url, params: dict, has_signature: bool = True,is_json:bool = True, timeout: int = None, token=""): """ 向服務端傳送請求 :param method: 請求方法,"GET", "POST", "PUT", "DELETE" :param url: 請求地址,示例:https://192.168.202.11/oapi/v1/asset/list :param params: 請求引數(GET的url引數或POST的Body引數) :param has_signature: 是否簽名 :is_json:引數是否以json形式傳遞,GET、DELETE全部為False :param timeout 超時時間 :param token :return: 服務端返回資料(json) """ assert method.upper() in ("GET", "POST", "PUT", "DELETE") ts = rpa_timestamp() print(f"時間戳:{ts}") headers = None if method.upper() in ["GET", "DELETE"]: signature = gen_signature(params, is_json, ts, token) print("sig:", signature) if has_signature: headers = {"accesstoken": token,"timestamp": ts,"signature": signature} if method.upper() == "GET": r = requests.get(url=url, headers=headers, params=params, timeout=timeout, verify=False) else: r = requests.delete(url=url, headers=headers, params=params, timeout=timeout, verify=False) else: if is_json: signature = gen_signature(params, True, ts, token) else: signature = gen_signature(params, False, ts, token) if has_signature: headers = {"accesstoken": token,"timestamp": ts,"signature": signature} if is_json: r = requests.request(method=method, url=url, headers=headers, json=params, timeout=timeout, verify=False) else: r = requests.request(method=method, url=url, headers=headers, params=params, timeout=timeout, verify=False) if r.status_code != 200: raise SendRequestFailed(f"傳送請求失敗!伺服器返回碼:{r.status_code};返回內容:{r.text}.") return r.text
4. 其它平臺或客戶端呼叫4.1 其它平臺呼叫按照第 3 章的邏輯自行寫呼叫程式碼即可。
4.2 機器人呼叫按照第 4 章新增一個全域性函式,在需要呼叫的地方使用全域性函式控制元件即可。
注:需要提前獲取token後呼叫,如無第三方平臺對接,獲取的token可存在共享變數裡,分配許可權呼叫,參考下圖:
access_token: 有效期預設30分鐘。可透過refresh_token重新整理。