Python实现智慧校园自动评教全新版


Posted in Python onJune 18, 2021

前言

因为前面的文章中已经涉及到了登录智慧校园的验证码处理问题,所以本文将略过此过程。如登录时遇到验证码的情况,请参考此文。其实第一次使用有验证码的话,可以在浏览器先登录一次,然后再使用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、进入评教页面观察

教学评价(学生)教学评价点击学生虽然能够看到教学评价页面但是并非真的教学评价对应的网址,故而需要在network中查看真正的教学评价页面对应的网址。按F12检查网页,然后进行如下图步骤的操作,就可以发现真正的教学评价网址了。

Python实现智慧校园自动评教全新版

2、抓取评教时发起url请求操作

同样在此教学评价页面按F12调出开发者工具转至Network那一栏,然后对一节课进行评教。然后你会发现进行评教的url请求操作,如下图所示!

Python实现智慧校园自动评教全新版     

因此我们只需要用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。可以其对应的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、遇到的问题

到这就已经结束了,但是在post请求请教url时我一直失败,返回{"msg":"运行时异常:error parse new","code":500},让我困惑不已,百思不得其解。最后我用fiddler抓包,对比了一下浏览器post请求与python代码发起的post请求的区别,如下图所示:

Python实现智慧校园自动评教全新版        

你会发现浏览器post请求时'evaluationProject'对应的value值为一个列表。而python的post请求时,'evaluationProject'对应多个value值,本来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与一个列表形成键值对,找到原因之后我就想把这个列表放在字符串中,但是还是报错。因为我忘了,一个字符串换行需要用续行符连接,最后改成下面那样才算成功!

'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智慧校园自动评教内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Python中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
Python解析nginx日志文件
May 11 Python
Python 使用requests模块发送GET和POST请求的实现代码
Sep 21 Python
Python正则表达式分组概念与用法详解
Jun 24 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
python 对txt中每行内容进行批量替换的方法
Jul 11 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
Python3 翻转二叉树的实现
Sep 30 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
Python字典实现伪切片功能
Oct 28 Python
教你怎么用Python监控愉客行车程
Apr 29 Python
python用海龟绘图写贪吃蛇游戏
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 #Python
Python turtle实现贪吃蛇游戏
python中%格式表达式实例用法
Jun 18 #Python
如何用python清洗文件中的数据
Jun 18 #Python
Python中glob库实现文件名的匹配
python中的装饰器该如何使用
Jun 18 #Python
You might like
一个PHP的QRcode类与大家分享
2011/11/13 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
JS Timing
2007/04/21 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
必备的JS调试技巧汇总
2016/07/20 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
JS库之Highlight.js的用法详解
2017/09/13 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
解决django后台管理界面添加中文内容乱码问题
2019/11/15 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
Python实现壁纸下载与轮换
2020/10/19 Python
路由表示做什么用的?在linux环境中怎么来配置一条默认路由?
2013/06/07 面试题
竞职演讲稿范文
2014/01/11 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
教师教学评估方案
2014/05/09 职场文书
高三励志标语
2014/06/05 职场文书
关于办理居住证的介绍信模板
2019/11/27 职场文书
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis