Python爬虫:通过js逆向了解某音请求接口参数a_bogus加密过程
1. 前言
需要提前说明以下,本篇文章讲述的内容仅供学习,切莫用于商业活动,如若被相关人员发现,本小编概不负责!切记。。
本次分析的接口为:https://www.douyin.com/aweme/v1/web/discover/search/
它的请求方式为:GET
请求需要的参数有:
请求参数中需要进行js逆向是:a_bogus
必须需要的请求头字段为:referer,user-agent(可不写,建议写)
这个接口用于获取某音搜索所得到的用户数据,如下:
2. 找到js逆向部分最关键的点
需要找到该接口的启动器下这个,然后点击进入
然后在下述这个地方进行断点操作。为什么是这个地方呢?因为这个地方是参数值a_bogus生成的地方。当然在该断点上需要继续执行脚本多次,才会找到我们需要的请求接口请求参数a_bogus加密部分。
如下(下述是edge浏览器操作截图):
此时,可以发现这个关键部分就是上述这个代码,其中arguments就是加密需要的参数,也就是如下:
var params = [
0,
1,
14,
'device_platform=webapp&aid=6383&channel=channel_pc_web&search_channel=aweme_user_web&keyword=%E5%A5%A5%E7%89%B9%E6%9B%BC&search_source=normal_search&query_correct_type=1&is_filter_search=0&from_group_id=&offset=0&count=10&need_filter_settings=1&list_type=single&update_version_code=170400&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1536&screen_height=864&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=120.0.0.0&browser_online=true&engine_name=Blink&engine_version=120.0.0.0&os_name=Windows&os_version=10&cpu_core_num=8&device_memory=4&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7375104739480094217&msToken=NqYCyHdpAMPM14BJ6fw69qOui-bipCWQ8oZ0Yibr2FoASHy-5CR-0ryRcocIpxlMnOAslkYUTbITzUR6uUt1CTJcO4GdM-KNuXyzARN35Lw5w0avNwdZdfM%3D&msToken=NqYCyHdpAMPM14BJ6fw69qOui-bipCWQ8oZ0Yibr2FoASHy-5CR-0ryRcocIpxlMnOAslkYUTbITzUR6uUt1CTJcO4GdM-KNuXyzARN35Lw5w0avNwdZdfM%3D',
"",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.218.400 QQBrowser/12.1.5496.400"
]
3. js逆向生成a_bogus参数值
直接把bdms.js这个文件的代码copy到本地电脑,找到59!==这段代码下,然后在最后加上下述代码
然后在另外一个js文件这个js文件,当然可以直接在这个js代码下直接写。然后运行这个文件,就会报一些错误,如下:
这是由于缺少一定环境导致的,此时需要补环境,补环境的代理代码如下:
function get_enviroment(proxy_array) {
for (var i = 0; i < proxy_array.length; i++) {
handler = '{\n' +
' get: function(target, property, receiver) {\n' +
' console.log("方法:", "get ", "对象:", ' +
'"' + proxy_array[i] + '" ,' +
'" 属性:", property, ' +
'" 属性类型:", ' + 'typeof property, ' +
// '" 属性值:", ' + 'target[property], ' +
'" 属性值类型:", typeof target[property]);\n' +
' return target[property];\n' +
' },\n' +
' set: function(target, property, value, receiver) {\n' +
' console.log("方法:", "set ", "对象:", ' +
'"' + proxy_array[i] + '" ,' +
'" 属性:", property, ' +
'" 属性类型:", ' + 'typeof property, ' +
// '" 属性值:", ' + 'target[property], ' +
'" 属性值类型:", typeof target[property]);\n' +
' return Reflect.set(...arguments);\n' +
' }\n' +
'}'
eval('try{\n' + proxy_array[i] + ';\n'
+ proxy_array[i] + '=new Proxy(' + proxy_array[i] + ', ' + handler + ')}catch (e) {\n' + proxy_array[i] + '={};\n'
+ proxy_array[i] + '=new Proxy(' + proxy_array[i] + ', ' + handler + ')}')
}
}
proxy_array = ['window', 'document', 'location', 'navigator', 'history', 'screen']
get_enviroment(proxy_array)
把对应的环境补上,然后再运行就不会报一些错误,然后再执行下述测试代码,如下:
虽然生成的a_bogus的结果值与实际该接口的a_bogus值在长度上有一些不同,但是是可以正常访问的,如下: