一、抓包分析


首先我们打开浏览器的开发者工具,随便输入一个用户名和密码登录,抓包分析:


显然,我们登录的时候发送了一个POST请求,而Data里面有六个数据,分别是rsa、ul、pl、lt、execution、_eventld。这显然不同于正常的username、password形式,我们逐一对其分析。

1.ul和pl

之前我是随便输的用户名和密码进行登录(用户名和密码都是111),不难看出,ul和pl分别代表用户名和密码的长度。
u = username
p = password
l = length

2.lt、execution和_eventId

我们直接Ctrl+F在网页源代码中搜索execution发现:

显然,这三个参数的值都直接给出来了。

3.rsa

还是直接搜索rsa,有两个结果:

第一个就是上面的图,我们打开第二个:

阅读代码不难发现,rsa的值是通过调用了一个名为strEnc的函数得到,于是我们搜索strEnc:

这个函数位于一个名为des.js的文件中,这个文件只有这一个函数,用处也就是用于计算rsa值。那么函数找到了,我们来分析参数:
(1)u取自un, p取自pd,后两者就是用户名和密码。
(2)lt显然就是之前的lt。
(3)‘1’, ‘2’, ‘3’为固定值。
为了检验我们的结果,我们直接在控制台调用strEnc函数计算:

结果是完全一致的。

二、功能实现

1.主要思路

首先使用GET方法,拿到POST所需的参数,并调用des.js计算rsa值,最后POST登录。

2.获取参数

我们使用session对象记录cookie,使用Xpath获取参数。

import requests
from faker import Factory
from lxml import etreeu = input("请输入用户名:")
p = input("请输入密码:")loginUrl = "http://pass.sdu.edu.cn/cas/login?service=http://bkjws.sdu.edu.cn/f/j_spring_security_thauth_roaming_entry"
headers = {"User-Agent": Factory.create().user_agent()}  #获取一个随机的UA
session = requests.session()
loginPage = session.get(loginUrl, headers = headers)  #先用get获取到lt和execution
loginPageHTML = etree.HTML(loginPage.text)
lt = loginPageHTML.xpath(r'//*[@id="lt"]/@value')[0]  #返回的结果是一个列表,取第一个对象
execution = loginPageHTML.xpath(r'//*[@name="execution"]/@value')[0]
ul = len(u)
pl = len(p)
_eventId = "submit"

3.计算rsa

要想在Python中运行js代码,我们要用到execjs第三方库,安装execjs:

pip install execjs

首先把网页中的des.js文件保存到本地,读取内容:

with open("des.js", "r") as file:desJsCode = file.read()

编译:

import execjsdesJsFunction = execjs.compile(desJsCode)

调用:

desJsFunction.call("strEnc", u + p + lt, "1", "2", "3")

返回结果即为rsa。

4.POST登录

首先编辑Data,这是一个字典:

data = {"rsa":desJsFunction.call("strEnc", u + p + lt, "1", "2", "3"),"ul": ul,"pl": pl,"lt": lt,"execution": execution,"_eventId": _eventId}

POST登录:

r = session.post(loginUrl, headers = headers, data = data)
print(r.text)

根据返回的结果,我们成功登录到了教务系统中。

三、完整源码

import requests
from faker import Factory
from lxml import etree
import execjsloginUrl = "http://pass.sdu.edu.cn/cas/login?service=http://bkjws.sdu.edu.cn/f/j_spring_security_thauth_roaming_entry"
headers = {"User-Agent": Factory.create().user_agent()}  #获取一个随机的UAwith open("des.js", "r") as file:desJsCode = file.read()desJsFunction = execjs.compile(desJsCode)u = input("请输入用户名:")
p = input("请输入密码:")session = requests.session()
loginPage = session.get(loginUrl, headers = headers)  #先用get获取到lt和execution
loginPageHTML = etree.HTML(loginPage.text)
lt = loginPageHTML.xpath(r'//*[@id="lt"]/@value')[0]  #返回的结果是一个列表,取第一个对象
execution = loginPageHTML.xpath(r'//*[@name="execution"]/@value')[0]
ul = len(u)
pl = len(p)
_eventId = "submit"data = {"rsa":desJsFunction.call("strEnc", u + p + lt, "1", "2", "3"),"ul": ul,"pl": pl,"lt": lt,"execution": execution,"_eventId": _eventId}
r = session.post(loginUrl, headers = headers, data = data)
print(r.text)

四、后记

一年前,我使用过先用selenium模拟登录,获取cookie,再登录的方法。但显然,这种方法耗时长而且缺乏美感。相较于前者,使用POST登录无疑更加简洁,但其中仍有不足:
1.使用execjs执行js时,会弹出一个窗口。
2.有时密码输入错误登录失败,没有考虑这种清况。
3.出现验证码的情况。

赠人玫瑰,手有余香。
The roses in her hand,the flavor in mine.
如果这篇文章对你有帮助,希望你能点一个赞!

