看到有读者咨询知乎x-zse-96,做一下分析和记录。
随便找了一个搜视频接口 /api/v4/search_v3
经测试发现,目前请求必带的参数有headers 中的x-zse-96、x-zse-93、x-api-version 和 cookie中的d_c0。 其中 d_c0是由 /udid接口 set-cookie。 第二次访问时 x-zst-81 可以不带。
参数定位
那全局搜关键词 x-zse-96。
点进去再搜,可以清晰的看到 l.set("x-zse-96", "2.0" + O) 和 d.set("x-zse-96", "2.0" + E)
两个地方都断点,触发请求。 注意下 e 是否是我们定位的接口URL。
把此处的 x-zse-96和请求中的对比。
发现两个是一致的,所以这里就是正确的生成位置。
大概看一下流程: E = S.signature ,S.signature = (0, P(r).encrypt)(f()(s))
先按流程扣代码 (P( r ).encrypt)(f()(s)) 。
P ( r ) encrypt 对应的D 。
跳转查看。
双击后可以复制整段代码。
D 扣下来的示例:
f()(s) 这一段是对请求时的一些信息处理后md5。
后面过程太繁琐,不想写了,直接贴代码吧,
大家可以到csdn搜下相关文章,我也参考了别人的内容。
Python调用代码
import requests
import execjs
domain = 'https://www.zhihu.com'
search_api = '/api/v4/search_v3?gk_version=gz-gaokao&t=zvideo&q=%E9%80%86%E5%90%91&correction=1&offset=0&limit=20&filter_fields=&lc_idx=0&show_all_topics=0&search_source=Normal'
search_url = domain+search_api
with open('x-zse-96.js','r',encoding='utf-8') as f:
js = f.read()
etx = execjs.compile(js)
# d_c0 是服务端返回的,自己请求一个
d_c0 = "AFATiXgZ_BWPTtgq6Lp8yI2EWG9iT6W6BgI=|1670475363"
xzse96 = etx.call('get_xzse96',d_c0,search_api)
headers = {
"cookie":f"d_c0={d_c0};",
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
"x-api-version":"3.0.91",
"x-zse-93":"101_3_3.0",
"x-zse-96":xzse96,
}
print(requests.get(search_url, headers=headers).text)
JS还原代码
下载地址:
【温馨提示:此处隐藏内容需要付费订阅后才能查看!】