【校园蘑菇】四六级查分工具

为了能够更好地在校园 蘑菇上使用四六级查分工具,我将查分工具重新修改了一下下。

现在该四六级查分工具具有两个模式:命令框和图形界面模式。主要是为了能够更好地实现分布式查分。

但是由于是校园蘑菇配套的四六级查分工具,因此,限制了学校和姓名,用户只能够通过选择使用校园蘑菇来使用这款工具(当然也可以单独使用这款工具,但是必须要修改几个参数)。

由于是之前的版本更新过的,所以,很多比较好的想法都加了上去,效率应该比上一个版本要好一点。

于是乎,贴上代码(不再提供应用程序了):

CET.py          #主要代码

__author__ = 'glcsnz123'
#_*_encoding:utf-8_*_
import urllib, urllib2, thread, time

mylock = thread.allocate_lock()
ScoreList = []
anslist = []
cefy = []
Prefix = ""
UserName = ""
Rating = 0.0


def Check(hole, stid="330382121208311", name="李莎"):
    #print stid, name
    if not isinstance(stid, unicode):
        stid = stid.decode("ascii")
    if not isinstance(name, unicode):
        name = name.decode("utf-8")
    post_data = urllib.urlencode({"id": stid.encode("gbk"), "name": name.encode("gbk")});
    #print post_data
    HEADERS = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", \
               "Accept-Charset": "GBK,utf-8;q=0.7,*;q=0.3", "Accept-Encoding": "gzip,deflate,sdch", \
               "Accept-Language": "zh-CN,zh;q=0.8", "Cache-Control": "max-age=0",
               "Content-Type": "application/x-www-form-urlencoded", \
               "Cookie": "cnzz_a30023677=4; sin30023677=; rtime30023677=5; ltime30023677=1356177904700; cnzz_eid30023677=19927958-1318821986-http%3A//www.baidu.com/s%3Fwd%3D99%25CB%25DE%25C9%25E1%26rsv_bp%3D0%26rsv_spt%3D3%26oq%3D9; searchtime=1356177913"
        ,
               "Host": "cet.99sushe.com", "Origin": "http://cet.99sushe.com", "Referer": "http://cet.99sushe.com/", \
               "User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.20 (KHTML, like Gecko) Chrome/25.0.1337.0 Safari/537.20"
    };

    pst = urllib2.Request("http://cet.99sushe.com/s", headers=HEADERS);
    try:
        pst = urllib2.urlopen(pst, post_data)
    except Exception, e:
        try:
            mylock.acquire()
            hole.append(stid[-5::1])
            #print stid
        finally:
            mylock.release()
        return "w"
    html = pst.read()
    return html.decode("gbk")


def LoopOne(prefix, name, hole, async=True): #check the query in loop
    while True:
        try:
            if async:
                mylock.acquire()
            if len(hole) <= 0:
                break
            i = hole[0]
            del hole[0]
        finally:
            if async:
                mylock.release()
        result = Check(hole, prefix + i, name)
        if len(result) >= 10:
            print result
            try:
                mylock.acquire()
                anslist.append(result.split(','))
                cefy.append(prefix + i)
            finally:
                mylock.release()


def GetLocalNum():
    return "330020"
    #return raw_input("请输入准考证号的前六位:")


def GetName():
    return open(r"..\etc\UserName.conf", 'r').read()
    #return raw_input(u"请输入你的姓名:")


def GetLevel():
    cetlv = raw_input("CET?");
    if cetlv == '4':
        return '1'
    return '2'


def GetYear():
    date = time.localtime(time.time())
    year = int(str(date[0])[2:])
    if date[1] < 8:
        year -= 1
    if int(date[1]) >= 8 or int(date[1]) < 2:
        year = str(year) + '1'
    else:
        year = str(year) + '2'
    return str(year)


def InitCheck(cetlev):
    global Prefix, UserName
    Prefix = GetLocalNum() + GetYear()
    if cetlev == '':
        Prefix += GetLevel()
    else:
        Prefix += cetlev
    UserName = GetName()


