import urllib.requestimport http.cookiejarimport jsonimport hashlibimport sysimport timeimport queue as Queuefrom threading import Thread# AUTHOR: latyas / latyas@gmail.com /# Exams turn us to be ARTS students.#CONSTANT AREAUSERNAME = '学号'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 Noneclass jsonExp(Exception): def __init__(self): passdef 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 retdef 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 retdef 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.') breakdef return_state(data): j = json.loads(data) try: ret = j['errno'] except: raise jsonExp() return retdef 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() continueopener = 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.') continueif __name__ == "__main__": main()