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()