uims选课

import urllib.request
import http.cookiejar
import json
import hashlib
import sys
import time
import queue as Queue
from threading import Thread

# AUTHOR: latyas / latyas@gmail.com /
# Exams turn us to be ARTS students.

#CONSTANT AREA
USERNAME = '学号'
PASSWORD = '密码'
CLASS = ['34551725',
         '34186375'] #选课代码,自行查找,下次选课的时候再写。
URL_PREFIX = 'http://uims.jlu.edu.cn/ntms/'

class Worker(Thread):   
    worker_count = 0   
    def __init__( self, workQueue, resultQueue, timeout = 0, **kwds):   
        Thread.__init__( self, **kwds )   
        self.id = Worker.worker_count   
        Worker.worker_count += 1   
        self.setDaemon( True )   
        self.workQueue = workQueue   
        self.resultQueue = resultQueue   
        self.timeout = timeout   
        self.start( )   
    def run( self ):     
        while True:   
            try:   
                callable, args, kwds = self.workQueue.get(timeout=self.timeout)   
                res = callable(*args, **kwds)   
                self.resultQueue.put(res)   
            except Queue.Empty:   
                break   
            except :   
                print('worker[%2d]' % self.id, sys.exc_info()[:2])   
                  
class WorkerManager:   
    def __init__( self, num_of_workers=10, timeout = 1):   
        self.workQueue = Queue.Queue()   
        self.resultQueue = Queue.Queue()   
        self.workers = []   
        self.timeout = timeout   
        self._recruitThreads( num_of_workers )   
    def _recruitThreads( self, num_of_workers ):   
        for i in range( num_of_workers ):   
            worker = Worker( self.workQueue, self.resultQueue, self.timeout )   
            self.workers.append(worker)   
    def wait_for_complete( self):     
        while len(self.workers):   
            worker = self.workers.pop()   
            worker.join( )   
            if worker.isAlive() and not self.workQueue.empty():   
                self.workers.append( worker )   
        print("All threadding jobs are are completed.")   
    def add_job( self, callable, *args, **kwds ):   
        self.workQueue.put( (callable, args, kwds) )   
    def get_result( self, *args, **kwds ):
        if not self.resultQueue.empty():      
            return self.resultQueue.get( *args, **kwds )
        return None

class jsonExp(Exception):
    def __init__(self):
        pass

def send_json_packet(datastr,url):
    headers = {}
    headers['Content-Type'] = 'application/json'    
    req = urllib.request.Request(url, json.dumps(json.loads(datastr)).encode(), headers)
    ret = opener.open(req)    
    
    return ret

def login_once(opener,username,password):
    LOGIN_URL = URL_PREFIX + 'j_spring_security_check'
    PASS_PREFIX = 'UIMS'
    PASSWORD_ENCRYPTED = '' + hashlib.md5((PASS_PREFIX+username+password).encode()).hexdigest()
    login_data = {'j_username':USERNAME,
        'j_password':PASSWORD_ENCRYPTED
        }
    ret  = opener.open(LOGIN_URL,urllib.parse.urlencode(login_data).encode())
    return ret



def multi_process(id,sub_amount,timeout = 1):
    myworkers = WorkerManager(sub_amount,timeout)
    for i in id:
       myworkers.add_job(thread,i)

    myworkers.wait_for_complete()

    while True:
        res = myworkers.get_result()
        if res == None:
            print('Threads all done.')
            break

def return_state(data): 
    j = json.loads(data)
    try:
        ret = j['errno']
    except:
        raise jsonExp()
    return ret

def thread(i):
    print(i + ' is running....')
    select(i)
    time.sleep(0.01)

def select(i):
    SELECT_COURSE = '{"lsltId":"%s","opType":"Y"}'
    URL = URL_PREFIX + 'selectlesson/select-lesson.do'
    while True:
        try:
            ret = send_json_packet(SELECT_COURSE % (i) ,URL).read().decode()
            errno = return_state(ret)
            if errno == 1410:
                print( i + ' selected successfully!')
                return
        except:
            raise jsonExp()
            continue


opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar()))

def main():
    while True:
        try:
            login_once(opener,USERNAME,PASSWORD)
            multi_process(CLASS,len(CLASS))
        except jsonExp:
            print('error, retrying.')
            continue
if __name__ == "__main__":
    main()

 

转载于:https://www.cnblogs.com/latyas/archive/2013/06/06/3120329.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值