起因
这几天在研究优酷网站的时候,发现每次请求都会携带一个 sign 字段:它不停地更新,而且每次请求的值都不同。

sign 的组成
通过断点调试可以看到,sign 是这样拼接出来的:
h(d.token + "&" + i + "&" + g + "&" + c.data)对应关系:
d.token:用户 token,从 cookie 中获取i:时间戳g:appKey(版本号)c.data:加密字符(即请求体内容)
h() 函数的真身
顺着调用栈找到 h() 的底层代码后发现,它其实就是标准的 MD5 加密。也就是说:
sign = md5(token + "&" + 时间戳 + "&" + appKey + "&" + data)算法和参数来源都有了,自己生成 sign 就不是难事了。
关于加密字符 data
data 是每个接口自己的请求体,不同接口的内容可能都不一样,自己抓包取一下即可。比如性能上报接口的 data 长这样:
"{\"req\":\"{\\\"client_code\\\":\\\"youku@7001\\\",\\\"biz_type\\\":\\\"performance_fe\\\",\\\"performance_state\\\":\\\"dr&1s&2s&3s&4s&5s&fp&1f&2f&3f&4f&5f\\\",\\\"client_msg\\\":\\\"{\\\\\\\"fcp\\\\\\\":272,\\\\\\\"fmp\\\\\\\":272,\\\\\\\"dns\\\\\\\":0,\\\\\\\"tcp\\\\\\\":0,\\\\\\\"ssl\\\\\\\":0,\\\\\\\"ttfb\\\\\\\":14,\\\\\\\"trans\\\\\\\":6,\\\\\\\"dom\\\\\\\":498,\\\\\\\"res\\\\\\\":454,\\\\\\\"firstbyte\\\\\\\":25,\\\\\\\"tti\\\\\\\":530,\\\\\\\"ready\\\\\\\":530,\\\\\\\"load\\\\\\\":985}\\\",\\\"alarm_type\\\":\\\"basic\\\",\\\"client_time\\\":1725988749845,\\\"page_type\\\":\\\"7d9ab067311c45abbd253d3e6da88e17&youku&H:V0.0.7\\\",\\\"third_uuid\\\":\\\"cna&NaNcHxdKIBcCAdyvkJlqT4rc\\\",\\\"alarm_mark\\\":\\\"youku\\\",\\\"page_url\\\":\\\"https://t.youku.com/yep/page/m/9jka5jj3uq\\\",\\\"page_title\\\":\\\"优酷福利活动\\\",\\\"page_name\\\":\\\"https://t.youku.com/yep/page/m/9jka5jj3uq\\\",\\\"os\\\":\\\"M&iOS&iPhone&I16.6&Web\\\",\\\"app_version\\\":\\\"Safari&V128\\\",\\\"app_key\\\":\\\"Apple&iPhone\\\"}\"}"token 从哪里拿
token 就在 cookie 里,F12 打开开发者工具,在 Application → Cookies 中检查一遍就能找到。
Python 复现
import hashlib
import time
token = '从cookie中取出的token'
appkey = '你的appKey'
data = '{"req":"..."}' # 抓包拿到的请求体
t = str(int(time.time() * 1000))
raw = f'{token}&{t}&{appkey}&{data}'
sign = hashlib.md5(raw.encode('utf-8')).hexdigest()
print(sign)总结
优酷 Web 端的 sign 防护并不复杂,核心就是 md5(token & 时间戳 & appKey & data),真正的门槛在于找准每个接口的 data 以及 token 的取值位置。
需要注意的是,这只是 Web 端的玩法。优酷 App 端走的是阿里 mtop 网关的 x-sign 签名体系(SecurityGuard 安全库),那是另一套东西,之后的文章会单独讲。
交流微信:run1255