requests库使用:通过cookie跳过验证码登录,并用Session跨请求保持cookie
拿我平时测试的一个系统为例,从UI层面来说必须先登录才可以进行后续操作,但是我在测试接口文档提供的接口时,发现并不需要登录,每个接口只要传参就可以正常返回。原因是我们这边专门弄了一个接口包来统一管理常用的接口,也方便其他程序调用。所以我之前在测试接口时还没有考虑过“要保持登录(会话)状态”这个问题。趁周末看了下这个问题,通过fiddler直接抓请求(不用接口包提供的接口),学习requests库是如何保持一个会话的。
1.查看登录前后的cookie变化
首先打开登录页面,刷新一下,fiddler会抓到一个请求(应该是登录接口),查看Inspectorstab中的Raw,可以看到请求头的详细信息

然后输入用户名、密码、验证码登录,查看登录后的请求头信息

登录前、登录后的cookie发生了变化。
也可以通过Chrome浏览器来查看cookie,如下

可以看到浏览器中显示的cookie值和fiddler抓到请求中的cookie值不一致,浏览器显示的是全部的cookie,而fiddler只是显示的某个请求的cookie(每个请求的cookie会有所不同);(我拿的是浏览器中的cookie)
如果要跳过验证码登录并保持登录状态(即保持一个会话),只需要提取登录后的cookie,并把它添加到一个requests库的Session对象即可;
2.添加cookie有2种方式:
一个是把cookie先写成字典形式,然后把字典转换为cookiejar
s = requests.Session() # 开启一个会话Session
cookie_dict={'49BAC005-7D5B-4231-8CEA-16939BEACD67': 'cktest001', # 从chrome浏览器中取到的cookie值
'JSESSIONID':'F4FFF69B8XXXXXXC8DCB4C061C0',
'JSESSIONIDSSO':'9D49C76FD6XXXXXF294242B44A'
}
s.cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True) # 把cookie值转换为cookiejar类型,然后传给Session 注意:这个方法会替换掉原有的cookies
二是追加cookies
s = requests.Session() # 开启一个会话Session
jar = requests.cookies.RequestsCookieJar() # 创建一个Cookie Jar对象
jar.set('49BAC005-7D5B-4231-8CEA-1XXXXBEACD67','cktXXXX001') # 向Cookie Jar对象中添加cookie值
jar.set('JSESSIONID','F4FFF69B8CXXXX80F0C8DCB4C061C0')
jar.set('JSESSIONIDSSO','9D49C7XXXX448FDF5B0F294242B44A')
s.cookies.update(jar) # 把cookies追加到Session中
3.完整业务流程:登录并录入一条咨询
页面功能如下,提交后数据库中便会多出一条数据

把登录后的cookie传入session后,调用提交接口即可(如果不加登陆后cookie,直接调用提交接口会提示未登录)
# coding:utf-8 import requests
url = 'http://localhost.:8088/XXX/index/toIndex.do' # 登录接口
header = { # 请求头,建议一定要写上,不写的话直接调用接口,会提示没有权限,可以直接从fiddler复制
"Host":"localhost.:8088",
"Connection":"keep-alive",
"Cache-Control":"max-age=0",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Upgrade-Insecure-Requests":"",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36",
"Referer":"http://localhost.:8088/XXX/index/toIndex.do",
"Accept-Encoding":"gzip, deflate, sdch",
"Accept-Language":"zh-CN,zh;q=0.8"
} s = requests.Session() # 开启一个会话Session # cookie_dict={'49BAC005-7D5B-4231-8CEA-16XXXXEACD67': 'ckXeXX001',
# 'JSESSIONID':'F4FFF69B8XXXX0F0C8DCB4C061C0',
# 'JSESSIONIDSSO':'9D49XXXX448FDF5B0F294242B44A'
# }
# s.cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
# print(s.cookies) jar = requests.cookies.RequestsCookieJar() # 创建一个Cookie Jar对象
jar.set('49BAC005-7D5B-4231-8CEA-1XXX39XEACD67','ckXXXX001') # 向Cookie Jar对象中添加cookie值
jar.set('JSESSIONID','F4FFF69BXXXX0F0C8DCB4C061C0')
jar.set('JSESSIONIDSSO','9D49C76FDXXXXF5B0F294242B44A')
s.cookies.update(jar) # 把cookies追加到Session中 #r1 = s.get(url, headers=header, verify=False) # 使用session发送登录请求
print(s.cookies)
# print(r1.text)
url2 = 'http://localhost:8088/XXX/saveConsult.do' # 提交咨询信息接口,通过fiddler抓取的
header2 = {
"Host":"localhost.:8088",
"Connection":"keep-alive",
"Content-Length":"",
"Accept":"application/json, text/javascript, */*; q=0.01",
"Origin":"http://localhost.:8088",
"X-Requested-With":"XMLHttpRequest",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36",
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
"Referer":"http://localhost.:8088/XXX/toConsultEdit.do",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.8"
}
data = {
'clientCode': 'test',
'topic': 'topic_test',
'content': '测试接口',
'resrcType': ''
}
r2 = s.post(url2, headers=header2, data=data, verify=False) # 使用session发送提交咨询请求 # verify=False表示忽略验证SSL证书
print(r2.text)
print(r2.status_code)
返回结果

