zoukankan      html  css  js  c++  java
  • 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":"1", "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":"89", "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': '0' } 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

  • 相关阅读:
    Webstorm(OnlineSearch2)自定义快捷搜索API文档手册
    cargo设置国内源
    win10安装rust和编译失败的解决办法
    pycharm打开项目找不到根目录的解决办法
    VM虚拟机/Linux上网
    idea启动springboot项目突然特别慢
    (亲测有效)MacPycharm打不开的解决方法
    vue使用webpack打包失败
    使用七牛云上传文件报错incorrect region, please use up-z1.qiniup.com
    Zookeeper3.5及以上启动时8080端口被占用
  • 原文地址:https://www.cnblogs.com/hanmk/p/8907746.html
Copyright © 2011-2022 走看看