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)