【python】让世界再无刷的课

本次介绍的是一个公共课的学习网站,通过requests库模拟用户发出的请求达到课程的迅速观看。

打开浏览器控制台进入目标网站尝试登陆发现
pFgYmmF.png
发现网站没有对密码进行加密cookie无明显变化直接使用以下代码保存cookie

import requests
requests = requests.session()

登陆后查看课程,在控制台搜索开始学习

pFgYuTJ.png
pFgYnw4.png

发现前方有个href标签包含地址,其中id和cid这两个参数很重要(后面会用到)点开始学习后会进入到课程页面

pFgY3Sx.png

打开F12控制台找到对应链接,我们会发现所有的视频链接都是以这中形式存在。其中有参数id,sid,mid,courseclassid,以及chapterid。

pFgYZOU.md.png

然后我们点击视频,进入视频页面

pF2GrYn.md.png

打开F12控制台,随着视频的观看发现请求了一个网址

pFgYQYR.md.png

pFgYMk9.md.png

不难发现其中的参数和上面id,sid,mid,courseclassid,以及chapterid对应。响应的值为

pFgYlf1.png

写出代码

headers = {
 'authority': 'wrggk.whvcse.edu.cn',
 'accept': '*/*',
 'accept-language': 'zh-CN,zh;q=0.9',
 # 'content-length': '0',
 'origin': 'https://wrggk.whvcse.edu.cn',
 'referer': 'https://wrggk.whvcse.edu.cn/Viewer/CoursePlay.aspx?class=0&id=1080&sid=14210&mid=63365&courseClassId=831&chapterId=14203',
 'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
 'sec-ch-ua-mobile': '?0',
 'sec-ch-ua-platform': '"Windows"',
 'sec-fetch-dest': 'empty',
 'sec-fetch-mode': 'cors',
 'sec-fetch-site': 'same-origin',
 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
 'x-requested-with': 'XMLHttpRequest',
}
params = {
 'cpid': '63365',
 'bjtime': '59.978762',
 'courseid': '1080',
 'stepid': '63365 ',
 'courseClassId': '831',
 't': '60',
}

response = requests.post('https://wrggk.whvcse.edu.cn/Viewer/timetop.aspx', params=params, headers=headers)

结果:成功

接下来我们分析网课的考试部分:

找到考试地址

​ 进入课程页面找到试卷的url链接,提取网址中的参数(id,sid,courseClassId,chapterId,pid)

pF2hPg0.png

找到查看答案页面

点击考试链接发现查看答案链接(由于本人已经测试完成,显示的是查看答案的链接,初始页面是开始考试的链接,经过考试链接与答案的链接进行比对,发现只需在考试链接后面添加参数View=1就可以提前查看答案)到这里其实已经可以根据答案直接通过考试,但是和我们使用代码完成还是有区别的,如需继续深入请往下看。(参数userid,username需要提取)

pF2hC3q.png

提取答案以及所需参数
查看答案后将响应的文本使用正则表达式提取答案以及参数(后续需要构造表单数据)

pF2h9Cn.png

代码如下

#获取正确答案
answer = re.findall(rf'正确答案为:(.* ?)\n', response.text)
#获取每个问题的id值
answerid = re.findall(rf'id="result(.*?)"', response.text)
#获取每个选项的id以及选项的id值
answervalue = re.findall(rf'(A|B|C|D|E|F|).<input name="questionInfoID_(.*?)" value="(.*?)"', response.text)
#获取提交考试答案的url
endexamurl = re.findall(rf'<form name="form1" action="checkpaper.aspx(.*?)"', response.text)
#部分测验有简答题后续需要根据是否有简答题进行判断
jiandati = re.findall(r"简答题", response.text)

数据如下

#数据太多部分省略,详细数据请看到最后自行获取
answer=['A\r', 'A\r', 'A\r', 'A\r', 'C\r', 'C\r', 'A\r', 'D\r', 'C\r', 'D\r', 'E\r', 'A\r', 'A\r', 'A,C,D\r', 'A,B\r', 'A,C\r', 'B,D\r', 'C,D\r', 'B,D\r', 'A,B,C,D,E\r', 'A,B,C,D\r', 'C,E\r', '正确\r', '正确\r', '正确\r']
answerid=['02d4b327-3002-4282-aa5b-f015c51a6b60', '124d536e-4610-4751-a431-522f181aa277', '3ba4bc47-338d-4abc-a7eb-96dd176b3972', '3ffa1902-f87b-43e4-b771-500abc7416d0', '5333d142-0a63-4215-a8ac-3338265d175e', '75da608f-0334-4e19-82b0-37d3190e64bd', '92a92b8d-1eb4-4bd8-bc6d-06c73047c8b2', '94d306f5-8069-4941-825b-08aa6efc7069', 'bb8b4c25-991c-418d-92fd-1ce63e8f6fe5', 'c79e8d2e-cf1c-40c2-946a-5b67312eae29', 'd90d63e9-c342-465f-94b7-7d8a44587f77', 'fab4d8d1-29a0-4829-a50c-113e8230c44d', '5daf09cb-d6e7-473a-9bba-e328dd6a870f', '79696994-d556-4117-bb91-e0ebffea498c', '7ed25abe-cef2-45d8-994e-b2d1c9ef5fe8']
answervalue=[('A', '02d4b327-3002-4282-aa5b-f015c51a6b60', '14b77147-540e-4159-9c0c-1f053b34efe0'), ('B', '02d4b327-3002-4282-aa5b-f015c51a6b60', '3de2671c-b31c-4ae5-85a4-f9141123b3ae'), ('C', '02d4b327-3002-4282-aa5b-f015c51a6b60', 'b99ac033-e1b0-41af-bbee-59bb2e9fa239'), ('E', '92a92b8d-1eb4-4bd8-bc6d-06c73047c8b2', 'ffd7d84f-2d03-4492-ab08-31435812156f'), ('A', '94d306f5-8069-4941-825b-08aa6efc7069', '1af4af8a-86b2-4bf0-afc6-f72dcce220c1'),  ('', '7ed25abe-cef2-45d8-994e-b2d1c9ef5fe8', '690dde09-699a-4640-a206-01e83c1c7b15'), ('', '7ed25abe-cef2-45d8-994e-b2d1c9ef5fe8', '5af72370-7d47-4b8e-800c-7d822c5cd7c0')]

提交考试答案
根据以下表单数据以及上述提取的答案进行构建

pF2hS4s.png

构建表单

newdata = {}
newdata["LastTime"] = 3
for i in matched_data:
    # print(i)
    if ',' in i[0][0]:  # 处理多选题
        selected_answers = i[0][0].split(',')  # 将多选答案分割成列表
        shuzhu = []
        for k in selected_answers:
            for j in i[1]:
                if k == j[0]:
                    shuzhu.append(j[1])
        newdata["questionInfoID_" + i[0][1]] = shuzhu
        newdata["unsure_pad_" + i[0][1]] = 0
    else:
        if i[0][0] == 'A':
            newdata["questionInfoID_" + i[0][1]] = i[1][0][1]
            newdata["unsure_pad_" + i[0][1]] = 0
        if i[0][0] == 'B':
            newdata["questionInfoID_" + i[0][1]] = i[1][1][1]
            newdata["unsure_pad_" + i[0][1]] = 0
        if i[0][0] == 'C':
            newdata["questionInfoID_" + i[0][1]] = i[1][2][1]
            newdata["unsure_pad_" + i[0][1]] = 0
        if i[0][0] == 'D':
            newdata["questionInfoID_" + i[0][1]] = i[1][3][1]
            newdata["unsure_pad_" + i[0][1]] = 0
        if i[0][0] == 'E':
            newdata["questionInfoID_" + i[0][1]] = i[1][4][1]
            newdata["unsure_pad_" + i[0][1]] = 0

    if '正确' == i[0][0]:
        newdata["questionInfoID_" + i[0][1]] = i[1][0][1]
        newdata["unsure_pad_" + i[0][1]] = 0
    if '错误' == i[0][0]:
        newdata["questionInfoID_" + i[0][1]] = i[1][1][1]
        newdata["unsure_pad_" + i[0][1]] = 0

代码如下

#将表单数据newdata以及上述endexamurl传入
def endexam(endexamurl, newdata):
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Origin': 'http://wrggkk.whvcse.edu.cn',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
    }

    data = newdata

    response = requests.post(
        endexamurl,
        headers=headers,
        data=data,
        verify=False,
    )
    print(response.url + "刷测验成功")

结果:成功


结语

​ 到目前为止该学习网站就已经完结了,难度不大,非常适合新手学习。
​ 文中获取的数据需要进行答案与结果的匹配再进行判断才可以成功,这里留给大家们自行思考。
​ 我本来打算直接将正确答案与选项一起获取,未果,于是选择了分开提取,再合并。
​ 有想试试的小伙伴我这里给出查看答案的页面数据,如果有更好的方法可以在讨论区讨论。
​ 如果有其它学习网站可以在讨论区打出,一起探讨。
​ https://wwm.lanzn.com/iyLjJ1rp57ef
​ 密码:f2p7

  • 108
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值