1. 程式人生 > 其它 >PRA2020.5 平臺 API 介面呼叫(2021-01-21 更新)

PRA2020.5 平臺 API 介面呼叫(2021-01-21 更新)

技術標籤:RPA藝賽旗python基礎RPAPython藝賽旗

瞭解RPA:
www.i-search.com.cn

學習RPA
https://support.i-search.com.cn/

下載RPA:
https://www.i-search.com.cn/?from=csdn

  1. 適用版本
    適用於RPA2020.5版本,RPA2020.3無API,其它版本請參考:
    ==> rpa9 點選跳轉
    ==> rpa10 點選跳轉
    ==> RPA2020.4 點選跳轉

  2. 介面 API 手冊
    呼叫方式及欄位,請參考手冊,開啟方式如下:

部署 2020.5 平臺後,瀏覽器開啟https://ip/doc.html

  1. Python 呼叫程式碼
    如果想用機器人來調 API 介面,可參考以下程式碼,其它語言邏輯一樣:
    部分功能介面如無法呼叫,請參考手冊修改傳參

import hmac
import json
from base64 import b64encode
from hashlib import sha256
from urllib.parse import urlparse, urlencode, quote, unquote
import time
import requests

def 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 ret

def 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"&timestamp={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 r

def 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 b64

class SendRequestFailed(Exception):
pass

def 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
  1. 其它平臺或客戶端呼叫
    4.1 其它平臺呼叫
    按照第 3 章的邏輯自行寫呼叫程式碼即可。

4.2 機器人呼叫
按照第 4 章新增一個全域性函式,在需要呼叫的地方使用全域性函式控制元件即可。

注:需要提前獲取token後呼叫,如無第三方平臺對接,獲取的token可存在共享變數裡,分配許可權呼叫,參考下圖:

access_token: 有效期預設30分鐘。
可通過refresh_token重新整理。

在這裡插入圖片描述