数据库也对应地增加了一条数据

注意:在调用接口时,最好连请求头信息也一并传进去,不然有时候会请求失败,我这里如果不加headers的话,会返回403,提示无权限(唉,因为没经验,所以第一次没传headers,结果总是失败,以为是没有登录成功呢,后来直接在fiddler的Composer那里模拟这个请求,才发现这个问题)

还有一个问题是,其实只要把登录后的cookies传入session,然后用这个session发送提交咨询请求即可,无需再发送登录请求了(上面登录只是为了验证是否登录成功)
2018-04-22 17:21:18
requests库使用:通过cookie跳过验证码登录,并用Session跨请求保持cookie的更多相关文章
- jmeter跳过验证码登录配置:通过手动添加 Cookie 跳过带验证码的登录接口
目录 一.基本配置 二.HTTP请求默认值 三.HTTP信息头管理器 四.HTTP Cookie管理器 五.线程组下接口设置 一.基本配置 二.HTTP请求默认值 (1)jmeter的设置: (2)设 ...
- 自动化测试使用cookie跳过验证码
准备工具: fiddler Python+selenium 安装fidder fidder官方下载地址 fidder首次安装需要设置才能抓取https参考如下 fidder设置抓取https 开始 1 ...
- Vue router拦截 如果用户并未登录直接跳转到登录界面(最简单的cookie演示)
router.beforeEach(function(to,from,next){ console.log('路由拦截') console.log(to.name) console.log(from. ...
- Jmeter获取Cookie并传递到下一个线程---跨线程后cookie找不到了
网上找了一堆文章没有一个是实际操作的,自己边试边查边摸索终于找到了一个全套的办法. 原创文章,转载请说明出处. 1.取得cookie 直接这样写就可以了${COOKIE_JSESSIONID},当然具 ...
- 《selenium2 python 自动化测试实战》(12)——跳过验证码登录add_cookie
微信公众号搜索“自动化测试实战”或扫描下方二维码添加关注~~~
- 自动化测试 -- 通过Cookie跳过登录验证码
之前写过一篇博客:自动化测试如何解决验证码的问题. http://www.cnblogs.com/fnng/p/3606934.html 介绍了验证码的几种处理方式,最后一种就是通过Cookie跳转过 ...
- Cookie跳转登录验证码
对于web应用来说,大部分的系统在用户登录时都要求用户输入验证码,验证码的类型的很多,有字母数字的,有汉字的,甚至还要用户输入一条算术题的答案的, 对于系统来说使用验证码可以有效果的防止采用机器猜测方 ...
- Requests方法 -- cookie绕过验证码登录操作
前言有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接).获取不到也没关系,可以通过添加 cookie 的方式绕过验证码. 1.这里以登录博 ...
- Requests 库的使用
Python 的标准库 urllib 提供了大部分 HTTP 功能,但使用起来较繁琐.通常,我们会使用另外一个优秀的第三方库:Requests,它的标语是:Requests: HTTP for Hum ...
随机推荐
- opencv学习之路(6)、鼠标截图,滑动条播放视频
一.鼠标截图 #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespa ...
- 20145308 《网络对抗》 MAL_后门应用与实践 学习总结
20145308 <网络对抗> MAL_后门应用与实践 学习总结 实践目的 使用nc实现win和Linux间的后门连接 meterpreter的应用 MSF POST的应用 知识点学习总结 ...
- 2018年湘潭大学程序设计竞赛G又见斐波那契
链接:https://www.nowcoder.com/acm/contest/105/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- Python中的对象行为与特殊方法(一)对象的创建与销毁
Python中类调用__new__()类方法来创建实例,调用__init__()方法来初始化对象,对象的销毁则调用__del__()方法. __new__()方法第一个参数为类cls,通常返回cls的 ...
- 让InstallShield 2015 Limited Edition for Visual Studio 2015生成的setup.exe双击时以管理员权限运行
转载:http://blog.csdn.net/zztoll/article/details/52096700 如题,如何让InstallShield 2015 Limited Edition for ...
- shell脚本之 给PNG图片添加后缀@3x
1,给png图片加上后缀@3x #!/bin/sh #root_src=$(dirname $(PWD)) #echo ${root_src} image_path=${root_src}/image ...
- MD5+salt 工具类
import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.securit ...
- it做形式主语的句子
1. it was considerate of you to visit my mother every day and (to) bring me your notes to help me wi ...
- lvs笔记
LVS是Linux Virtual Server的简写,意为Linux虚拟服务器,是虚拟的服务器集群系统,可在UNIX/LINUX平台下实现负载均衡集群功能.该项目在1998年5月由章文嵩博士组织成立 ...
- JDBC编程的步骤
一.进行JDBC编程的步骤大致如下: 1. 加载数据库驱动,通常使用Class类的forName()静态方法来加载驱动.如下代码: Class.forName(dirvirClass) 上面 ...