# 最近刚开始学习js逆向,猿人学这个平台上的题目难度有层次,对新手比较友好,下面是第三题的解题代码:
import requests
'''题目设计思路:首先,客户端服务器发送第一个请求,这个请求会返回一个Set-Cookie。
其次,客户端带上这个Set-Cookie中的sessionid值再向服务器发送第二个请求,返回正确的数据包。
难点: 1.服务器会验证第一个请求headers的顺序,若顺序错误,不返回Set-Cookie。
干扰项:1.不带Set-Cookie直接向服务器发送请求,返回一段混淆的js代码,实际上这段js代码没什么用。
'''
url = "https://match.yuanrenxue.cn/jssm" # 第一个请求地址
headers = { # 设置第一个请求的headers
'Content-Length': '0',
'Accept': '*/*',
'Referer': 'https://match.yuanrenxue.cn/match/3',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cookie': 'sessionid=3yrryb4zmr5s6tap0cvvh26mzphptrqz',
}
# 先session
session=requests.Session() # 实例化一个session,用于固定headers的发送顺序
# 后session clear,clear这个是比较关键的写法。
session.headers.clear() # 先清空默认的headers
session.headers.update(headers) # 写入自己的headers
resp=session.post(url) # 发送第一个请求,主要用于获取响应头中的Set-Cookie
he = resp.headers['Set-Cookie'].split('; ')[0] # 使用split函数将Set-Cookie中的sessionid值提取出来
headers['Cookie'] = str(he) # 将sessionid值写入headers中
headers['user-agent'] = 'yuanrenxue.project' # 更改UA,用于获取4,5页内容
session.headers.update(headers) # 更新自己写的headers内容,用于发送第二个请求
resp1 = session.get("https://match.yuanrenxue.cn/api/match/3?page=5") # 直接试水第五页
print(resp1.text) # 至此,关键部分已经完成,for循环获取数据就比较简单了
成功获取到数据包!
下面是参考文章:
1.headers的顺序性:http请求头的顺序 - 培哥 - 博客园 (cnblogs.com)
2. 用session保持headers的顺序性:requests 发送请求时 保持 headers 的顺序 - 寒菱 - 博客园 (cnblogs.com)