def CreateMultiCheck(cetlev='', tlimit=60, kchlimit=(1, 200), zwhlimit=(1, 50)):
    global Rating
    total = (kchlimit[1] - kchlimit[0] + 1) * (zwhlimit[1] - zwhlimit[0] + 1)
    up = total / tlimit + 1
    t = 0
    global Prefix, UserName
    if len(Prefix) != 9 or len(UserName) <= 1:
        InitCheck(cetlev)
    print Prefix, UserName
    hole = []
    preh = []
    tmp = []
    for i in range(kchlimit[0], kchlimit[1]):
        for j in range(zwhlimit[0], zwhlimit[1]):
            tmp.append("%03d%02d" % (i, j))
            t += 1
            if t == up:
                preh.append(t)
                hole.append(tmp)
                tmp = []
                t = 0
    hole.append(tmp)
    preh.append(t)
    while len(hole) != tlimit:
        hole.append([])
        preh.append(0)
    print "I will create", tlimit, "threads..."

    for i in range(0, tlimit):
        thread.start_new_thread(LoopOne, (Prefix, UserName, hole[i], False))
        #time.sleep(0.1)

    print "create is over"
    sum = total
    while sum != 0:
        time.sleep(5)
        sum = 0
        dying = 0
        for i in range(0, tlimit):
            tcg = len(hole[i])
            if tcg == preh[i] and tcg != 0:
                thread.start_new_thread(LoopOne, (Prefix, UserName, hole[i], False))
                dying += 1
            else:
                preh[i] = tcg
            sum += tcg
            #print sum
        Rating = (1.0 - sum * 1.0 / total) * 100.0
        print "%.4f %% finished~ " % (Rating)
        print "there is ", dying, "threads died"


def CreateScore(expe=True):
    print "deal with the data...."
    global ScoreList
    ScoreList = []
    for i in range(len(anslist)):
        tmp = anslist[i]
        scors = u"姓名: " + tmp[-1]
        scors += u"\n准考证号: " + cefy[i]
        scors += u"\n学校: " + tmp[-2]
        scors += u"\n总分: " + tmp[-3]
        scors += u"\n听力: " + tmp[1]
        scors += u"\n阅读: " + tmp[2]
        scors += u"\n综合: " + tmp[3]
        scors += u"\n写作: " + tmp[4]
        if expe:
            open(r'..\tmp\cet' + str(cefy[i]), 'w').write(scors.encode('utf-8'))
        print scors + "\n"
        if len(tmp[-1]) * 3 == len(UserName):
            ScoreList.append(scors)
    return ScoreList


if __name__ == '__main__':
    CreateMultiCheck()

    #CreateScore()

CETGUI.py   #图形界面的代码,其中的if __name__=='__main__':部分是主要代码

__author__ = 'glcsnz123'
#_*_encoding:utf-8_*_
import wx
import thread, threading, CET
import sys, timer, time

global runmt


