125 lines
3.3 KiB
Python
125 lines
3.3 KiB
Python
import json
|
|
import time
|
|
import uuid
|
|
import urllib.parse
|
|
import hashlib
|
|
import sys
|
|
|
|
|
|
# =================== 运行环境配置 ===================
|
|
CONFIG = {
|
|
"dev": {
|
|
"platform_ifc_system_code": "ef5b17caff6e4da19d6af82d539e894d",
|
|
"systemCode": "57395d2bc668496c9c57d8f2b19bd516",
|
|
"appId": "57395d2bc668496c9c57d8f2b19bd516",
|
|
"secret_key": "KMFHKo1Uzrl&MWXorbQIT&C$Qea$uQOY",
|
|
"ifcUrl": "http://192.168.1.202:8083/dev-api/cenertech-interface-center/IFC2"
|
|
},
|
|
"prod": {
|
|
"platform_ifc_system_code": "57395d2bc668496c9c57d8f2b19bd516",
|
|
"systemCode": "57395d2bc668496c9c57d8f2b19bd516",
|
|
"appId": "57395d2bc668496c9c57d8f2b19bd516",
|
|
"secret_key": "opS=K9Parlf&p+JxBOQD2q+zNZa+uXEE",
|
|
"ifcUrl": "https://dpc.cet.cnooc/prod-api/cenertech-interface-center/IFC2"
|
|
}
|
|
}
|
|
|
|
|
|
# =================== MD5签名计算 ===================
|
|
def calculate_md5(param, secret_key):
|
|
return hashlib.md5((secret_key + param).encode('utf-8')).hexdigest()
|
|
|
|
|
|
def create_sign(param_map, secret_key):
|
|
sorted_keys = sorted(param_map.keys())
|
|
parts = []
|
|
|
|
for key in sorted_keys:
|
|
val = param_map[key]
|
|
|
|
if val is None:
|
|
parts.append(f"{key}=")
|
|
continue
|
|
|
|
if isinstance(val, list):
|
|
for item in val:
|
|
encoded_val = urllib.parse.quote(str(item), encoding='utf-8')
|
|
parts.append(f"{key}={encoded_val}")
|
|
continue
|
|
|
|
val_str = str(val)
|
|
|
|
if key != "REQUEST_BODY_CONTENT":
|
|
val_str = urllib.parse.quote(val_str, encoding='utf-8')
|
|
|
|
parts.append(f"{key}={val_str}")
|
|
|
|
param = "&".join(parts)
|
|
param = "".join(param.split())
|
|
|
|
print("参数明文 param:", param)
|
|
|
|
sign = calculate_md5(param, secret_key)
|
|
print("生成签名 sign:", sign)
|
|
|
|
return sign
|
|
|
|
|
|
# =================== Python 主程序 ===================
|
|
if __name__ == '__main__':
|
|
|
|
# 选择 dev / prod
|
|
env = "dev"
|
|
if len(sys.argv) > 1:
|
|
env = sys.argv[1]
|
|
print(f"\n=== 当前环境:{env} ===\n")
|
|
|
|
if env not in CONFIG:
|
|
print("❗ 错误:请使用 python sign.py dev 或 python sign.py prod")
|
|
sys.exit(1)
|
|
|
|
cfg = CONFIG[env]
|
|
|
|
systemCode = cfg["systemCode"]
|
|
appId = cfg["appId"]
|
|
secret_key = cfg["secret_key"]
|
|
platform_ifc_system_code = cfg["platform_ifc_system_code"]
|
|
ifcUrl = cfg["ifcUrl"]
|
|
|
|
ts = str(int(time.time() * 1000))
|
|
randomString = uuid.uuid4().hex
|
|
|
|
selector = {
|
|
"searchKeys": ["9cb864213c6f48ceaf90e98e7ca375e9","3DC1B33E1B5B431E99FA163BF9E86E6A","13336","b353614a47e2425a8a8885d270267407"],
|
|
"userType": "1",
|
|
"hasCascade": True
|
|
}
|
|
|
|
request_body_json = json.dumps(selector, separators=(',', ':'))
|
|
|
|
param_map = {
|
|
"systemCode": systemCode,
|
|
"timestamp": ts,
|
|
"nonce": randomString,
|
|
"REQUEST_BODY_CONTENT": request_body_json
|
|
}
|
|
|
|
sign = create_sign(param_map, secret_key)
|
|
|
|
apiPath = "/userListByDeptSearch"
|
|
fullUrl = f"{ifcUrl}/{platform_ifc_system_code}{apiPath}"
|
|
|
|
curl = f"""
|
|
curl -X POST "{fullUrl}" \\
|
|
-H "Content-Type: application/json" \\
|
|
-H "systemCode: {systemCode}" \\
|
|
-H "timestamp: {ts}" \\
|
|
-H "nonce: {randomString}" \\
|
|
-H "sign: {sign}" \\
|
|
-H "App-Id: {appId}" \\
|
|
-d '{request_body_json}'
|
|
"""
|
|
|
|
print("\n===== 最终 curl 请求 =====\n")
|
|
print(curl)
|