Python获取Cookie时遇到重定向的情况

问题描述和解决:

在模拟登录教务处的时候,需要通过获取cookie来进行后面一系列操作。

但是刚开始,python模拟登录一直失败,提示的没权限。通过网页抓包分析,最后看到每次输入地址进行登录时候,会发生302重定向,重定向后的地址和原来一样,但是会在地址后面传入一段随机值。

通过Burpsuite抓包查看每次登录请求头部信息,提交的Cookie有两个字段。在以前的时候一直是 :Cookie: JSESSIONID=gde7KUAgMlZ-zdMkvOjGw一个字段,但是通过抓包分析,每次在重定向的时候也会添加一个字段,而这个cookie字段是通过浏览器随机生成的。

所以想到的解决思路是,是否可以通过抓取两个cookie字段,来进行模拟登录。但是正常通过request请求,只能得到一个Cookie。

最后,通过在request库请求的时候,加入一个参数:allow_redirects=False ,来禁止网页进行302重定向,从而成功的获取了第一个cookie字段,再利用获取到的这个cookie字段,以及获取到的url,重新封装请求头部。重新进行了网页请求,从而获取了第二个cookie字段。通过抓分分析,将获取的两个cookie字段,进行了拼接成为一个字符串。将新的cookie进行了封装到请求头信息,从而提交账号密码等信息,从而成功实现了登录。以及后面获得了各种想要的信息。

但是现在,教务处系统经过修改,302重定向又没有了,只需要正常请求一次就可以获取一个字段的cookie。

实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
zjh = self.get_body_argument('zjh')
mm = self.get_body_argument('mm')
postdata = {
'evalue' : '',
'zjh1' :'',
'zjh' : zjh,
'fs' : '',
'v_yzm' : '',
'lx' : '',
'mm' : mm,
'eflag' : '',
'dzslh' : '',
'tips' : ''
}
# 禁止网页自己进行重定向
r = requests.get('http://211.82.47.7', allow_redirects=False)
# 获取第一个字段的cookie
cookie1 = r.headers['Set-Cookie']
#print(cookie1)
# 重新封装请求头部
head1 = {'Cookie':cookie1}
# 利用封装好的头部,重新请求网页
r1 = requests.get(r.url, headers = head1)
# 获取cookie的第二字段
cookie2 = r1.headers['Set-Cookie']
#print(cookie2)
# 拼接cookie字段
cookie = cookie1 + ';' + cookie2
#print(cookie)
head = { #封装新的请求头部
'Proxy-Connection':'keep-alive',
'Content-Length': '75',
'Cache-Control': 'max-age=0',
'Origin': 'http://211.82.47.7',
'Upgrade-Insecure-Requests': '1',
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Referer': 'http://211.82.47.7/',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cookie': cookie
}
# 利用获取的cookie成功实现了登录
res = requests.post('http://211.82.47.7/loginAction.do', data = postdata, headers=head)
res.close()
坚持原创技术分享,您的支持将鼓励我继续创作!