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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!