zoukankan      html  css  js  c++  java
  • [python] HDU自动登录提交代码程序

        调了一个下午,被python的正则绊住了;在C#上运作好好的式子在python老是报错,原来python的断言式必须是固定长度的,像类似(?<=[^>].*?)的零宽度正回顾后发断言是不允许出现的,这点python做的没有C# 方便,弄得我只好分了好几个步骤来做.

     

     1 __author__ = 'wuminye'
     2 import time
     3 import urllib
     4 import urllib2
     5 import cookielib
     6 import re
     7 
     8 std = ['Queuing', 'Compiling', 'Running']
     9 
    10 hostaddr = 'http://acm.hdu.edu.cn'
    11 loginaddr = '/userloginex.php?action=login'
    12 submaddr = '/submit.php?action=submit'
    13 statusaddr = '/status.php'
    14 
    15 cj = cookielib.LWPCookieJar()
    16 cookie_support = urllib2.HTTPCookieProcessor(cj)
    17 #httpHandler = urllib2.HTTPHandler(debuglevel=1)
    18 opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
    19 urllib2.install_opener(opener)
    20 header = {'User-Agent': 'IE10'}
    21 
    22 
    23 def login(username, password):
    24     """
    25 
    26     :rtype : object
    27     """
    28     postData = {'username': username,
    29                 'userpass': password,
    30                 'submit': 'Sign In'}
    31     postData = urllib.urlencode(postData)
    32     request = urllib2.Request(hostaddr + loginaddr, postData, header)
    33     response = urllib2.urlopen(request, timeout=10)
    34     if response.getcode() != 200 and response.getcode() != 302:
    35         print 'login web error!'
    36         return False
    37     ans = response.read()
    38     if ans.find("Sign Out") == -1:
    39         return False
    40     return True
    41 
    42 
    43 def querystatus():
    44     postData = {'user': 'wuminye',
    45                 'lang': 0,
    46                 'first': '',
    47                 'pid': '',
    48                 'status': 0}
    49     postData = urllib.urlencode(postData)
    50     request = urllib2.Request(hostaddr + statusaddr + '?' + postData, headers=header)
    51     response = urllib2.urlopen(request, timeout=10)
    52     if response.getcode() != 200 and response.getcode() != 302:
    53         print 'query web error!'
    54         return False
    55     ans = response.read()
    56     m = re.search('(?<=<td height=22px>).*?</td>(<td.*?</td>){8}(?=</tr>)', ans)
    57     ans = '<td>' + m.group(0)
    58     mylist = []
    59     for i in range(0, 7):
    60         m = re.search(r"(?<=<td).+?(?=</td>)", ans)
    61         t = m.group()[1:]
    62         n = t.find('>')
    63         if n != -1:
    64             t = t[n + 1:]
    65         t = re.search('[^<]+', t)
    66         mylist.append(t.group())
    67         ans = ans[m.end() + 5:]
    68     for i in range(0, 4):
    69         ans = ans[ans.find('>') + 1:]
    70     ans = re.search(r"[^<]+", ans).group()
    71     mylist.append(ans)
    72     return mylist
    73 
    74 
    75 def subbmit(pid, lan, code):
    76     postData = {'problemid': pid,
    77                 'language': lan,
    78                 'usercode': code,
    79                 'submit': 'Submit'}
    80     postData = urllib.urlencode(postData)
    81     request = urllib2.Request(hostaddr + submaddr, postData, header)
    82     response = urllib2.urlopen(request, timeout=10)
    83     if response.getcode() != 200 and response.getcode() != 302:
    84         print 'subbmit web error!'
    85         return False
    86     print 'Subbmit Done!'
    87     ans = querystatus()
    88     while ans[2] in std:
    89         time.sleep(1)
    90         print 'Status:', ans[2]
    91         ans = querystatus()
    92     print ans
  • 相关阅读:
    Spring Cloud
    Java/Android 网络请求框架/库
    Spring Roo 想知道源码,怎么实现自动生成枯燥的有规律的文件
    win10操作系统系统,小米路由器,小米3 的问题
    IntelliJ IDEA
    Spring Boot
    echart 插件实现全国地图
    安装AndroidJDK的坑
    小程序进阶之路
    关于echart柱形图的使用问题
  • 原文地址:https://www.cnblogs.com/wuminye/p/3266288.html
Copyright © 2011-2022 走看看