Python中Session、Cookies及Token獲取


第一種:利用requests獲取headers

通過requests.session()查看默認配置下的請求頭:

import requests
session = requests.session()
print(session.headers)
#輸出的默認請求頭配置結果為:{'User-Agent': 'python-requests/2.27.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
print(session.headers.items())
#輸出的默認請求頭配置結果為:ItemsView({'User-Agent': 'python-requests/2.27.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'})

包裝請求頭:

#獲取headers中的key
for i in session.headers.keys():
    print(i)
'''
輸出結果為:
User-Agent
Accept-Encoding
Accept
Connection
'''
#獲取headers中values
for i in session.headers.values():
    print(i)
'''
輸出結果為:
python-requests/2.27.1
gzip, deflate
*/*
keep-alive
'''
#輸出headers中的值
session.headers.pop('User-Agent')
for i in session.headers.keys():
    print(i)
'''
輸出結果為:
Accept-Encoding
Accept
Connection
'''
#清除headers中的內容
session.headers.clear()
print(session.headers)

#使用字典更新的方式更新請求頭
headers = {
            'Origin': 'https://***.com',
            'Host': '***.com',
            'Referer': 'https://**.com/',
            'User-Agent': 'Mozilla/5.0',
        }
session.headers.update(headers)
print(session.headers)

#在請求的時候添加headers參數
response = session.get(url, headers=headers)

備注:

兩種方式在response端看到的效果等同,區別在於第一種方式session是永久的,而第二種常用的方式只是在請求的時候攜帶過去。

 

第二種:利用requests獲取cookies

import requests
session = requests.session()
print(session.cookies)   #輸出結果為:<RequestsCookieJar[]>
print(session.cookies.items())   #輸出結果為:[]

def get_Cookies():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4515.159 Safari/537.36'
    }
    url = 'URl請求地址'
    session = requests.session()
    session.post(url,headers=headers)
    cookie = session.cookies
    a = cookie.get_dict()
    return a
print(get_Cookies())  #輸出結果為:{'X_HTTP_TOKEN': '42daf4b72327b2817495839261bf5e71415983ed09', 'user_trace_token': '20210819231227-8e195ef7-7b6c-4e9c-a77c-f806bbb0dd3c'}

有時候用session.cookies獲取不到cookies信息,需要用原始方式獲取cookies:

import json

import requests
def login(self):
    self._session = requests.Session()
    url = "http://cdht-sentinel.bbdservice.com"
    data = {
        "ip": "182.150.28.190",
        "location": "四川省成都市",
        "password": "71b44033d3814ca82c7d079e046d6765",
        "systemState": 2,
        "username": "admin2"
    }
    response = requests.post(url=url,data=json.dumps(data),headers=self._headers)
    ret = json.loads(response.text)
    cookie_str = response.headers.get("Set-Cookie")
    cookie_tuple = cookie_str.split(";")
    for item in cookie_tuple:
        if item.count(",")>=1:
            for item1 in item.split(","):
                key1,value1 = item1.split("=")
                self._cookie[key1]=value1
        else:
            key, value = item.split("=")
            self._cookies[key] = value

    print("登錄成功:",self._cookies)    

python的requests中cookies的獲取和使用:

#處理cookie方法一:用requests.utils.dict_from_cookiejar()把返回的cookies轉換成字典
import requests
def login():
    url = "http://www.xxx.com/login"
    headers = {
        'Content-Tpye':'application/json'
    }
    payload = {
        "username":"111@qq.com",
        "password":"11111"
    }
    try:
        res = requests.post(url,headers=headers,json=payload)
        cookies = res.cookies
        cookie = requests.utils.dict_from_cookiejar(cookies)
        return cookie
    except Exception as err:
        print('獲取cookie失敗:、n{0}'.format(err))

#處理cookie方式二:遍歷cookies的鍵值,拼接成cookie格式
import requests
def login():
    url = "http://www.xxx.com/login"
    headers = {
        'Content-Tpye':'application/json'
    }
    payload = {
        "username":"111@qq.com",
        "password":"11111"
    }
    try:
        res = requests.post(url,headers=headers,json=payload)
        cookies = res.cookies.items()
        cookie = ''
        for name, value in cookies:
            cookie +='{0}={1};'.format(name,value)
        return cookie
    except Exception as err:
        print('獲取cookie失敗:、n{0}'.format(err))

#cookie的使用一
import requests
def get_data():
    cookie=login()
    res = requests.get(url=get_data_url,cookies=cookie)
    print(res.text)
    
#cookie的使用二
import requests
def get_data():
    cookie=login()
    headers = {
        "cookie":cookie
    }
    res = requests.get(url=get_data_url,header = headers)
    print(res.text)

