| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- # -*- 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())
|