|
|
@@ -0,0 +1,100 @@
|
|
|
+import hashlib
|
|
|
+import json
|
|
|
+import random
|
|
|
+import time
|
|
|
+import uuid
|
|
|
+import requests
|
|
|
+
|
|
|
+
|
|
|
+def generate_signature(params):
|
|
|
+ """
|
|
|
+ 根据提供的规则生成签名参数
|
|
|
+
|
|
|
+ Args:
|
|
|
+ params: 参数字典
|
|
|
+ data: 附加数据字符串,默认为空
|
|
|
+
|
|
|
+ Returns:
|
|
|
+ MD5加密后的签名值
|
|
|
+ """
|
|
|
+ # 固定的密钥字符串
|
|
|
+ secret_str = 'NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt'
|
|
|
+
|
|
|
+ # 对参数键进行排序
|
|
|
+ sorted_keys = sorted(params.keys())
|
|
|
+
|
|
|
+ # 构建参数字符串
|
|
|
+ params_list = []
|
|
|
+ for key in sorted_keys:
|
|
|
+ value = params[key]
|
|
|
+ # 如果值是字典或列表,转换为JSON字符串
|
|
|
+ if isinstance(value, (dict, list)):
|
|
|
+ params_list.append(f"{key}={json.dumps(value)}")
|
|
|
+ else:
|
|
|
+ params_list.append(f"{key}={value}")
|
|
|
+
|
|
|
+ params_string = ''.join(params_list)
|
|
|
+
|
|
|
+ # 构建待加密的完整字符串
|
|
|
+ sign_string = f"{secret_str}{params_string}{secret_str}"
|
|
|
+
|
|
|
+ # 计算MD5值
|
|
|
+ return hashlib.md5(sign_string.encode('utf-8')).hexdigest()
|
|
|
+
|
|
|
+
|
|
|
+# 示例使用
|
|
|
+if __name__ == "__main__":
|
|
|
+ # 生成13位时间戳
|
|
|
+ clienttime = str(int(time.time() * 1000) + (24*60*60*1000))
|
|
|
+
|
|
|
+ # 生成动态UUID(去除连字符)
|
|
|
+ dynamic_uuid = str(uuid.uuid4()).replace('-', '')
|
|
|
+
|
|
|
+ # 从URL中提取的参数
|
|
|
+ url_params = {
|
|
|
+ "source_id": "90137",
|
|
|
+ "appid": "3116",
|
|
|
+ "clientver": "10759",
|
|
|
+ "clienttime": clienttime,
|
|
|
+ "mid": "47995299944446761610674068629729839814",
|
|
|
+ "uuid": dynamic_uuid,
|
|
|
+ "dfid": "3eU9yX3FbBTW0y2kdP0DTMWc",
|
|
|
+ "token": "h565AF57B69A2E829C335AFD81CB07A97763BD035030492587613B6C45C5F7B497E9166B3CD4B29A2EC0DECDD0682A88076253E85B197C047E17409C581AC78AB3BFC5BDEE45BE933EFB0D89BC2B979B378D17A58B86B9CF62408742D5D38BEBF057809E30397DB4C6674307945B46FCBFCE76D1B5B0A2460C089178DB6B4DB2D5",
|
|
|
+ "userid": "1028024275",
|
|
|
+ "srcappid": "2919"
|
|
|
+ }
|
|
|
+
|
|
|
+ # 生成签名
|
|
|
+ signature = generate_signature(url_params)
|
|
|
+ print(f"生成的签名: {signature}")
|
|
|
+
|
|
|
+ url_params["signature"] = signature
|
|
|
+
|
|
|
+ # 构建完整的URL(不含签名参数)
|
|
|
+ base_url = "/youth/v1/recharge/receive_vip_listen_song"
|
|
|
+
|
|
|
+ # 构建查询字符串
|
|
|
+ query_string = "&".join([f"{key}={value}" for key, value in url_params.items()])
|
|
|
+ full_url = f"{base_url}?{query_string}"
|
|
|
+
|
|
|
+ print("完整的URL:")
|
|
|
+ print(full_url)
|
|
|
+
|
|
|
+ # 发送POST请求
|
|
|
+ try:
|
|
|
+ # 生成 20 到 40 秒之间的随机整数
|
|
|
+ sleep_time = random.uniform(20, 40)
|
|
|
+ time.sleep(sleep_time)
|
|
|
+ print(f"休眠了 {sleep_time:.2f} 秒")
|
|
|
+
|
|
|
+ # 注意:这里需要根据实际情况确定完整的请求URL
|
|
|
+ # 假设基础URL为 https://api.example.com 1770033832473
|
|
|
+ complete_url = f"http://gateway.kugou.com{full_url}"
|
|
|
+
|
|
|
+ response = requests.post(complete_url, timeout=10)
|
|
|
+
|
|
|
+ print(f"\nPOST请求响应状态码: {response.status_code}")
|
|
|
+ print(f"响应内容: {response.text}")
|
|
|
+
|
|
|
+ except requests.exceptions.RequestException as e:
|
|
|
+ print(f"请求发生错误: {e}")
|