FLUYY包工头用bash shell 写了个bnuoj代码提交器。传送门:http://fluyy.net/post/linux/20130119-bnuposter/
他说,用python可能会更方便一些,让我去试试。于是我查了下资料,用python也写了一个代码提交器。用起来感觉还是挺方便的。
使用方法,先是要登录一下,获取到cookie。
类似于在linux输入密码,在输入密码时,密码不会显示,也不会显示‘*’号。
提示Login successed!然后就可以提交代码了!代码文件的格式是这样的,xxxx . yyy 其中xxxx表示题号,yyy表示文件扩展名。程序会自动识别扩展名知道你使用的语言,然后根据题号,提交代码。
比如1000题,我写了一个1000.cpp和一个1000.py,分别是用c++和python写的。
提交成功,程序就会提醒Source submit successed。因为bnuoj不允许同一用户在短时间内提交多次代码,所以交题间隔太快会失败,这时就会提示failed。
代码很简单,可以用来刷bnuoj的1082人品问题。大概是每5秒提交一次,很快就能够得到Accept~
import urllib2 import urllib import cookielib import getpass from time import sleep lang={'C++' :'1' , 'C' :'2' , 'JAVA' :'3' , 'PASCAL' :'4' , 'PYTHON' :'5' , 'C#' :'6' , 'FORTRAN':'7' , 'PERL' :'8' , 'RUBY' :'9' , 'ADA' :'10', 'SML' :'11', 'VC++' :'12', 'VC' :'13', 'CLANG' :'14', 'CLANG++':'15' } extendName={'cpp' : 'C++', 'java': 'JAVA', 'c' : 'C', 'cs' : 'C#', 'py' : 'PYTHON'} loginURL = 'http://www.bnuoj.com/bnuoj/login.php' submitURL = 'http://www.bnuoj.com/bnuoj/action.php' defaultHeaders=[('User-agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')] class Acmer: def __init__(self): self.cj=cookielib.CookieJar() self.opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj)) self.opener.addheaders=defaultHeaders while True: self.username=raw_input(u'Please input your username:') password=getpass.getpass('Please input your password:') logindata={'username' : self.username, 'password' : password, 'cksave' : '365'} data=urllib.urlencode(logindata) tmp=self.opener.open(loginURL,data) if tmp.read() == 'Yes': print u'Login successed!' break else: print u'Login failed!' def Submit(self,filename,isshare='1'): s=filename.split('.') pid=int(s[0]) language=extendName[s[1]] try: fp=open(filename,'r') except IOError: print 'No such file.' return 0 data=fp.readlines() source='' for i in data: source+=i oriData={'user_id':self.username, 'problem_id':pid, 'language':lang[language], 'isshare':isshare, 'source':source} data = urllib.urlencode(oriData) f=self.opener.open(submitURL,data) res=f.read() if res=='Submitted.': print u'Source submit successed' else: print u'Source submit failed' def main(): obj=Acmer() while True: Source=raw_input('Please input filename:') obj.Submit(Source) main()