Python 之 BNUOJ代码提交器

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


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值