# -*- coding: utf-8 -*- # Author : Charley # Python : 3.10.8 # Date : 2025/7/15 13:34 import hashlib import json import random from urllib.parse import urlencode def hex2int(hex_str): """ 将十六进制字符转换为整数 :param hex_str: :return: """ code = ord(hex_str.upper()) if 48 <= code <= 57: return code - 48 elif 65 <= code <= 70: return code - 65 + 10 else: raise ValueError(f"Invalid hex character: {hex_str}") def get_real_string(): """ secret/suffix:是通过 GetRealString() 生成的随机字符串的一部分。 :return: secret/suffix, nonce """ base_str = "3e7e6843bcb7ef0a" secret = "" arr = [] for _ in range(16): num = format(random.randint(0, 15), 'x') # 0~15 转16进制字符 arr.append(num) secret += base_str[hex2int(num)] return secret, ''.join(arr) def gen_sign(suffix, params, ts): """ 生成 sign 的值 :param suffix: :param params: :param ts: :return: sign """ params['timestamp'] = ts # 去空值 cleaned_params = { k: v for k, v in params.items() if v is not None and v != '' } # 排序并构建新字典 sorted_keys = sorted(cleaned_params.keys()) new_params = {} for key in sorted_keys: value = cleaned_params[key] if isinstance(value, list): new_params[key] = json.dumps(value, separators=(',', ':')) else: new_params[key] = str(value) # 拼接参数字符串 params_str = urlencode(new_params, doseq=True) # 计算签名 sign_ = hashlib.md5((params_str + suffix).encode('utf-8')).hexdigest() return sign_ def get_sign(params, timestamp): """ 获取 sign , 封装 :param params: get请求时是:params post请求时是data :param timestamp: :return: """ # 获取随机字符串和 nonce suffix_, nonce = get_real_string() # 生成 sign 和 timestamp sign = gen_sign(suffix_, params, timestamp) return sign, nonce if __name__ == '__main__': # 示例参数 # params = { # 'name': 'test', # 'age': 25, # 'tags': ['a', 'b'] # } base_url = "https://api.xingchao6.com" url_ = "/AppClient/v1.1/product/list/page" url = base_url + url_ # timestamp = int(time.time() * 1000) # # data = { # "page": 1, # "page_size": 10, # # "timestamp": 1752552031885 # "timestamp": timestamp # } # # 获取随机字符串和 nonce # suffix_, nonce = get_real_string() # # # 生成 sign 和 timestamp # sign, timestamp = gen_sign(suffix_, data, timestamp) # # print("suffix:", suffix_) # print("nonce:", nonce) # print("timestamp:", timestamp) # print("sign:", sign) # # headers = { # "User-Agent": "Mozilla/5.0 (Linux; Android 11; Pixel 5 Build/RQ3A.211001.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36 uni-app Html5Plus/1.0 (Immersed/52.727272)", # "Connection": "Keep-Alive", # "Accept": "application/json", # "Accept-Encoding": "gzip", # "Content-Type": "application/json", # "Cache-Control": "no-cache", # # "sign": "3c5028da758dc416455f575334cadaab", # "sign": sign, # # "x-token": "782a2174df1a19aa26904dad1d347c97", # "client": "yingyongbao", # "appversion": "2.1.6", # "nonce": nonce, # # "deviceid": "null", # "jrd": "100d85590861f713a85", # "timestamp": f"{timestamp}" # } # # # 发送 POST 请求 # response = requests.post( # url, # json=data, # 注意:这里使用 data 参数发送表单数据 # headers=headers # ) # # print("Status Code:", response.status_code) # print("Response Body:", response.json())