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中使用mysql数据库详细介绍
Mar 27 Python
Python去除、替换字符串空格的处理方法
Apr 01 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
Apr 02 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 Python
python使用matplotlib绘制热图
Nov 07 Python
Python零基础入门学习之输入与输出
Apr 03 Python
python logging设置level失败的解决方法
Feb 19 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
Apr 20 Python
通俗讲解python 装饰器
Sep 07 Python
基于Python爬取京东双十一商品价格曲线
Oct 23 Python
基于 Python 实践感知器分类算法
Jan 07 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
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
php 调试利器debug_print_backtrace()
2012/07/23 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python之修改图片像素值的方法
2019/07/03 Python
Django Rest framework三种分页方式详解
2019/07/26 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
Keras自定义IOU方式
2020/06/10 Python
爱游人:Travelliker
2017/09/05 全球购物
彼得罗夫美国官网:Peter Thomas Roth美国(青瓜面膜)
2017/11/05 全球购物
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
工程造价管理专业大专生求职信
2013/10/06 职场文书
毕业生在校学习的自我评价分享
2013/10/08 职场文书
企业总经理岗位职责
2014/02/13 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
个人年度总结报告
2015/03/09 职场文书
地道战观后感2000字
2015/06/04 职场文书
导游词之南京栖霞山
2019/10/18 职场文书
Golang表示枚举类型的详细讲解
2021/09/04 Golang
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技