get_sign.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. # -*- coding: utf-8 -*-
  2. # Author : Charley
  3. # Python : 3.10.8
  4. # Date : 2025/7/15 13:34
  5. import hashlib
  6. import json
  7. import random
  8. from urllib.parse import urlencode
  9. def hex2int(hex_str):
  10. """
  11. 将十六进制字符转换为整数
  12. :param hex_str:
  13. :return:
  14. """
  15. code = ord(hex_str.upper())
  16. if 48 <= code <= 57:
  17. return code - 48
  18. elif 65 <= code <= 70:
  19. return code - 65 + 10
  20. else:
  21. raise ValueError(f"Invalid hex character: {hex_str}")
  22. def get_real_string():
  23. """
  24. secret/suffix:是通过 GetRealString() 生成的随机字符串的一部分。
  25. :return: secret/suffix, nonce
  26. """
  27. base_str = "3e7e6843bcb7ef0a"
  28. secret = ""
  29. arr = []
  30. for _ in range(16):
  31. num = format(random.randint(0, 15), 'x') # 0~15 转16进制字符
  32. arr.append(num)
  33. secret += base_str[hex2int(num)]
  34. return secret, ''.join(arr)
  35. def gen_sign(suffix, params, ts):
  36. """
  37. 生成 sign 的值
  38. :param suffix:
  39. :param params:
  40. :param ts:
  41. :return: sign
  42. """
  43. params['timestamp'] = ts
  44. # 去空值
  45. cleaned_params = {
  46. k: v for k, v in params.items()
  47. if v is not None and v != ''
  48. }
  49. # 排序并构建新字典
  50. sorted_keys = sorted(cleaned_params.keys())
  51. new_params = {}
  52. for key in sorted_keys:
  53. value = cleaned_params[key]
  54. if isinstance(value, list):
  55. new_params[key] = json.dumps(value, separators=(',', ':'))
  56. else:
  57. new_params[key] = str(value)
  58. # 拼接参数字符串
  59. params_str = urlencode(new_params, doseq=True)
  60. # 计算签名
  61. sign_ = hashlib.md5((params_str + suffix).encode('utf-8')).hexdigest()
  62. return sign_
  63. def get_sign(params, timestamp):
  64. """
  65. 获取 sign , 封装
  66. :param params: get请求时是:params post请求时是data
  67. :param timestamp:
  68. :return:
  69. """
  70. # 获取随机字符串和 nonce
  71. suffix_, nonce = get_real_string()
  72. # 生成 sign 和 timestamp
  73. sign = gen_sign(suffix_, params, timestamp)
  74. return sign, nonce
  75. if __name__ == '__main__':
  76. # 示例参数
  77. # params = {
  78. # 'name': 'test',
  79. # 'age': 25,
  80. # 'tags': ['a', 'b']
  81. # }
  82. base_url = "https://api.xingchao6.com"
  83. url_ = "/AppClient/v1.1/product/list/page"
  84. url = base_url + url_
  85. # timestamp = int(time.time() * 1000)
  86. #
  87. # data = {
  88. # "page": 1,
  89. # "page_size": 10,
  90. # # "timestamp": 1752552031885
  91. # "timestamp": timestamp
  92. # }
  93. # # 获取随机字符串和 nonce
  94. # suffix_, nonce = get_real_string()
  95. #
  96. # # 生成 sign 和 timestamp
  97. # sign, timestamp = gen_sign(suffix_, data, timestamp)
  98. #
  99. # print("suffix:", suffix_)
  100. # print("nonce:", nonce)
  101. # print("timestamp:", timestamp)
  102. # print("sign:", sign)
  103. #
  104. # headers = {
  105. # "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)",
  106. # "Connection": "Keep-Alive",
  107. # "Accept": "application/json",
  108. # "Accept-Encoding": "gzip",
  109. # "Content-Type": "application/json",
  110. # "Cache-Control": "no-cache",
  111. # # "sign": "3c5028da758dc416455f575334cadaab",
  112. # "sign": sign,
  113. # # "x-token": "782a2174df1a19aa26904dad1d347c97",
  114. # "client": "yingyongbao",
  115. # "appversion": "2.1.6",
  116. # "nonce": nonce,
  117. # # "deviceid": "null",
  118. # "jrd": "100d85590861f713a85",
  119. # "timestamp": f"{timestamp}"
  120. # }
  121. #
  122. # # 发送 POST 请求
  123. # response = requests.post(
  124. # url,
  125. # json=data, # 注意:这里使用 data 参数发送表单数据
  126. # headers=headers
  127. # )
  128. #
  129. # print("Status Code:", response.status_code)
  130. # print("Response Body:", response.json())