淘宝sign参数是通过MD5加密算法生成的,主要用于防止非浏览器环境的数据采集。
1.加密参数分析 sign参数由多个请求参数拼接后经过MD5哈希加密生成。
核心加密参数包括: token:从cookie中的_m_h5_tk字段获取,以"_"分割后的第一部分时间戳:13位时间戳,对应请求参数中的t参数appkey:固定值,如"12574478",data:商品ID等请求参数 2.JS逆向调试方法 在开发者工具中通过搜索"sign:"或"sign="定位加密函数,在sign赋值语句前设置断点进行调试。
DOM断点监听和调用栈分析可帮助找到加密位置。
3.Python实现方案 以下是完整的sign生成Python实现:
import hashlib
import time
import requests
class TaobaoSignGenerator:
def __init__(self, app_key="12574478"):
self.app_key = app_key
def get_token_from_cookie(self, cookie_str):
"""从cookie中提取token"""
if '_m_h5_tk' in cookie_str:
return cookie_str.split('_m_h5_tk=')[1].split('_')[0]
return ""
def generate_sign(self, token, timestamp, data):
"""生成sign签名"""
# 参数拼接
sign_str = f"{token}&{timestamp}&{self.app_key}&{data}"
# MD5加密
return hashlib.md5(sign_str.encode('utf-8')).hexdigest()
def make_request(self, item_id, cookie):
"""构造完整的淘宝API请求"""
token = self.get_token_from_cookie(cookie)
timestamp = str(int(time.time() * 1000))
# 构造data参数
data = f'{{"id":"{item_id}"}}'
# 生成sign
sign = self.generate_sign(token, timestamp, data)
# 构造请求参数
params = {
't': timestamp,
'sign': sign,
'data': data,
'appKey': self.app_key
}
headers = {
'Cookie': cookie,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
return params, headers
def main():
generator = TaobaoSignGenerator()
# 示例使用
item_id = "737587704463"
cookie = '_m_h5_tk=0be2373e0c00b08d010ad71b4b99e9c5_1695273600000; other_cookie=value'
params, headers = generator.make_request(item_id, cookie)
print("生成的请求参数:")
print(f"t: {params['t']}")
print(f"sign: {params['sign']}")
print(f"data: {params['data']}")
print(f"appKey: {params['appKey']}")
# 实际请求示例(需要有效的cookie)
# response = requests.get('https://h5api.m.taobao.com/h5/mtop.taobao.detail.getdetail/6.0',
# params=params, headers=headers)
# print(response.json())
if __name__ == "__main__":
main()
3.1关键调试技巧 调试时需注意参数中的反斜杠转义问题,控制台打印的双反斜杠在加密时应改为单反斜杠。
通过在线MD5工具验证加密结果可确认算法正确性。
3.2替代方案 对于移动端App,可通过Frida hook技术主动调用签名生成方法获取x-sign等参数。
该方案能够有效还原淘宝sign参数的生成逻辑,为数据采集提供技术支撑。
