#encoding=utf-8
__author__ = 'cgjiayou'
import urllib,urllib2,cookielib
from xml.etree import ElementTree as ET
import time,random
import multiprocessing
resources=['5CB9CDF08E6F614A','78CFB72F1D506DBD','1F3B373E973B23A8','83863BC437F62EF4','83863BC437F62EF4','CBD0D060FBCA3E9C',
'5A6EFD3BD2B4DD23','EAC57F73F42B0D37','F87246A55E314400','37E57CA44938DD29','FD3BB079D4521821','27F892B976406F27',
'B2EED5FE2F72EFFC','AFE77EB809858CCB','7AE65FD4E4383224','D7EAF159FE422260','83A10AF0DC7FF935','17E3B88342E72147',
'637F0ADDBF6FCA19','9ABBA5F427543BF2','9DE1334C5698CD39','8CA190CBC83CDC31','A508EAC9EC8D2DBD','E1C6FF7B07873CD1',
'356B48552FD8E73D','8194F3B75B7A02D2','B982BFCBE6DE4FF4','8F6DD2F4310969F7','0C25907CA6E9DAEE','D30C5E32132A1DAF',
#'ED9A7EEB0424019C','15E79FD268C2116A','DADBD8A2B3CC9DBB','21F86978C1A1565A','D9367DD831C3B8F9','4D3561F4EFCE3B08',
#'74F5C9C6E40ADCD3','854F98B371A22058','F8EA26A34E6024F5','3AD2F67293C92311','7A27B37137FE69DD','FA24CE1F73F7E7D2',
#'89F10A0A088BBDD9','190DFD01A27A08DB','5E307EAD8BAD61DD','82209DD70C26F02A','D3847E81743E909D','D841E0CEDA451ADE',
#'B9395B86F9A0FC38','023CF7143369DF4A','D92385BCF279F935','882D58CA1904712C','1A28D3BA73A402FE','654F4404B72B49F8'
]
def login(id,pwd):
logurl="http://202.115.71.135/course/servlet/UserLoginDataAction"
values={
"UserName":str(id),
"Password":str(pwd),
"UserType":"stu",
"btn":"登陆"
}
data=urllib.urlencode(values)
request=urllib2.Request(logurl,data=data)
cookiejar=cookielib.CookieJar()
handler=urllib2.HTTPCookieProcessor(cookiejar)
opener=urllib2.build_opener(handler)
try:
response=opener.open(request)
#html=response.read().decode("utf-8")
#print html
cookies=cookiejar._cookies
cookie=cookies['202.115.71.135']['/course/']['JSESSIONID']
JESSIONID=cookie.value
print u'登录成功,SESSIONID为%s'%JESSIONID
return opener,JESSIONID
except Exception,e:
#print e
return None,None
def startVideo(opener,JESSIONID,resource_id):
starturl="http://202.115.71.135/course/servlet/UserStudyRecordAction"
headers={
"Host":"202.115.71.135",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding":"gzip, deflate",
"Referer":"http://202.115.71.135/course/websys/videoview.jsp?resource_id=%s"%resource_id,
"Cookie":"JSESSIONID=%s"%JESSIONID,
"Connection":"keep-alive"
}
values={
"resource_id":resource_id,
"SetType":"ADD",
"ranstring":"",
"sid":"",
"tt":"1448426574483"
}
#print time.time()
data=urllib.urlencode(values)
request=urllib2.Request(starturl,data=data,headers=headers)
try:
response=opener.open(request,timeout=40)
html=response.read()
html=html.replace('GBK','UTF-8')#坑爹
#print html
html=html.decode('utf-8')
xml_tree=ET.fromstring(html)
#print xml_tree
state=xml_tree.find('select_state').text
message=xml_tree.find('select_message').text
#print state,message
return state,message
except Exception,e:
print u'尝试获取资源失败,重试中。。'
return None,None
def stopVideo(opener,message,JESSIONID,resource_id):
stopurl='http://202.115.71.135/course/servlet/UserStudyRecordAction'
headers={
"Host":"202.115.71.135",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding":"gzip, deflate",
"Referer":"http://202.115.71.135/course/websys/videoview.jsp?resource_id=%s"%resource_id,
"Cookie":"JSESSIONID=%s"%JESSIONID,
"Connection":"keep-alive"
}
values={
"resource_id":resource_id,
"SetType":"STOP",
"ranstring":"",
"sid":message,
"tt":"1448436674483"
}
data=urllib.urlencode(values)
request=urllib2.Request(stopurl,data=data,headers=headers)
try:
response=opener.open(request)
return True
except Exception,e:
#print e
return False
def getTime(opener):
import re
timeurl='http://202.115.71.135/course/websys/studentstudytime.jsp'
response=opener.open(timeurl)
html=response.read().decode('utf-8')
html=u''.join(html.split())
remod=re.compile(ur'>(\d*?)</font>分钟')
result=re.findall(remod,html)
if result:
#print u'目前%s分钟,%s学时'%(result[0],result[1])
return result[0]
else:
print u'自动获取时间超时,你可以到行政网站手动查询'
return 0
#print u'获取时间失败'
def logOut(opener):
url='http://202.115.71.135/course/servlet/UserLogoutAction'
response=opener.open(url)
def fun(id,pwd,l):
state=None
opener=None
while opener==None:
opener,JESSIONID=login(id,pwd)
for resource_id in l:
print u'尝试的资源id为%s'%resource_id
for i in range(2):
state,message=startVideo(opener,JESSIONID,resource_id)
if state!=None:
break
if state==None:
print u'该资源已被抢占,尝试下一资源'
continue
print u'视频开始成功,准备睡眠700s'
time.sleep(500)
state=stopVideo(opener,message,JESSIONID,resource_id)
for i in range(20):
for i in range(2):
state,message=startVideo(opener,JESSIONID,resource_id)
if state!=None:
break
if state==None:
print u'该资源已被抢占,尝试下一资源'
continue
print u'视频开始成功,准备睡眠500s'
time.sleep(500)
state=stopVideo(opener,message,JESSIONID,resource_id)
if state:
print u'视频结束成功,时间累积成功'
else:
print u'视频结束可能失败,请登录网页查看实际结果'
getTime(opener)
logOut(opener)
def main(id,pwd):
processes=[]
for i in range(3):
p=multiprocessing.Process(target=fun,args=(id,pwd,resources[i*18:(i+1)*18]))
processes.append(p)
for p in processes:
p.start()
for p in processes:
p.join()
def main1(id,pwd):
state=None
opener=None
resource_id=random.choice(resources)
#resource_id='5CB9CDF08E6F614A'
print u'随机选中的资源ID为%s'%resource_id
while opener==None:
opener,JESSIONID=login(id,pwd)
for i in range(5):
state,message=startVideo(opener,JESSIONID,resource_id)
if state=='1':
break
if state=='1':
print time.strftime("%H %M %S"),u'视频开始成功,准备睡眠600s'
time.sleep(600)
state=stopVideo(opener,message,JESSIONID,resource_id)
if state:
print u'视频结束成功,计时成功'
else:
print u'视频结束失败'
for i in range(10):
state,message=startVideo(opener,JESSIONID,resource_id)
if state!='1':
continue
print time.strftime("%H %M %S"),u'视频开始成功,准备睡眠600s'
time.sleep(600)
state=stopVideo(opener,message,JESSIONID,resource_id)
if state:
print u'视频结束成功,计时成功'
#getTime(opener)
else:
print u'视频结束失败'
a=getTime(opener)
logOut(opener)
return int(a)
def test():
print 'Created by cgjiayou --without GUI\nPS:I try to use multiprocessing but failed, if you know how to solve it and you are glad to help me, please contact me by qq404687185\n'
print u'使用方法:\n1、输入教务账号密码\n2、程序自动执行,刷满600分钟自动停止\n\n注:\n1、出现"视频开始成功,准备睡眠600S”字样代表正在计时,\n2、由于行政网站问题,目前经常会出现”尝试获取资源失败“,这时请耐心等待\n3、白天程序效率很低,建议23点之后9点之前刷,这时人少不易发生进程死锁\n4、单独运行程序即可,不需要打开浏览器,请使用教育网\n'
print u'请输入教务账号:'
id=raw_input()
print u'请输入教务密码:'
pwd=raw_input()
while True:
try:
a=main1(id,pwd)
if a>600:
print u'已达到600分钟,程序结束'
break
else:
print u'观看了%d分钟,程序继续执行'%a
except:
pass
if __name__=="__main__":
import sys
try:
test()
except:
print "Unexpected error:", sys.exc_info() # sys.exc_info()返回出错信息
raw_input('press enter key to exit')
1、原理就是运用urllib2模块模拟浏览器和服务器端的通信。不用考虑客户端的js脚本,所以两个函数一个用来开始视频一个用来结束视频就够了。
2、main1是可以正常工作的函数,main是用来尝试进行多线程观看,但测试了一下服务器端好像会进行检查,多个视频同时观看不会计时
3、服务器的数据库应该有问题,不支持高并发。所以返回的xml如果state为1才代表视频开始成功,其他的都为失败
4、xml的解析碰到了一个小小的坑,好像不能处理GBK编码,而且解决办法竟然是手动改成UTF-8。。。这个有待以后进一步考察