BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #243同步于 2014/5/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

【2017年更新】教学评估脚本

hansnow
2014/5/27镜像同步51 回复
====update20170510 09:19==== 由于已经离开学校太久,没太多机会接触教务系统,所以评教脚本可能不再更新了。有需求的同学可以试一下其他版本,如: https://bbs.byr.cn/article/WWWTechnology/30596 ====update20160115 21:19==== 之前的版本因为验证码的原因已经失效了,今年是做了新版本的,之前忘记放上来了。 新版本在此:http://hansnow.github.io/pingjiao/ 项目地址:https://github.com/hansnow/bupt-pingjiao 对于老版本不能使用给各位带来的问题,请各位见谅。 ====update0601 00:34==== 22楼的@nullne童鞋做了一个改良版 地址:https://github.com/nullne/buptjw_auto_evaluate/ ====update0527 18:24==== 使用说明看这里: http://yunbo.li/post/bupt-pingjiao 标准版: #! /usr/bin/env python # -*- coding: utf-8 -*- import sys import urllib import urllib2 import cookielib from bs4 import BeautifulSoup reload(sys) sys.setdefaultencoding('utf8') print '\n\nPowered by xiaohan HOME <http://yunbo.li>\n\n' cookie = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) urllib2.install_opener(opener) username = raw_input("请输入学号:") password = raw_input("请输入教务系统密码:") comment = raw_input("请输入评语:") key = urllib.urlencode({ "type":"sso", "zjh":username, "mm":password }) req = urllib2.Request("http://10.3.240.72/jwLoginAction.do",key) login_page = BeautifulSoup(urllib2.urlopen(url="http://10.3.240.72/jwLoginAction.do",data=key).read().decode('gbk')) if login_page.title.text == '学分制综合教务': print '[+] 登录成功,准备开始评教...' else: print '[!] 登录失败,请检查用户名密码并重新运行本程序' exit() soup = BeautifulSoup(urllib2.urlopen("http://10.3.240.72/jxpgXsAction.do?oper=listWj").read()) data_init = soup.find_all(title='评估') data = [] for i in data_init: data.append({'wjbm':i['name'].split('#@')[0], 'bpr':i['name'].split('#@')[1], 'pgnr':i['name'].split('#@')[5], 'wjmc':i['name'].split('#@')[3], 'bprm':i['name'].split('#@')[2], 'pgnrm':i['name'].split('#@')[4],}) for i in data: # 这个post是重点啊!!!上次失败了就是因为这个!!! pre_post_data = urllib.urlencode({ 'wjbm':i['wjbm'], 'bpr':i['bpr'], 'pgnr':i['pgnr'], 'oper':'wjShow', 'wjmc':i['wjmc'], 'bprm':i['bprm'], 'pgnrm':i['pgnrm'], 'pageSize':'20', 'page':'1', 'currentPage':'1', 'pageNo':''}) urllib2.urlopen(url='http://10.3.240.72/jxpgXsAction.do',data=pre_post_data) post_data = urllib.urlencode({ 'wjbm':i['wjbm'], 'bpr':i['bpr'], 'pgnr':i['pgnr'], '0000000021':'10_0.95', '0000000022':'10_0.95', '0000000023':'5_0.95', '0000000024':'20_0.95', '0000000025':'10_0.95', '0000000026':'5_0.95', '0000000027':'5_0.95', '0000000028':'20_0.95', '0000000029':'10_0.95', '0000000030':'5_0.95', 'zgpj':comment.encode('gbk') }); req = urllib2.Request('http://10.3.240.72/jxpgXsAction.do?oper=wjpg',post_data) res = urllib2.urlopen(req).read().decode('gbk') if str(res).find('成功'): print "[+] 已给〔"+i['bprm']+"〕老师评教!" else: print "[!] 对〔"+i['bprm']+"〕老师评教失败!" print '[+] 共评价'+str(len(data))+'位老师,感谢使用!' print '\n\nPowered by xiaohan HOME <http://yunbo.li>\n\n' final = raw_input('按任意键退出...') 然后呢,当我兴高采烈的在windows下运行时……所有的print都出现乱码了…… 一时间不知道怎么解决,于是出现了下面的windows版……也就是在所有的字符串后面加了encode('gbk') #! /usr/bin/env python # -*- coding: utf-8 -*- import sys import urllib import urllib2 import cookielib from bs4 import BeautifulSoup reload(sys) sys.setdefaultencoding('utf-8') cookie = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) urllib2.install_opener(opener) username = raw_input("请输入学号:".encode('gbk')) password = raw_input("请输入教务系统密码:".encode('gbk')) comment = raw_input("请输入评语:".encode('gbk')) key = urllib.urlencode({ "type":"sso", "zjh":username, "mm":password }) req = urllib2.Request("http://10.3.240.72/jwLoginAction.do",key) login_page = BeautifulSoup(urllib2.urlopen(url="http://10.3.240.72/jwLoginAction.do",data=key).read().decode('gbk')) if login_page.title.text == '学分制综合教务': print '[+] 登录成功,准备开始评教...'.encode('gbk') else: print '[!] 登录失败,请检查用户名密码并重新运行本程序'.encode('gbk') exit() soup = BeautifulSoup(urllib2.urlopen("http://10.3.240.72/jxpgXsAction.do?oper=listWj").read().decode('gbk')) data_init = soup.find_all(title='评估') data = [] for i in data_init: data.append({'wjbm':i['name'].split('#@')[0], 'bpr':i['name'].split('#@')[1], 'pgnr':i['name'].split('#@')[5], 'wjmc':i['name'].split('#@')[3], 'bprm':i['name'].split('#@')[2], 'pgnrm':i['name'].split('#@')[4],}) for i in data: pre_post_data = urllib.urlencode({ 'wjbm':i['wjbm'], 'bpr':i['bpr'], 'pgnr':i['pgnr'], 'oper':'wjShow', 'wjmc':i['wjmc'], 'bprm':i['bprm'], 'pgnrm':i['pgnrm'], 'pageSize':'20', 'page':'1', 'currentPage':'1', 'pageNo':''}) urllib2.urlopen(url='http://10.3.240.72/jxpgXsAction.do',data=pre_post_data) post_data = urllib.urlencode({ 'wjbm':i['wjbm'], 'bpr':i['bpr'], 'pgnr':i['pgnr'], '0000000021':'10_0.95', '0000000022':'10_0.95', '0000000023':'5_0.95', '0000000024':'20_0.95', '0000000025':'10_0.95', '0000000026':'5_0.95', '0000000027':'5_0.95', '0000000028':'20_0.95', '0000000029':'10_0.95', '0000000030':'5_0.95', 'zgpj':comment }); req = urllib2.Request('http://10.3.240.72/jxpgXsAction.do?oper=wjpg',post_data) res = urllib2.urlopen(req).read().decode('gbk') if str(res).find('成功'): print ("[+] 已给〔"+i['bprm']+"〕老师评教!").encode('gbk') else: print ("[!] 对〔"+i['bprm']+"〕老师评教失败!").encode('gbk') print ('[+] 共评价'+str(len(data))+'位老师,感谢使用!').encode('gbk') print 'Powered by xiaohan HOME <http://yunbo.li>' final = raw_input('按任意键退出...'.encode('gbk')) ====update0527 16:44==== 问题解决了,原因是没有模拟打开某个课程的评教界面的过程(= =我真表达不清……一会儿我把代码更上来,大家一看就明白了)【奔跑着歌颂六楼的邱神~~[ema20]】 ==== 原帖 ==== 又到了评教的季节……一个一个点那个按钮真是烦啊……于是想写个小脚本搞定这个问题 最开始写了下面这个JS脚本,在某个老师的评教页面上运行即可 //首次评教完会返回到另一个只有评教模块的网页上,和第一次的就不一样了,所以这里要判断一下。各位自己用一下就明白了 if (window.document.title == "URP 综合教务系统 - 教学评估 - 教学评估") { x = window.frames[1].frames[2].document.getElementsByTagName("input"); }else if (window.document.title == "问卷评估页面"){ x = window.document.getElementsByTagName("input"); }else{ alert("请确认一个你现在是不是处于正确的页面上,本程序只能在教学评估页面运行!") } //data这个数组里存了三个post时需要的关键数据 data = new Array(); for(var i=0;i<x.length;i++){if(x[i].type=="hidden"){data.push(x[i].value)}}; //POST函数 function post(path, params, method) { method = method || "post"; var form = document.createElement("form"); form.setAttribute("method", method); form.setAttribute("action", path); for(var key in params) { if(params.hasOwnProperty(key)) { var hiddenField = document.createElement("input"); hiddenField.setAttribute("type", "hidden"); hiddenField.setAttribute("name", key); hiddenField.setAttribute("value", params[key]); form.appendChild(hiddenField); } } document.body.appendChild(form); form.submit(); } //发送POST请求啦 post('http://10.3.240.72/jxpgXsAction.do?oper=wjpg', { 'wjbm':data[0], 'bpr':data[1], 'pgnr':data[2], '0000000021':'10_0.95', '0000000022':'10_0.95', '0000000023':'5_0.95', '0000000024':'20_0.95', '0000000025':'10_0.95', '0000000026':'5_0.95', '0000000027':'5_0.95', '0000000028':'20_0.95', '0000000029':'10_0.95', '0000000030':'5_0.95', 'zgpj':'老师讲课很认真的啦~' },"post"); 上面这个脚本又一个不方便的地方,每次只能评一个老师。从上面这个脚本可以看出来,对某个老师评教就对应着一个post,但是javascript貌似不能一次运行发送多个post(?),所以又开始写python版的,就是下面这个。 #! /usr/bin/env python # -*- coding: utf-8 -*- import sys import urllib import urllib2 import cookielib from bs4 import BeautifulSoup reload(sys) sys.setdefaultencoding('utf8') cookie = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) urllib2.install_opener(opener) username = raw_input("请输入学号:") password = raw_input("请输入教务系统密码:") key = urllib.urlencode({ "type":"sso", "zjh":username, "mm":password }) req = urllib2.Request("http://10.3.240.72/jwLoginAction.do",key) urllib2.urlopen(url="http://10.3.240.72/jwLoginAction.do",data=key) print 'i have log in ' soup = BeautifulSoup(urllib2.urlopen("http://10.3.240.72/jxpgXsAction.do?oper=listWj").read()) data_init = soup.find_all(title='评估') data = [] #提取POST时要用到的三个关键参数 for i in data_init: data.append({'wjbm':i['name'].split('#@')[0], 'bpr':i['name'].split('#@')[1], 'pgnr':i['name'].split('#@')[5], 'teacher':i['name'].split('#@')[2],}) for i in data: post_data = urllib.urlencode({ 'wjbm':i['wjbm'], 'bpr':i['bpr'], 'pgnr':i['pgnr'], '0000000021':'10_0.95', '0000000022':'10_0.95', '0000000023':'5_0.95', '0000000024':'20_0.95', '0000000025':'10_0.95', '0000000026':'5_0.95', '0000000027':'5_0.95', '0000000028':'20_0.95', '0000000029':'10_0.95', '0000000030':'5_0.95', 'zgpj':'老师讲课很认真' }); req = urllib2.Request('http://10.3.240.72/jxpgXsAction.do?oper=wjpg',post_data) #加了各种header,可还是不行 req.add_header('Origin','http://10.3.240.72') req.add_header('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8') req.add_header('Accept-Encoding','gzip,deflate,sdch') req.add_header('Accept-Language','zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4,zh-TW;q=0.2') req.add_header('Cache-Control','max-age=0') req.add_header('Connection','keep-alive') req.add_header('Host','10.3.240.72') req.add_header('Referer','http://10.3.240.72/jxpgXsAction.do') req.add_header('Content-Type','application/x-www-form-urlencoded') res = urllib2.urlopen(req).read().decode('gbk') print "已给〔"+i['teacher']+"〕老师评教!" 取那几个关键的参数没问题,post也能正常的发出去,但是返回却都是“评教失败”(就是最后的 res )。我已经加了尽量多的header,还是不行。后来我索性把浏览器的UA和相应的登录后的Cookie也加到里面了,倒是不返回“评教失败”了,登录到教务系统一看还是没有成功评教。求各位帮忙看看啥问题呗……昨晚调了一晚,快哭了[ema1]
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
tanoximi机器人#1 · 2014/5/27
赞一个。。水平太低。不能帮忙解决。。
hansnow机器人#2 · 2014/5/27
【 在 tanoximi 的大作中提到: 】 : 赞一个。。水平太低。不能帮忙解决。。 版主别闹[ema23]
icyfox机器人#3 · 2014/5/27
吊~
wangxiaobupt机器人#4 · 2014/5/27
赞一个 水平太低 不能帮忙解决 【 在 hansnow (小寒) 的大作中提到: 】 : 又到了评教的季节……一个一个点那个按钮真是烦啊……于是想写个小脚本搞定这个问题 : 最开始写了下面这个JS脚本,在某个老师的评教页面上运行即可 : [code=js] : ...................
hansnow机器人#5 · 2014/5/27
楼上三位大神不能坐视不管啊
qiukun机器人#6 · 2014/5/27
=-= 看教务系统的代码也是看吐了。
dss886机器人#7 · 2014/5/27
赞 【 在 hansnow (小寒) 的大作中提到: 】 : 又到了评教的季节……一个一个点那个按钮真是烦啊……于是想写个小脚本搞定这个问题 : 最开始写了下面这个JS脚本,在某个老师的评教页面上运行即可 : [code=js] : ...................
tanoximi机器人#8 · 2014/5/27
我是来赞你的 【 在 hansnow 的大作中提到: 】 : : 版主别闹
Jialin机器人#9 · 2014/5/27
哇啦哇啦怒顶一记