Python实现智慧校园自动评教实战:从登录到Post请求细节解析
本文详细记录使用Python实现智慧校园自动评教的全过程。重点解析如何绕过验证码登录、通过Network抓包定位真实评教接口,并深入剖析Post请求中evaluationProject参数因列表与字符串格式转换导致的报错问题。通过Fiddler对比浏览器与Python请求差异,最终利用续行符正确拼接JSON字符串,成功完成自动提交。
前言
鉴于前文已详细阐述智慧校园登录时的验证码处理机制,本文对此环节不再赘述。若登录时遭遇验证码,可参考相关教程。通常首次登录需手动输入验证码,后续使用Python模拟登录时即可跳过此步,因为CQCET智慧校园的验证码弹出具有特定触发条件。
一、准备工作
导包
import json
import requests
import uuid
from fake_useragent import UserAgent # 随机生成UserAgent
生成uuid和UA
# 随机生成uuid
uuid = uuid.uuid4()
# 随机UA
headers = {'User-Agent': UserAgent().random}
二、登录智慧校园
登录过程此处省略具体解释,直接展示核心代码。
# 登录智慧校园
def login():
login_url = 'http://sso.cqcet.edu.cn/uaa/login_process'
data = {'type': 1, 'deviceId': uuid, 'username': '19030****', 'password': 'xl*****5', 'img_code': ''}
session = requests.session()
session.post(url=login_url, headers=headers, data=data)
return session
注:username代表账号,password代表密码。
三、进行评教操作
1、进入评教页面观察
虽然点击“教学评价(学生)”下的“教学评价”能进入页面,但这并非真正的评教接口地址。因此,需要借助浏览器开发者工具(F12)中的Network面板,监控网络请求以获取真实的评教页面URL。

2、抓取评教时发起url请求操作
在评教页面按下F12打开开发者工具,切换到Network标签页,对任意一门课程执行评教操作。此时可观察到评教时发起的URL请求详情,如下图所示。
由此可见,只需使用Python模拟相同的请求操作即可完成评教。然而,这是一个需要携带data数据的Post请求,关键在于如何获取并提交正确的数据。
# 以下为部分所需携带的data
advice: 无
xh: 1903011753
xm: xue
kkdm:
skjsjgh: 200720020
skjsmc: 上课老师姓名
remark: 无
year: 2020-2021
term: 2
weekLy: 周次
taskId: 202020*********08
缺什么补什么,通过观察发现add接口下方存在一个list接口。我们可以向该list对应的URL发起Post请求,以获取上述所需的信息。 代码实现:
# 评教页面
def evaluation(session):
session.get(url='http://ossc.cqcet.edu.cn/xg/teaching/student/xskb')
data = {'pageSize': '10', 'pageNum': '1', 'isAsc': 'asc', 'xnxq': '2020-2021-2', 'weekly': '16'
''}
eval_jsons = json.loads(session.post(url='http://ossc.cqcet.edu.cn/xg/teaching/student/xskb/list', data=data).text)
add_data = {
'evaluationProject': '[{"name": "老师教得怎么样?", "id": "teach_situation", "value": "5"},\
{"name": "学习收获怎么样?", "id": "learn_harvest", "value": "5"},\
{"name": "纪律管理怎么样?", "id": "discipline", "value": "5"},\
{"name": "课堂互动怎么样?", "id": "interaction", "value": "5"},\
{"name": "课后交流怎么样?", "id": "communicat", "value": "5"}]',
'advice': '无',
'remark': '无',
'kkdm': ''
}
for eval_json in eval_jsons['rows']:
isFlag = eval_json['complete']
if isFlag:
print(eval_json['skjsmc'] + '老师的《' + eval_json['kcmc'] + '》已评价!')
else:
add_data['xh'] = eval_json['xh']
add_data['xm'] = eval_json['xm']
add_data['skjsjgh'] = eval_json['skjsjgh']
add_data['skjsmc'] = eval_json['skjsmc']
add_data['year'] = eval_json['xn']
add_data['term'] = eval_json['xq']
add_data['weekLy'] = eval_json['weekly']
add_data['taskId'] = eval_json['yxh']
eval_add_url = 'http://ossc.cqcet.edu.cn/xg/teaching/student/teach/add'
# print(session.get(url=eval_url).text)
print(session.post(url=eval_add_url, data=add_data).text)
3、遇到的问题
流程至此看似结束,但在向评教URL发起Post请求时一直失败,返回{"msg":"运行时异常:error parse new","code":500}错误信息,令人困惑。最终通过Fiddler抓包工具,对比浏览器Post请求与Python代码发起的Post请求差异,发现关键问题,如下图所示。
对比结果显示,浏览器Post请求中'evaluationProject'对应的value值为一个列表结构。而在Python的Post请求中,'evaluationProject'对应多个value值,原本应为列表的数据被错误地拆分了。当时Post请求携带的数据编写方式如下所示:
'evaluationProject': [{"name": "老师教得怎么样?", "id": "teach_situation", "value": "5"},
{"name": "学习收获怎么样?", "id": "learn_harvest", "value": "5"},
{"name": "纪律管理怎么样?", "id": "discipline", "value": "5"},
{"name": "课堂互动怎么样?", "id": "interaction", "value": "5"},
{"name": "课后交流怎么样?", "id": "communicat", "value": "5"}],
直接将evaluationProject与一个列表形成键值对后,虽然找到原因,但尝试将列表放入字符串中仍报错。原因在于忽略了Python中字符串换行需要使用续行符连接,最终修改为如下格式才成功:
'evaluationProject': '[{"name": "老师教得怎么样?", "id": "teach_situation", "value": "5"},\
{"name": "学习收获怎么样?", "id": "learn_harvest", "value": "5"},\
{"name": "纪律管理怎么样?", "id": "discipline", "value": "5"},\
{"name": "课堂互动怎么样?", "id": "interaction", "value": "5"},\
{"name": "课后交流怎么样?", "id": "communicat", "value": "5"}]',
四、总结
此次实现自动评教难度不大,主要困扰在于细节问题。这提醒我们细节决定成败,同时也让我深刻记住了Python中多行字符串必须使用\续行符进行连接。
到此这篇关于Python实现智慧校园自动评教全新版的文章就介绍到这了,更多相关Python智慧校园自动评教内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









