您的位置:首页 > 编程语言

创新实训5.28 代码转交&实时评测

2017-05-28 13:50 127 查看
借助urllib做了代码提交到原OJ,并通过上次写的judger.py去实时评测。然后。。没了。。真的没了。。。目前的题目获取、提交和评测都仅仅支持HDU,后面继续做其他OJ的支持。因为开始写代码的时候尽可能的降低了耦合度,所以其他OJ的支持只需要在problem_spider.py status_spider.py submit.py里新建对应的类和方法即可,对原代码的改动极少。

下面是submiter.py

# coding:utf-8
from base64 import b64decode
import requests,re,time
import urllib.request
import urllib.parse
import http.cookiejar
from scrapy.http import FormRequest

LANGUAGE = {
'G++' : '0',
'GCC' : '1',
'C++' : '2',
'C' : '3',
'Pascal' : '4',
'Java' : '5',
'C#' : '6',
'Python' : '7',
}
class HduSubmiter:
loginURL = 'http://acm.hdu.edu.cn/userloginex.php?action=login'
submitURL = 'http://acm.hdu.edu.cn/submit.php?action=submit'

mapLang = {
'0' : '0',
'1' : '1',
'2' : '2',
'3' : '3',
'4' : '4',
'5' : '5',
'6' : '6'
}
def __init__(self,Prob,User,Code,Lang):
self.Prob = str(Prob)
self.User = str(User)
self.Code = str(Code)
self.Lang = str(Lang)
cj = http.cookiejar.CookieJar()
cookie_support = urllib.request.HTTPCookieProcessor(cj)
opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
#print("Prob:%s,User:%s,Lang:%s\nCode:%s\n"%(Prob,User,Lang,Code))

def login(self):
postDict={
'username': self.User,
'userpass': "2017shixun"+self.User,
'login': 'Sign+In',
}
postData = urllib.parse.urlencode(postDict).encode()
request = urllib.request.Request(self.loginURL, postData)
response = urllib.request.urlopen(request)
text = response.read()
text = text.decode('gb2312')
#print("after login -> ",response.url)
return not re.search(r'No such user or wrong password.', text)

def submit(self):
postDict={
'problemid': self.Prob,
'language': self.mapLang[self.Lang],
'usercode': b64decode(self.Code),
'check': '0'
}
postData = urllib.parse.urlencode(postDict).encode()
request = urllib.request.Request(self.submitURL, postData)
response = urllib.request.urlopen(request)
#print("after submit ->",response.url)

def submit2OJ(self):
if self.login():
print("login success")
try:
self.submit()
except:
print("submit fail")
return False
print("submit success")
return True
else:
print("login fail")
return False

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