swjtu行政自动挂机工具

本文介绍了SWJTU行政自动挂机工具的实现原理,利用urllib2模块模拟浏览器与服务器交互,主要包含开始和结束视频的两个函数。文中提到,虽然main1函数能正常工作,但尝试通过多线程观看时,由于服务器可能存在高并发问题,导致无法计时。此外,解析XML时遇到GBK编码问题,通过手动转换为UTF-8解决了此问题,但这一现象有待进一步研究。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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。。。这个有待以后进一步考察

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值