參考鏈接:https://www.cnblogs.com/miaoxiaochao/p/13054450.html

第三種:Python接口請求發送依賴session

requests.method發送請求是不會自動保留cookies信息,那么充值必須需要登錄才可以,所以解決的方式有兩種:

1、手動解決:提取cookies信息,下一個充值接口發送請求時手動傳遞cookies

2、自動保存cookies,用作下一個接口

 

import logging

if __name__ == "__main__":
    import requests
    session = requests.session()
    url = "http://登錄接口地址"
    payloads = {'mobilephone':'15340583307',"pwd":'123'}
    r = requests.session.post(url=url, data=payloads)
    print(r.text)
    cook = r.cookies
    #充值接口:應在登錄后才可充值
    recharge_url = url+"/member/recharge"
    payloads = {'mobilephone':'15340583307','amount':100}
    r = requests.session.post(url=recharge_url,data=payloads,cookies=cook)
    print(r.text)
    print(r.headers)

#針對Session發送請求方法封裝
class SessionRequest(object):
    def __init__(self):
        self.session =requests.session()
    def sendRequest(self,url,method,params=None,data=None,json=None,timeout=10):
        responseResult = None
        new_method = method.lower()
        if new_method == 'get':
            logging.info("正在發送get請求,請求地址:{},請求參數{}".format(url,params))
            responseResult = self.session.get(url=url,params=params,timeout=timeout)
        elif new_method=="post":
            if json:
                logging.info("正在發送請求,請求地址:{},請求參數{}".format(url,json))
                responseResult = self.session.post(url=url,json=json,time=timeout)
            else:
                logging.info("正在發送請求,請求地址:{},請求參數{}".format(url,data))
                responseResult = self.session.post(url=url,data=data,timeout=timeout)
        return responseResult.json()

 

第四種:Python模塊requests測試接口時Session傳遞

在測試接口時需要有些接口登錄后方可操作,這時需要將登錄的session進行傳遞,可以直接獲取登錄后的cookie,也可以使用requests.Session():

方法一:直接獲取登錄的cookie進行傳遞,如下代碼:

import json
import requests
def login():
    url = "接口請求地址"
    logininfo = json.dumps({"username":"admin","userpass":"1111"})
    headers = {'Referer':'afdasdf',
               'X-Requested-with':'XMLHttpRequest',
               'Content-Type':'application/json;charset=UTF-8'}
    rps = requests.post(url=url, data=logininfo,headers=headers)
    print(rps.status_code)
    print(rps.cookies.get_dict())
    return rps.cookies.get_dict()
def getUserInfo():
    url = "接口請求地址2"
    datainfo = json.dumps({"currentPage":1,"pagesize":15,"username":"","userDesc":""})
    headers = {'Referer':'afdasdf',
               'X-Requested-with':'XMLHttpRequest',
               'Content-Type':'application/json;charset=UTF-8'}
    rps = requests.post(url=url,data=datainfo,headers=headers,cookies=login())
    print(rps.status_code)
    print(rps.content)
    print(rps.text)

getUserInfo()
   

方法二:通過方法Session()進行傳遞

import json
import requests
def login():
    url = "接口請求地址"
    logininfo = json.dumps({"username":"admin","userpass":"1111"})
    headers = {'Referer':'afdasdf',
               'X-Requested-with':'XMLHttpRequest',
               'Content-Type':'application/json;charset=UTF-8'}
    s = requests.session()
    rps = s.post(url=url, data=logininfo,headers=headers)
    print(rps.status_code)
    print(rps.cookies.get_dict())
    return s
def getUserInfo():
    url = "接口請求地址2"
    datainfo = json.dumps({"currentPage":1,"pagesize":15,"username":"","userDesc":""})
    headers = {'Referer':'afdasdf',
               'X-Requested-with':'XMLHttpRequest',
               'Content-Type':'application/json;charset=UTF-8'}
    rps = login().post(url=url,data=datainfo,headers=headers)
    print(rps.status_code)
    print(rps.content)
    print(rps.text)

getUserInfo()

二者的優缺點對比如下:

方法一最主要的缺點是當接口用例很多的時候,都需要帶上Login(),那么就意味着每調用一個接口都得必須執行Login()的函數;方法二使用requests的session會話對象來進行處理,會話對象讓你能夠跨請求保持某些參數,它也會在同一個Session實例發出的所有請求之間保持cookie,所以如果你向同一主機發送多個請求,底層的TCP連接將會被重用,從而帶來顯著的性能提升。

另一種封裝方式見鏈接:https://www.cnblogs.com/shuishan-runner/p/14845277.html


免責聲明!

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



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