class RunMulThreads(wx.Frame, threading.Thread):
    def __init__(self):
        wx.Frame.__init__(self, parent=None, id=-1, title="CET4|6 ShowScore", size=(400, 400),
                          style=wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX)
        threading.Thread.__init__(self)
        self.InitPanel()
        self.AddElement0()
        self.AddElement1()
        self.AddBind()
        self.curnow = 0
        self.anslist = []

        #create the Gauge

    def InitPanel(self):
        self.panel = wx.Panel(self, id=-1)
        self.panel.SetPosition((self.GetSize()[0], self.GetSize()[1]))
        self.panel.SetSize((self.GetSize()[0], self.GetSize()[1]))
        self.panel.SetBackgroundColour("white")

        #两个panel的分界线

        self.panel_show = wx.Panel(self, id=-1)
        self.panel_show.SetPosition((0, 0))
        self.panel_show.SetSize((self.GetSize()[0], self.GetSize()[1]))
        self.panel_show.SetBackgroundColour("yellow")

    def AddElement0(self):
        self.cetrb = wx.RadioBox(self.panel_show, id=-1, label="CET Level", name="radiobox", choices=['CET4', 'CET6'],
                                 pos=(120, 30))
        self.cetbut = wx.Button(self.panel_show, -1, label=u"确定", pos=(135, 210))
        self.cetkch = wx.Button(self.panel_show, -1, label=u"默认考场上限200,座位号上限30,如需更改,请点击此处", size=(400, 28))
        self.kchlimit = 200
        self.zwhlimit = 30
        self.cetlev = 4
        name = open(r"..\etc\UserName.conf").read()


    def AddBind(self):#create the bind
        #panel_show
        self.Bind(wx.EVT_BUTTON, self.SetKZLimit, self.cetkch)
        self.Bind(wx.EVT_BUTTON, self.NextPanel, self.cetbut)

        #panel
        self.Bind(wx.EVT_BUTTON, self.PreResult, self.cetprebut)
        self.Bind(wx.EVT_BUTTON, self.NextResult, self.cetnextbut)
        self.Bind(wx.EVT_CLOSE, self.ErrorLog)

    def AddElement1(self):
        self.cetGua = wx.Gauge(self.panel, -1, 100, name="gauge", pos=(50, 90), size=(300, 20))
        self.cetGua.Show(False)
        #create the staicText
        self.cetShowSt = wx.StaticText(self.panel, -1, "", pos=(120, 25))


        #create the staticText
        self.cetRes = wx.StaticText(self.panel, -1, u"you can't see me!", pos=(120, 130))
        self.cetRes.Show(False)

        #create the button
        self.cetprebut = wx.Button(self.panel, -1, label=u"上一个", pos=(100, 300))
        self.cetnextbut = wx.Button(self.panel, -1, label=u"下一个", pos=(200, 300))
        self.cetprebut.Show(False)
        self.cetnextbut.Show(False)

    def ErrorLog(self, event):
        self.Destroy()

    def SetKZLimit(self, event):
        ted = wx.TextEntryDialog(self, u"输入两个整数分别表示考场号和座位号上限(用英文状态下输入的“逗号”隔开)", style=wx.OK | wx.CANCEL)
        if ted.ShowModal() == wx.ID_OK:
            try:
                self.kchlimit, self.zwhlimit = map(int, ted.GetValue().split(","))
            except Exception, e:
                self.kchlimit, self.zwhlimit = 200, 30

    def NextPanel(self, event):
        if self.cetrb.GetSelection() == 0:
            self.cetlev = '1'
        else:
            self.cetlev = '2'
        t = self.panel.GetPosition()
        self.panel.SetPosition(self.panel_show.GetPosition())
        self.panel_show.SetPosition(t)
        thread.start_new_thread(CET.CreateMultiCheck, (self.cetlev, 60, (1, self.kchlimit), (1, self.zwhlimit)))
        self.start()


    def PreResult(self, event):
        self.curnow -= 1
        self.curnow %= len(self.anslist)
        self.cetRes.SetLabel(self.anslist[self.curnow])

    def NextResult(self, event):
        self.curnow += 1
        self.curnow %= len(self.anslist)
        self.cetRes.SetLabel(self.anslist[self.curnow])

    def run(self):
        self.ShowTable = u"    正在努力创建60个线程 ... "
        self.cetShowSt.SetLabel(self.ShowTable)
        while True:
            if CET.Rating > 0:
                self.cetShowSt.SetLabel(self.ShowTable + u"\n\n创建完成!O(∩_∩)O~ 开始查找 ...")
                break
            time.sleep(1)
        time.sleep(0.5)
        self.cetGua.Show(True)
        while True:
            self.cetGua.SetValue(CET.Rating)
            time.sleep(5)
            if CET.Rating >= 99.9:
                self.cetGua.SetValue(100)
                break
        self.cetRes.SetLabel(u"      努力处理数据中...")
        self.cetRes.Show(True)
        self.anslist = CET.CreateScore(True)
        time.sleep(2)
        self.curnow = 0
        if len(self.anslist) > 0:
            self.cetRes.SetLabel(self.anslist[self.curnow])
            self.cetprebut.Show(True)
            self.cetnextbut.Show(True)
        else:
            self.cetRes.SetPosition((100, 130))
            self.cetRes.SetLabel(u"              查找失败~~~~~~\n\n对不起,是我们的程序太差劲了T T")


def RunMulGUI():#图形界面开始处
    app = wx.PySimpleApp();
    runmt = RunMulThreads()
    runmt.Show(True)
    app.MainLoop();
    #thread.start_new_thread(CET.CreateMultiCheck, ())


def RunMulConsle(tlimit, kchlimit, zwhlimit=(1, 50)):#控制台界面启动处
    CET.CreateMultiCheck(tlimit, kchlimit, zwhlimit)
    CET.CreateScore(False)


if __name__ == '__main__':#main function
    if len(sys.argv) <= 1 or sys.argv[1] == 0:
        RunMulGUI()
    else:
        print "create the console ... "
        if len(sys.argv) == 5:
            kchlimit = map(int, sys.argv[3].split(','))
            zwhlimit = map(int, sys.argv[4].split(','))
            RunMulConsle(sys.argv[1], int(sys.argv[2]), kchlimit, zwhlimit)
        elif len(sys.argv) == 4:
            kchlimit = map(int, sys.argv[3].split(','))
            RunMulConsle(sys.argv[1], int(sys.argv[2]), kchlimit)
        else:
            print "[ERROR] args error~"









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值