python3 requests session_Python3+Selenium获取session和token供Requests使用教程

本文围绕api模糊测试工具改造展开,因系统认证方式改变需获取session和token。介绍了手动提取、requests发包登录、selenium登录三种方法,重点讲解用selenium登录获取的方式,包括环境搭建和程序实现,给出了获取session和token的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景说明

之前写了一款简单的api模糊测试工具,之前系统可以使用http Base认证现在改成session形式并加上了token。

最简单的改造方法,是自己先在浏览器手动登录,然后提取出session和token(系统token在整个会话期间可重复使用)填到模糊测试工具中即可。但这种非全自动化的方式不到万不得已不想用。

最直接的方法,最使用requests按登录流程依次发包登录即可。但其中的难点是密码是加密提交的,询问开发人员说是DES加密;DES加密不难,但是用不同的语言编写的加密算法与别人的结果完全一致那就比较费工夫。

最后的方法,那就是使用selenium登录避开密码的构造,这种方法的关键点在于:selenium是基于图形界面操作的,没有直接的办法能获取request和response的数据包,在这种情况下如何获取session和token。

自己动web前端的存储并没有很深入了解,一直想的是如何获取selenium request和response的数据包从中提取session和token,直到看到这篇文章才想起前端的变量(尤其是restful中的全局变量)会放存localStorage和sessionStorage中,从中提取session和token即可。

二、环境搭建

2.1 下载驱动

下载驱动文件,放到后续python文件同级目录下或加入到环境变量中即可。其中Chrome驱动要注意Driver版本与浏览器版本对应要求。

2.2 安装selenium

pip install selenium

三、程序实现

3.1 系统状况

手动登录系统后,查看存储状况如下图所示,sessionid和token分别存储在sessionStorage的sessionId和token两个变量中

3.2 实现代码

importjsonimporttimefrom selenium importwebdriverfrom selenium.webdriver.support.wait importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions as ECfrom selenium.webdriver.common.by importByclassGetSessionAndToken():def __init__(self):#启用无头模式,可选

browser_options =webdriver.FirefoxOptions()

browser_options.add_argument('--headless')

browser_options.add_argument('--disable-gpu')

self.browser= webdriver.Firefox(firefox_options=browser_options)#self.browser = webdriver.Chrome()

#登录系统,具体到自己系统时需要自行修改

deflogin_system(self):#登录用户名密码,改成目标系统用户名密码

username = "admin"password= "123456"

#登录页面url,改成目标系统登录页面

url = "https://10.10.6.93/#login"self.browser.get(url)#显性等待,直到用户名控件加载出来才进行下一步

WebDriverWait(self.browser,20,0.5).until(EC.presence_of_element_located((By.ID,"txtUserName")))#填写用户名

self.browser.find_element_by_id("txtUserName").send_keys(username)#填写密码

self.browser.find_element_by_id("txtPassword").send_keys(password)#点击登录

self.browser.find_element_by_id("btnLogin").click()#强制等待5秒,待session和token都成功返回并存到浏览器中

#restful隐性等待不太好用?self.browser.implicitly_wait(5)

time.sleep(5)#获取sessionid

defget_sessionid(self):#是要从localStorage中获取还是要从sessionStorage中获取,具体看目标系统存到哪个中

#window.sessionStorage和直接写sessionStorage是等效的

#一定要使用return,不然获取到的一直是None

#get的Item不一定就叫sessionId,得具体看目标系统把sessionid存到哪个变量中

sessionid = self.browser.execute_script('return sessionStorage.getItem("sessionId");')#另外sessionid一般都直接通过返回Set-Cookies头设置到Cookie中,所以也可以从Cookie读取

#获取浏览器所有Set-Cookie,返回对象是字典列表

#cookies = self.browser.get_cookies()

#获取单项Cookie,是不是叫sessionId取决于系统存成什么变量,单项Cookie是字典

#cookie = self.browser.get_cookie("sessionId")

#cookie = cookie["value"]

#print(f"{cookies}")

returnsessionid#获取token

defget_token(self):#是要从localStorage中获取还是要从sessionStorage中获取,具体看目标系统存到哪个中

#window.sessionStorage和直接写sessionStorage是等效的

#一定要使用return,不然获取到的一直是None

#get的Item不一定就叫token,得具体看目标系统把token存到哪个变量中

token = self.browser.execute_script('return sessionStorage.getItem("token");')#print(f"{token}")

returntokendef __del__(self):#退出程序时关闭浏览器

self.browser.close()if __name__ == "__main__":

obj=GetSessionAndToken()

obj.login_system()

sessionid=obj.get_sessionid()

token=obj.get_token()print(f"sessionid为: {sessionid}\n"f"token为: {token}")

3.3 实现效果

参考:

<think>好的,我现在需要解决用户的问题,即如何使用Pythonrequests库从网页中提取CSRF令牌。首先,我得回忆一下CSRF令牌的作用常见的位置。CSRF令牌通常用于防止跨站请求伪造攻击,一般会放在HTML的meta标签里,或者表单的隐藏字段中。 用户提到使用requests库,所以首先需要用requests发送GET请求获取页面内容。接下来需要解析返回的HTML内容,提取CSRF令牌。这里解析HTML的话,常用的库有BeautifulSoup或者lxml。用户的问题中没有指定用哪个,但之前提到的引用里有用到soup.select_one,所以可能用BeautifulSoup比较合适。 步骤大概是这样:发送GET请求获取页面,然后用BeautifulSoup解析页面,查找meta标签或者input字段中的CSRF令牌。例如,meta标签可能像<meta name="csrf-token" content="token">,这时候可以用soup.find或者select_one来定位这个元素,然后获取content属性。 不过需要注意,不同的网站可能将CSRF令牌放在不同的地方,比如有些可能在表单里的隐藏输入字段,比如<input type="hidden" name="csrf_token" value="...">。这时候可能需要查找对应的input标签。 然后,用户可能需要将这个令牌添加到后续的POST请求中,比如作为表单数据的一部分,或者放在请求头里。比如引用中的例子,有的放在表单数据里,有的放在请求头的X-CSRFToken字段。这取决于目标网站的具体要求。 另外,还要注意会话管理,可能需要使用requests.Session来保持会话,这样在GET请求后,cookies会被自动保存,后续POST请求中会携带这些cookies,避免因为缺少cookies导致的问题。比如引用3中提到的,第一次用GET获取令牌,然后在POST中带上。 总结一下步骤: 1. 使用requests的GET方法获取页面。 2. 解析HTML,找到CSRF令牌的位置,可能是meta标签或input字段。 3. 提取令牌内容。 4. 在后续请求中携带该令牌,比如在表单数据或请求头中。 同时要处理可能的异常,比如标签不存在的情况,或者请求失败的情况。此外,确保会话的持续性,使用Session对象。 现在,根据这些思考,组织一个清晰的步骤说明,并给出代码示例。确保代码正确使用requestsBeautifulSoup,并处理不同的令牌位置。同时,参考用户提的引用内容,比如引用2中的代码示例,使用soup.select_one来获取meta标签的content属性。 最后,生成相关问题,可能需要涉及如何保持会话、处理不同位置的令牌,或者处理动态加载的内容等问题。</think>要使用Python的`requests`库提取网页中的CSRF令牌,需通过以下步骤实现: --- ### **步骤说明** 1. **发送GET请求** 使用`requests`库发送GET请求,获取目标页面内容。若涉及会话(如登录),需使用`requests.Session()`保持会话状态。 ```python import requests from bs4 import BeautifulSoup session = requests.Session() response = session.get(&#39;https://example.com/login&#39;) ``` 2. **解析HTML并定位CSRF令牌** CSRF令牌通常以以下两种形式存在: - **Meta标签**:例如`<meta name="csrf-token" content="TOKEN_VALUE">` - **表单隐藏字段**:例如`<input type="hidden" name="csrf_token" value="TOKEN_VALUE">` 使用`BeautifulSoup`解析页面并提取令牌: ```python soup = BeautifulSoup(response.text, &#39;html.parser&#39;) # 从Meta标签提取(常见于Django等框架) csrf_token = soup.select_one(&#39;meta[name="csrf-token"]&#39;)[&#39;content&#39;] # 或从表单字段提取(适用于传统表单提交) # csrf_token = soup.select_one(&#39;input[name="csrf_token"]&#39;)[&#39;value&#39;] ``` 3. **将令牌加入后续请求** 提取后需将令牌添加到POST请求的**表单数据**或**请求头**中: - **表单数据**: ```python data = { &#39;username&#39;: &#39;user&#39;, &#39;password&#39;: &#39;pass&#39;, &#39;csrf_token&#39;: csrf_token } response = session.post(&#39;https://example.com/login&#39;, data=data) ``` - **请求头**(部分框架要求): ```python headers = {&#39;X-CSRFToken&#39;: csrf_token} response = session.post(&#39;https://example.com/api&#39;, headers=headers, json={}) ``` --- ### **完整代码示例** ```python import requests from bs4 import BeautifulSoup # 创建会话并获取页面 session = requests.Session() response = session.get(&#39;https://example.com/login&#39;) # 解析CSRF令牌 soup = BeautifulSoup(response.text, &#39;html.parser&#39;) csrf_token = soup.select_one(&#39;meta[name="csrf-token"]&#39;)[&#39;content&#39;] # 携带令牌发起POST请求(以登录为例) login_data = { &#39;username&#39;: &#39;user&#39;, &#39;password&#39;: &#39;pass&#39;, &#39;csrfmiddlewaretoken&#39;: csrf_token # Django默认表单字段名 } response = session.post(&#39;https://example.com/login&#39;, data=login_data) print("登录成功:", response.status_code) ``` --- ### **注意事项** 1. **会话保持** 使用`requests.Session()`确保Cookies在多次请求间自动传递,避免因会话丢失导致的认证失败[^3]。 2. **字段名称差异** 不同框架的CSRF令牌字段名称可能不同: - Django默认使用`csrfmiddlewaretoken`(表单字段)或`X-CSRFToken`(请求头)[^2] - Laravel可能使用`_token` 3. **动态页面处理** 若页面通过JavaScript动态加载CSRF令牌,需改用`selenium`等工具模拟浏览器行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值