一直都想写这么个东西,用户登录后,输入题号,找到代码链接,打印,就这么轻松,不过有的代码是在比赛里提交的,必须要到比赛里去找,所以若一下子找不到代码就要提供比赛id
一开始我是直接在Submissions里挨个搜索所找的题目和代码,感觉贼慢,特别是你如果提交的题目很多的话,后来观察了下网址,想到直接跳到那道题你提交的页面,然后搜索AC代码,这样就快多了
#!/usr/bin/env python
#-*-coding:utf-8-*-
import sys, re
import urllib, urllib2
import cookielib
import getpass
from bs4 import BeautifulSoup
#处理编码问题
reload(sys)
sys.setdefaultencoding( "utf-8" )
home_url = 'http://acm.sdut.edu.cn/onlinejudge2/index.php/Home'
login_url = 'http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Login/login'
#安装cookie处理
cookie_support = urllib2.HTTPCookieProcessor(cookielib.CookieJar())
opener = urllib2.build_opener(cookie_support)
urllib2.install_opener(opener)
#初始化cookie
home_temp = urllib2.urlopen(home_url)
#伪装成浏览器,以免服务器拒绝访问
headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}
uername = raw_input('请输入用户名:\n')
key = getpass.getpass('请输入登录密码:\n') #密码不可见
values = {'user_name': uername, 'password': key}
#login
post = urllib.urlencode(values)
request = urllib2.Request(login_url, post, headers)
response = urllib2.urlopen(request)
html = response.read()
#解析登录后的页面并判断是否登录成功
soup = BeautifulSoup(html)
if soup.find(text = 'Logout') != None:
print '登录成功:)\n'
else:
print '登录失败:(\n'
sys.exit(0) #直接退出
#在problem或contest里查找代码
def FindCode(url, pid):
t = 0
while t == 0:
sub = BeautifulSoup(urllib2.urlopen(url))
table = sub.find_all('tr')
for tr in table:
try:
tr = tr.find_all('td')
if tr[3].text == 'Accepted' and tr[2].a['href'][-9:-5] == pid:
code = 'http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Viewcode/view/sid/' + tr[0].text
res = BeautifulSoup(urllib2.urlopen(code))
print res.find(class_ = 'brush:cpp;').text
return True
except:
pass
try:
url = 'http://acm.sdut.edu.cn' + sub.find(class_ = 'next')['href']
except:
return False
#输入题号,获取AC代码
while True:
pid = raw_input('输入你要找的代码题号:\n')
url = 'http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Solution/status?runid=&username=' + uername + '&pid=' + pid + '&lang=&result='
if FindCode(url, pid) == False:
cid = raw_input('没有找到代码,输入pid在比赛里找找吧\n')
url = 'http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/conteststatus/cid/' + cid + '/uid/23897.html'
FindCode(url, pid)
运行截图: