Python3使用Selenium获取session和token方法详解


Posted in Python onFebruary 16, 2021

一、背景说明

之前写了一款简单的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版本与浏览器版本对应要求。

Firefox驱动下载地址:https://github.com/mozilla/geckodriver/releases

Chrome驱动下载地址:http://chromedriver.chromium.org/downloads

Safari驱动下载地址:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

Edge驱动下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

2.2 安装selenium

pip install selenium

三、程序实现

3.1 系统状况

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

Python3使用Selenium获取session和token方法详解

3.2 实现代码

import json
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

class GetSessionAndToken():
  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()

  # 登录系统,具体到自己系统时需要自行修改
  def login_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
  def get_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}")
    return sessionid

  # 获取token
  def get_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}")
    return token

  def __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 实现效果

Python3使用Selenium获取session和token方法详解

更多关于Python获取session和token方法请查看下面的相关链接

Python 相关文章推荐
Python查询阿里巴巴关键字排名的方法
Jul 08 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 Python
Python实现视频下载功能
Mar 14 Python
Python文件的读写和异常代码示例
Oct 31 Python
Python简单读取json文件功能示例
Nov 30 Python
Python开发最牛逼的IDE——pycharm
Aug 01 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
Jan 15 Python
Linux下远程连接Jupyter+pyspark部署教程
Jun 21 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
pandas 如何分割字符的实现方法
Jul 29 Python
关于Numpy中的行向量和列向量详解
Nov 30 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
Feb 16 #Python
PyCharm+Miniconda3安装配置教程详解
Feb 16 #Python
Python3+Django get/post请求实现教程详解
Feb 16 #Python
Python3+Flask安装使用教程详解
Feb 16 #Python
Python基于爬虫实现全网搜索并下载音乐
Feb 14 #Python
Python LMDB库的使用示例
Feb 14 #Python
python 装饰器重要在哪
Feb 14 #Python
You might like
PHP延迟静态绑定示例分享
2014/06/22 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
php中ob_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
简单理解JavaScript中的封装与继承特性
2016/03/19 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
2017/03/08 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
2020/04/21 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python运算符重载详解及实例代码
2017/03/07 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
Python 统计字数的思路详解
2018/05/08 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
python图形工具turtle绘制国际象棋棋盘
2019/05/23 Python
python简单区块链模拟详解
2019/07/03 Python
python实现电子词典
2020/03/03 Python
中文系师范生自荐信
2013/10/01 职场文书
装潢设计专业推荐信模板
2013/11/26 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
北京爱情故事观后感
2015/06/12 职场文书
团结友爱主题班会
2015/08/13 职场文书
python实现图片批量压缩
2021/04/24 Python
Django操作cookie的实现
2021/05/26 Python
解决SpringCloud Feign传对象参数调用失败的问题
2021/06/23 Java/Android
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers
netty 实现tomcat的示例代码
2022/06/05 Servers