返回信息流====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]
这是一条镜像帖。来源:北邮人论坛 / python / #243同步于 2014/5/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
【2017年更新】教学评估脚本
hansnow
2014/5/27镜像同步51 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
赞一个 水平太低 不能帮忙解决
【 在 hansnow (小寒) 的大作中提到: 】
: 又到了评教的季节……一个一个点那个按钮真是烦啊……于是想写个小脚本搞定这个问题
: 最开始写了下面这个JS脚本,在某个老师的评教页面上运行即可
: [code=js]
: ...................
赞
【 在 hansnow (小寒) 的大作中提到: 】
: 又到了评教的季节……一个一个点那个按钮真是烦啊……于是想写个小脚本搞定这个问题
: 最开始写了下面这个JS脚本,在某个老师的评教页面上运行即可
: [code=js]
: ...................