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编写简单爬虫资料汇总
Mar 22 Python
转换科学计数法的数值字符串为decimal类型的方法
Jul 16 Python
Win8下python3.5.1安装教程
Jul 29 Python
对pycharm 修改程序运行所需内存详解
Dec 03 Python
使用Pandas对数据进行筛选和排序的实现
Jul 29 Python
python线程安全及多进程多线程实现方法详解
Sep 27 Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 Python
Python基于Socket实现简单聊天室
Feb 17 Python
在python里使用await关键字来等另外一个协程的实例
May 04 Python
django rest framework 过滤时间操作
Jul 12 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
Sep 14 Python
图神经网络GNN算法
May 11 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
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
php开发文档 会员收费1期
2012/08/14 PHP
PHP判断图片格式的七种方法小结
2013/06/03 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
2013/02/16 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
英国标志性奢侈品牌:Burberry
2016/07/28 全球购物
小学教师管理制度
2014/01/18 职场文书
护理实习生带教计划
2015/01/16 职场文书
总账会计岗位职责
2015/04/02 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
Python 数据科学 Matplotlib图库详解
2021/07/07 Python
python神经网络Xception模型
2022/05/06 Python
JS实现简单九宫格抽奖
2022/06/28 Javascript