Python:30行代码,使用POST登录山大的教务处系统(附完整源码)相关推荐

  1. 基于Python opencv实现车牌识别及二维码条形码识别系统 附完整源码

    完整代码:https://download.csdn.net/download/qq_38735017/87416699 原理简介 车牌字符识别使用的算法是 opencv 的 SVM opencv 的 ...

  2. Python:实现hill climbing爬山法用来寻找函数的最大值算法(附完整源码)

    Python:实现hill climbing爬山法用来寻找函数的最大值算法 import mathclass SearchProblem:def __init__(self, x: int, y: i ...

  3. Python:实现一个Pangram字符串至少包含一次所有字母算法(附完整源码)

    Python:实现一个Pangram字符串至少包含一次所有字母算法 def check_pangram(input_str: str = "The quick brown fox jumps ...

  4. 【代码案例】博客页面设计(附完整源码)

    博客页面设计 博客列表页 实现导航栏 实现版心 实现个人信息 实现博客列表 实现博客正文页 引入导航栏.版心.个人信息 实现博客正文 实现博客登录页 引入导航栏 实现版心和登录框 实现博客编辑页 引入 ...

  5. 使用Python获取数字货币价格(附完整源码)

    使用Python获取数字货币价格(附完整源码) 如果你想要及时了解到加密货币的价格变化,你可以使用Python获取数字货币的实时价格.本文将介绍如何使用Python和CoinGecko API获取数字 ...

  6. [智慧农业]Python基于改进YOLOv5的猕猴桃叶病害检测系统(完整源码&数据集&视频教程)

    1.背景 现如今由于农作物病虫害的多样性和复杂性,在特定的条件下其很容易在大范围内发生,导致农产品产量急剧下降.因此,预防和监测农作物病虫害已成为农业生产活动中的重要环节.当前,耕地面积逐渐减少,世界 ...

  7. python opencv人脸识别考勤系统的完整源码

    这篇文章主要介绍了python opencv人脸识别考勤系统的完整源码,本文给大家介绍的非常详细,希望对大家的学习或工作具有一定的参考借鉴价值. 代码如下: import wx import wx.g ...

  8. [附源码]计算机毕业设计Python+uniapp基于android手机设计并实现在线点单系统APPo682z(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于android手机设计并实现在线点单系统APPo682z(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装 ...

  9. Python语言打造智能语音助手——附完整源码

    Python语言打造智能语音助手--附完整源码 随着智能家居.智能办公等领域的逐渐兴起,实现语音控制与交互已成为了一种趋势.而Python语言是一门极具魅力的编程语言,其强大的库.简洁的语法以及易于学 ...

最新文章

  1. 【面经】记一次字节跳动前端面试经历
  2. unipapp 解决无法编译sass_如何解决Vue项目里面没有sassloader依赖包的问题
  3. Java的io类的使用场景
  4. 在StackBlitz项目里直接preview某个component的template
  5. untitled软件怎么用_苹果手机怎么用4G网络于App Store下载超过200MB以上的软件
  6. Manjaro_xfce 安装后配置
  7. 微信们正在成为“被模仿者”!中国互联网现状及趋势报告
  8. 笔记-js高程-第七章 函数表达式
  9. 强制换行的css属性
  10. 贪吃蛇Python版 源码+代码分析
  11. 西电Pintos操作系统课程设计 实验三
  12. 30分钟学会iOS 11开发环境xcode 9图文教程
  13. 视频ToneMapping(HDR转SDR)中的颜色空间转换问题(BT2020转BT709,YCbCr、YUV和RGB)
  14. python 地形图_Python-Evoked地形图可视化
  15. VUE:使用element-ui的el-table时,自定义单元格内容,并tab快速切换指定编辑的单元格,而不是把所有能tab切换的都切换一遍
  16. oracle导入solr,从Oracle数据库导入XML数据时solr dih会变慢
  17. Rstudio(4.0.5 )安装Rtool40
  18. 怎么翻译整篇Excel文档?Excel文档翻译一招搞定
  19. [Golang]Benchmark性能测试
  20. 网络规模推荐系统的图卷积神经网络

热门文章

  1. java计算机毕业设计家装行业门店订单管理系统源码+mysql数据库+系统+lw文档+部署
  2. 计算机图形学基础第二版,计算机图形学基础(第2版)课后习题答案__陆枫.pdf
  3. php去除字符串空格
  4. 美股当红炸子鸡Zoom“不务正业”卖硬件,这背后藏着它什么野心?
  5. 陶瓷电容器的失效分析
  6. python输出语句print i、j、k_Python的打印使用,python,之,print,用法
  7. 易宝支付 下单失败! 失败原因: 业务接口维护中,请您稍候再试!
  8. Vue中封装打印组件包括基本信息、表格用途出库单、入库单、请购单等单据
  9. R安装包失败解决办法
  10. 捷联惯导算法与组合导航原理学习——四元数和姿态阵转换(二)