python3 实现 virtual judge 日志(三): 本地交题姬 2016.11.9更新

目前来说思路大概是:把从vj提交的题目代码下载到本地,然后从本地再上传到HDU 获取 getstatus

问题:

1.多个人在vj上交题用一个号如何准确的获取status(打算重写getstatus,用runID搞),并且还要获取代码长度等,突然想起来的

2.从网上下载到本地的txt文件要以何种命名方式准确提交

3.并不会多线程以及操作;


11.7更新内容:

1.用runID处理了查询,先把runID提取出来,再通过runID把后面九个加入队列(还好我养成了清空队列的习惯,不然就GG),再对队列中的第3个(status)进行判断,如果满足return,否则继续,就得到结果了;

2.用二次循环连续提交了两发,也得到了满意的结果,但是目前不清楚,如果对于一个运行时间较多的题会不会出情况,以及网络故障应该加异常,比如submitfalse

3.暂时还没有处理对于CE的情况,不过应该不难,CE处理出一个链接就行了(但是突然想起来,CE的页面是完整的爬下来还是用HDU的,参考一下HUST)

4.还有明天要找两个电脑测试同时交题出现的问题,机器人会不会执行


11.9更新内容:

1.获取CE内容作了处理

# -*- coding: UTF-8 -*-
import re
import requests
import time
from bs4 import BeautifulSoup

class Accept(object):
    def __init__(self):
        object.__init__(self)
        self.session = requests.Session()
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'
        }
        self.session.headers.update(headers)
    def login(self, username, password):
        url = 'http://acm.hdu.edu.cn/userloginex.php?action=login'
        data = {
            'username': username,
            'userpass': password,
            'login': 'Sign In',
        }
        headers = {
            'host': 'acm.hdu.edu.cn',
            'origin': 'http://acm.hdu.edu.cn',
            'referer': 'http://acm.hdu.edu.cn/'
        }
        r = self.session.post(url, data=data, headers=headers)

    def getID(self):  # 新加功能
        status_url = 'http://acm.hdu.edu.cn/status.php?user=zzuliauto2'
        while True:
            time.sleep(1)
            req = self.session.get(status_url)
            soup = BeautifulSoup(req.text, 'lxml')
            n = 0
            s = list()
            for i in soup.table.find_all('table')[-2].find_all('tr'):
                if n == 0:
                    n += 1
                    continue
                else:
                    ans = i.find_all('td')
                    break
            ans = ans[0].text
            return ans
    def getstatus(self,runID):
        status_url = 'http://acm.hdu.edu.cn/status.php?user=zzuliauto2'
        s = list()
        k = list()
        while True:
            time.sleep(1)
            k = []
            s = []
            req = self.session.get(status_url)
            soup = BeautifulSoup(req.text, 'lxml')
            n = 0
            for i in soup.table.find_all('table')[-2].find_all('tr'):
                #print(i.text)
                for j in i :
                    if n <10:
                        n+=1
                        continue
                    else:
                        s.append(j.string)
            n = 0
            for i in s:
                if i == str(runID):
                    break
                else:
                    n+=1
            for i in range(0,9):
                k.append(s[n+i])
            for i in k:
                if k[2]!= 'Queuing' and k[2] != 'Compiling' and k[2]!='Running':
                    return k
    def getCE(self,runID):
        ce_url = 'http://acm.hdu.edu.cn/viewerror.php?rid='+str(runID)
        req = self.session.get(ce_url)
        req.encoding = 'gbk'
        soup = BeautifulSoup(req.text , 'lxml')
        soup = soup.find('pre')
        soup = soup.text
        print(soup)
    def submit(self, problemID,code ,language):
        url = 'http://acm.hdu.edu.cn/submit.php?action=submit'
        data = {
            'check': '0',
            'problemid': str(problemID),
            'language': str(language),
            'usercode': code.read()
        }
        headers = {
            'Connect-Type': 'application/x-www-form-urlencoded'
        }
        print('submitting problem: ', problemID)
        r = self.session.post(url, data=data, headers=headers)
        ans = c.getID()
        answer = c.getstatus(ans)
        if answer[2] != 'Compilation Error':
            print(answer)
        else:
            print(answer)
            c.getCE(str(ans))

if __name__ == '__main__':
    c = Accept()
    user = 'zzuliauto2'
    password = '19951106'
    c.login(user, password)
    code = open('5901.txt','r')
    c.submit(5091,code=code ,language=5)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kelisita

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值