通过这个网站, 详细说一下analysis这个参数生成过程
刷新页面, 搜索数据
WX20220208-183331.png
格式化请求, 发现analysis参数每次变化,
WX20220208-183902@2x.png
而且全局搜索没有生成的js代码:
WX20220208-183809.png
我们看这个响应的生成过程, 是倒序的, 也就是运行到第一个的时候数据已经拿到啦, 我们看看点击第一个:
WX20220208-184043.png
先试试, 点击后自动停在282行, 打个断点 , 刷新页面,看到url已经是最终的了:
WX20220209-101319.png
回到initiator, 继续从上往下挨个点开看看有没有可疑的地方, 当到这个的时候发现了interceptors.request....:
WX20220210-101321.png
WX20220210-101615.png
进入函数
WX20220210-101805.png
(补充知识点)
WX20220210-100323@2x.png
观察每一个变量结果,点了n次以后, 到这里, 发现a就是analysis
WX20220208-150207.png
a和r, l 有关, r就是params里固定值和o拼成的, o是4062行生成的, 也简单
WX20220208-151209.png WX20220208-151640.png WX20220208-151911.png
l 是固定的值
WX20220208-152247.png
在4078行断点, 取消397那行断点, 刷新, 单步进入函数, 看a的生成, 第一步就会跳到这里:
WX20220210-110334.png
e, t就是刚才的r, l
WX20220210-105802.png
(知识点: charCodeAt()是一个str转Unicode方法, )
WX20220208-154730.png WX20220208-154747@2x.png
继续进入for循环, 点几下跳到这里,看着很蒙蔽, 实际上这几行就是Unicode转str
WX20220208-154143.png
(知识点: fromCharCode()是啥?)
WX20220208-155628@2x.png
跳出这个循环, 生成了一串奇怪的str,
WX20220210-111634.png
继续下一步, 这个方法实际上就是处理base64编码
(知识点)
看着贼麻烦, 用Python转一下就很清爽
#unicode值转化成str
ord('a') # 97
# str转unicode
chr(97) # 'a'
#七麦
def get_analysis(e,t):
'''
e='MzZjbmZyZWVpcGhvbmU=@#/rank/index@#129183696666@#1'
t='0000000c735d856'
'''
e_=''
for r in range(len(e)):
e_+=chr(ord(e[r])^ord(t[(r+10)%len(t)]))
return base64.b64encode(e_.encode()).decode()# JS 的btoa()
o的生成就容易了, 当前时间戳-2个固定值
o=int(time.time()*1000-1435-1515125653845)
附上全部代码, 我发现参数不变好像也能获取数据...不管了, 过程最重要🙃
#七麦
def get_analysis(e,t):
'''
e='MzZjbmZyZWVpcGhvbmU=@#/rank/index@#129183696666@#1'
t='0000000c735d856'
'''
e_=''
for r in range(len(e)):
e_+=chr(ord(e[r])^ord(t[(r+10)%len(t)]))
return base64.b64encode(e_.encode()).decode()
o=int(time.time()*1000-1435-1515125653845)
e=f'MzZjbmZyZWVpcGhvbmU=@#/rank/index@#{t}@#1'
t='0000000c735d856'
analysis=get_analysis(e,t)
import requests
headers = {
'authority': 'api.qimai.cn',
'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"',
'accept': 'application/json, text/plain, */*',
'sec-ch-ua-mobile': '?0',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
'sec-ch-ua-platform': '"macOS"',
'origin': 'https://www.qimai.cn',
'sec-fetch-site': 'same-site',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://www.qimai.cn/',
'accept-language': 'zh-CN,zh;q=0.9',
# 'cookie': 'synct=1644301989.283; syncd=-2435; tgw_l7_route=d09474674af82c17375cfcdd775c0c28; PHPSESSID=qo1pvdur8skmk47dvnejrnphc6; qm_check=SxJXQEUSChd+XERcXBxqGRB5QllDGGF6GxBpXEFLEHdCUUBYWVZEEgYNBRYUElNYVVNbEg8VAhwJHAQUABwAEk0%3D; gr_user_id=336f7c98-6f00-4911-88e7-25ed65fa1a79; ada35577182650f1_gr_session_id=9decd5f4-f9e6-4652-9ffd-9470efdb527e; ada35577182650f1_gr_session_id_9decd5f4-f9e6-4652-9ffd-9470efdb527e=true',
}
params = (
('analysis', get_analysis(e,t)),
('brand', 'free'),
('country', 'cn'),
('genre', '36'),
('device', 'iphone'),
)
response = requests.get('https://api.qimai.cn/rank/index', headers=headers, params=params)
rj=response.json()
网友评论