Lengxiy 发表于 2024-6-21 14:29

学习通DrissionPage模拟登录及获取课程分析(一)

本帖最后由 Lengxiy 于 2024-6-21 14:39 编辑

前言
DrissionPage官网简介
官网地址:https://drissionpage.cn/
官网里面也有一些简单的案例分析,有兴趣的也可以自行体会着用


用DrissionPage的缘由
之前书写过一篇智慧职教教师自动批作业一些相关python代码示例以及简单的分析做参考
这个文章,我用的是selenium,request这两个库为主
实际上我不太会分析加解密,所以一般用模拟浏览器登录的比较多
但是用下来发现前面提到的两个库极其的繁琐以及不太好用,直到有位热心人@HalaTest在评论区跟我说了一声试试看用DrissionPage后,发现还有这个好玩的东西后,效率逐渐提升了很多


案例介绍
此次的案例的话,主要是模拟输入账号密码自动登录,不涉及到相关的加解密,主要是围绕着数据包以及浏览器界面的元素定位分析
在自动登录完成后进入”阅读“章节,进行模拟性质的挂机刷阅读分(后续写一篇新的贴子介绍)

正文
模拟登录分析
登录地址:学习通登陆地址

在登录地址页面的话,直接分析【账号】【密码】【登录】按钮
接下来打开浏览器的F12
先定位到【账号】

分析后可以发现元素内容如下
<input type="text" class="ipt-tel" placeholder="手机号/超星号" id="phone" maxlength="30">
其中账号里面有一个id="phone"后续会用得到,这里记录一下
定位到【密码】

分析后可以发现元素内容如下
<input type="password" class="ipt-pwd" placeholder="学习通密码" id="pwd" maxlength="20">
其中账号里面有一个id="pwd"后续会用得到,这里记录一下
定位到【登录】

分析后可以发现元素内容如下
<button type="button" class="btn-big-blue margin-btm24" id="loginBtn">登录</button>
其中账号里面有一个id="loginBtn"后续会用得到,这里记录一下
我们在获取到了必要的信息后,就可以直接模拟登录了,不需要考虑其他的
下面开始奉上代码

from DrissionPage import WebPage,ChromiumOptions

# 创建配置对象
co = ChromiumOptions()
#匿名模式
co.incognito()
page = WebPage(chromium_options = co)
page.change_mode('d')

uname = str(input("请输入你的账号:"))
pwd = str(input("请输入你的密码:"))

#登录部分
login_url = "https://passport2.chaoxing.com/login?fid=&newversion=true&refer=https%3A%2F%2Fi.chaoxing.com"
page.get(login_url)
page.ele('#phone').input(uname)
page.ele('#pwd').input(pwd)
page.ele('#loginBtn').click()
page.listen.start("i.chaoxing.com/base")#自动监听地址为:i.chaoxing.com/base的数据包
#点击课程按钮
page.ele('@name=课程').click()


简单解释一下

# 创建配置对象
co = ChromiumOptions()
#匿名模式
co.incognito()
page = WebPage(chromium_options = co)
page.change_mode('d')

这一串代码的话主要是创建了一个无痕迹访问的浏览器
这样子便于后面不断测试的过程中不会因为第一次已登录而保留cookies等信息,确保运行完成后清除掉登录缓存数据
具体配置相关信息可以在官网进行搜索,这里就不赘述了

下面这部分代码的话则是更好理解了
其中DrissionPage里面有个功能强大且简便的地方就在于查找元素方法ele()
它支持多种方式查找可以参考下图,我这里用了page.ele('#phone')此类方法就是通过id查找对应的位置
不只是通过id,他还能根据class,css,以及元素内包裹的文本元素进行查找,详情可以翻阅一下官网文档,后续也会用到部分功能


uname = str(input("请输入你的账号:"))
pwd = str(input("请输入你的密码:"))

#登录部分
login_url = "https://passport2.chaoxing.com/login?fid=&newversion=true&refer=https%3A%2F%2Fi.chaoxing.com"
page.get(login_url)
page.ele('#phone').input(uname)
page.ele('#pwd').input(pwd)
page.ele('#loginBtn').click()
page.listen.start("i.chaoxing.com/base")#自动监听地址为:i.chaoxing.com/base的数据包
#点击课程按钮
page.ele('@name=课程').click()

上面的程序还有一段page.listen.start("i.chaoxing.com/base")这个,就如注释的意思一样
他会自动监听数据包对应的地址,而这个地址的话,则是后面我们提取数据包里面的UID所需要用到的

提取课程
承接上面最后一行代码,登陆完成后点击了课程按钮,进入到了课程页面
检查元素可以看到,课程界面id为courseList,这样的话,我们可以通过ele进行id定位,再利用children()方法将该元素下的内容全部提取出来传递给courseList


而UID方面,则是利用前面设置的数据包监听,通过page.listen.wait方法进行获取数据包,由于该数据包存在于cookies内,我就通过res.request.cookies的方式进行提取



#提取课程
courseList = page.ele('#courseList').children()

#获取UID
res = page.listen.wait(timeout = 10)
cookie_s = res.request.cookies
for i in cookie_s:
    if i['name'] == "UID":
      uid = i['value']

#获取必要的后续可能用得到的参数
courseids = []
clazzids = []
personids = []
c_ids = []
c_names = []
for i in courseList:
    courseids.append(i.attrs["courseid"])
    clazzids.append(i.attrs["clazzid"])
    personids.append(i.attrs["personid"])
    c_ids.append("course_" + i.attrs["courseid"] + "_" + i.attrs["clazzid"])

    t = i.ele("tag:span@class=course-name overHidden2")
    c_names.append(t.attrs['title'])

print("**********获取到如下课程**********")
for i in c_names:
    print(f"第{x+1}个课程:{i}")
    x = x + 1

choose = int(input("请选择你要刷第几个课程:"))

可能会有疑惑i.attrs方法,这其实是直接提取了元素里面的属性值,毕竟加载完后,属性值都在元素里面了,这一点我觉得就是这个包好用的地方(主要是用多少其他包,也可能能有更好的包)

至此我们其实就已经提取完成了所有的课程至不同的变量里面,以及已经获取了必要的参数了
从登录到获取参数,没有涉及到加解密问题,只对网页页面以及数据包进行了简单的分析


奉上完整的部分源代码
from DrissionPage import WebPage,ChromiumOptions


# 创建配置对象(默认从 ini 文件中读取配置)
uid = ""
co = ChromiumOptions()
#匿名模式
co.incognito()
page = WebPage(chromium_options = co)
page.change_mode('d')

uname = str(input("请输入你的账号:"))
pwd = str(input("请输入你的密码:"))

#登录部分
login_url = "https://passport2.chaoxing.com/login?fid=&newversion=true&refer=https%3A%2F%2Fi.chaoxing.com"
page.get(login_url)
page.ele('#phone').input(uname)
page.ele('#pwd').input(pwd)
page.ele('#loginBtn').click()
page.listen.start("i.chaoxing.com/base")
#点击课程按钮
page.ele('@name=课程').click()

#提取课程
courseList = page.ele('#courseList').children()

#获取UID
res = page.listen.wait(timeout = 10)
cookie_s = res.request.cookies
for i in cookie_s:
    if i['name'] == "UID":
      uid = i['value']

#获取必要的后续可能用得到的参数
courseids = []
clazzids = []
personids = []
c_ids = []
c_names = []
for i in courseList:
    courseids.append(i.attrs["courseid"])
    clazzids.append(i.attrs["clazzid"])
    personids.append(i.attrs["personid"])
    c_ids.append("course_" + i.attrs["courseid"] + "_" + i.attrs["clazzid"])

    t = i.ele("tag:span@class=course-name overHidden2")
    c_names.append(t.attrs['title'])

print("**********获取到如下课程**********")
for i in c_names:
    print(f"第{x+1}个课程:{i}")
    x = x + 1

choose = int(input("请选择你要刷第几个课程:"))

Scan 发表于 2024-6-21 20:21

有点落后了,我掌握最新的技术是青龙面板自动开刷

xixicoco 发表于 2024-6-21 23:11

这个有点意思哈,不分析协议了,都是模拟点击

Lengxiy 发表于 2024-6-22 17:03

本帖最后由 Lengxiy 于 2024-6-22 17:06 编辑

Scan 发表于 2024-6-21 20:21
有点落后了,我掌握最新的技术是青龙面板自动开刷
给信息略微闭塞的人,以及准备读大学的看看

Scan 发表于 2024-6-22 18:32

Lengxiy 发表于 2024-6-22 17:03
给信息略微闭塞的人,以及准备读大学的看看

用redis存储账户数据、模拟点击跟你差不多

GVOPwZWhL2IFcIZ 发表于 2024-6-25 20:32

学习了。谢谢楼主

EUV996 发表于 2024-6-27 22:04

好像懂了,又好像没懂

Lengxiy 发表于 2024-6-28 08:45

EUV996 发表于 2024-6-27 22:04
好像懂了,又好像没懂

try一下就知道了,可以跟着教程步骤来,如果不懂的话可以在这里ask一下

tt9087 发表于 2024-7-9 10:36

:Dweeqw虽然有新技术了,但还是可以学习学习的

xiyuanla 发表于 2024-7-9 14:48

Scan 发表于 2024-6-21 20:21
有点落后了,我掌握最新的技术是青龙面板自动开刷

可以合作吗 我这边有大量学习通订单
页: [1] 2
查看完整版本: 学习通DrissionPage模拟登录及获取课程分析(一)