101 lines
2.7 KiB
Python
101 lines
2.7 KiB
Python
import json
|
||
import time
|
||
import uuid
|
||
import urllib.parse
|
||
import hashlib
|
||
|
||
|
||
# =================== MD5签名计算 ===================
|
||
def calculate_md5(param, secret_key):
|
||
# Java 规则:MD5(secretKey + param)
|
||
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)
|
||
|
||
# Java逻辑: .replaceAll("\\s", "")
|
||
param = "".join(param.split())
|
||
|
||
print("参数明文 param:", param)
|
||
|
||
sign = calculate_md5(param, secret_key)
|
||
print("生成签名 sign:", sign)
|
||
|
||
return sign
|
||
|
||
|
||
# =================== Python 主程序 ===================
|
||
if __name__ == '__main__':
|
||
platform_ifc_system_code = "9f5bbb73710c4a6a8923c278ffa00d50"
|
||
|
||
systemCode = "114ee506d80a479c8d106c4748d2d029"
|
||
|
||
appId = "114ee506d80a479c8d106c4748d2d029"
|
||
secret_key = "31z&h7IhG6gba@ptz=F8FSr+C5-*OHy6"
|
||
|
||
ts = str(int(time.time() * 1000))
|
||
randomString = uuid.uuid4().hex
|
||
|
||
selector = {
|
||
"searchKeys": ["4555f083accb42c699fa222f85508404", "9bc5618ba6fa485aa2b3f88e37d34238",
|
||
"cf0e557530884526bd693341928885c6", "ffc7d0c4018b4c8cad0e8c70aae3698c",
|
||
"71985162af674df0bd1ca75d3e6e1984", "a704938ab033447ead129f1e7821d685",
|
||
"b761bd9a156a485ebed9a21c714b9807", "3fd5dd6c401b46e7b1178badb6723491", "13347", ],
|
||
"userType": "0",
|
||
"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)
|
||
|
||
ifcUrl = "https://dpc.cet.cnooc/prod-api/cenertech-interface-center/IFC2"
|
||
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)
|