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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM