wuye4 发表于 2024-3-17 14:25

【python】requests库 让世界再无难看的课(下)

**前情回顾**
【python】requests库 让世界再无难看的课(上)
https://www.52pojie.cn/thread-1900832-1-1.html
(出处: 吾爱破解论坛)

---

接下来我们分析网课的考试部分:
**找到考试地址**
​        进入课程页面找到试卷的url链接,提取网址中的参数(id,sid,courseClassId,chapterId,pid)

[!(https://s21.ax1x.com/2024/03/17/pF2hPg0.png)](https://imgse.com/i/pF2hPg0)

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

[!(https://s21.ax1x.com/2024/03/17/pF2hC3q.png)](https://imgse.com/i/pF2hC3q)

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

[!(https://s21.ax1x.com/2024/03/17/pF2h9Cn.png)](https://imgse.com/i/pF2h9Cn)

代码如下

```python
#获取正确答案
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)
```

数据如下

```python
#数据太多部分省略,详细数据请看到最后自行获取
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')]
```



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

[!(https://s21.ax1x.com/2024/03/17/pF2hS4s.png)](https://imgse.com/i/pF2hS4s)

构建表单

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

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

代码如下

```python
#将表单数据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

lovnie 发表于 2024-3-17 16:53

分析的很详细,学习了

TenSir152 发表于 2024-3-17 21:08

可以,看着看着我也学会了

52soft 发表于 2024-3-17 18:51

这个技术必须学

THYLYYDS 发表于 2024-3-20 08:15

学习了,抽时间上上手

FCGkitty 发表于 2024-3-17 17:46

https://ids3.jsou.cn/login?大佬可以分析下江开的作业么

dork 发表于 2024-3-17 19:23

,学习了

wuye4 发表于 2024-3-17 22:58

FCGkitty 发表于 2024-3-17 17:46
https://ids3.jsou.cn/login?大佬可以分析下江开的作业么

如果可以的话能否提供测试账号,不一定保证能够分析出来。:loveliness:

foolbird 发表于 2024-3-18 08:17

这个技术必须学

zgwbbt 发表于 2024-3-18 08:37

感谢大佬技术分享

dilla 发表于 2024-3-18 09:42

感谢详细分析,学习中。
页: [1] 2 3
查看完整版本: 【python】requests库 让世界再无难看的课(下)