|
发表于 2022-3-22 23:15:59
|
显示全部楼层
本楼为最佳答案
 大概看了哈网站,解密不复杂
逻辑如下:
1、js中申明了params={brand: "all",country: "cn",date: "2022-03-22",device: "iphone",genre: "6014",page: 4}(这里具体时间、page页码值自己替换)
逻辑就是先组合然后bas64加密,再和url和时间戳和查询接口地址再二次组合,这里注意时间戳要减一个固定值
data+genre+page+brand+country+device即22022-03-226014allcniphone然后base64一下,再@#+url地址+时间戳-1515125653845+@#1(就是地址后的查询接口0或1或2),即MjIwMjItMDMtMjI2MDE0YWxsY25pcGhvbmU=@#/rank/indexPlus/brand_id/1@#132831706011@#1
2、第二次组合后然后就是用网站自己得js加密处理一下,这个有两个方案
方案一是花点时间找js算法,结果系统自带的js老是出错,早知道装node.js就不浪费时间了,这个比较省事,没研究算法,直接照搬后用execjs运行就得了
方案二是百度的,懒得研究算法(这里佩服下,能花心思研究这的可真是认真啊)
- import requests,execjs,json,base64,time,os
- #===============这部分为解密================================================
- #方案一,记得用Node.js,我就是没装Node.js,结果用默认用系统的js,老是出错
- #这里是扣https://static.qimai.cn/static/js/app.js里的代码
- jsdata = '''
- function i(e) {
- var t, a = (t = "",
- ["66", "72", "6f", "6d", "43", "68", "61", "72", "43", "6f", "64", "65"].forEach((function(e) {
- t += unescape("%u00" + e)
- }
- )),
- t);
- return String[a](e)
- }
- function g(e, t) {
- t || (t = s());
- for (var a = (e = e.split("")).length, n = t.length, o = "charCodeAt", r = 0; r < a; r++)
- e[r] = i(e[r][o](0) ^ t[(r + 10) % n][o](0));
- return e.join("")
- }
- function get_data(a1){
- a2 = '0000000c735d856'
- return g(a1,a2)
- }
- '''
- jsdata = execjs.compile(jsdata)
- # 方案二,方案一不行的时候用自定义加密函数
- def encrypt(a):
- e = '0000000c735d856'
- t = len(e)
- n = len(a)
- a = list(a)
- for s in range(n):
- a[s] = chr(ord(a[s]) ^ ord(e[(s + 10) % t]))
- return ''.join(a)
- #=========正文================================
- # 自己改cookies
- headers = {
- "Accept": "application/json, text/plain, */*",
- "accept-encoding":"gzip, deflate, br",
- "Referer": "https://www.qimai.cn/",
- "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/59.0",
- "cookie": "PHPSESSID=p71fo839h4fkath83oitoppkqe; qm_check=SxJXQEUSChd2fHd1dRQQd19fV1xVHBVhR1xSUVoYAR4CHgAQGGZAW1ZNY1xZVFVCEHRVRlxUVxARY0FaSlVCXxkQGAVPAgAJAHcIdHUZGRwQY0JeVERqWFVcVUIQVEJZRlBFHwUXABoIGRIcElNYVVZcEAobABgIHAAcABwAEkg%3D; synct=1647956097.086; syncd=-2631; tgw_l7_route=d09474674af82c17375cfcdd775c0c28"
- }
- api_domain = 'https://api.qimai.cn'
- api_url = '/rank/indexPlus/brand_id/1'
- #这里也是扣的js代码
- params = {
- 'brand':'all',
- 'country':'cn',
- 'device':'iphone',
- 'date':'2022-03-22',
- 'genre':'6014',
- 'page':'4'
- }
- def main():
- url=api_domain+api_url
- s = "".join(sorted([str(v) for v in params.values()]))
- s = base64.b64encode(bytes(s, encoding="ascii"))
- t = str(int((time.time() * 1000-1515125653845)))
- s = "@#".join([s.decode(), api_url, t, "1"])
- os.environ["EXECJS_RUNTIME"] = "Node"#方案一
- an = jsdata.call('get_data',s)#方案一
- params["analysis"] = base64.b64encode(an.encode('utf-8')).decode('utf-8')#方案一
- # params["analysis"] = base64.b64encode(bytes(encrypt(s), encoding="ascii"))#方案二
- # print(params)
- html = requests.get(url,params=params,headers=headers)
- return html
- if __name__ == '__main__':
- html = main()
- print(html.json())
复制代码 |
|