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

posted on   水中雨  阅读(9544)  评论(1编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示