SPOJ命令行提交:POST方法中包含哪些内容?

时间:2014-12-09 00:32:13

标签: python post

现在我正在编写一个代码段,允许从命令行向http://www.spoj.com/提交代码,例如python spoj_cl.py test.cpp

我知道我需要使用指定的参数和cookie向相应的URL发送POST请求,但我仍然对要包含的参数感到困惑。现在我正在尝试使用试错法,这似乎不是很有效。我的问题是:

  1. 如何系统地检查发送POST请求时要包含哪些参数?

  2. 如何立即检查我发送的POST请求是否成功?我能想到的一种方法是获取提交页面http://www.spoj.com/status/的内容,但最好直接检查请求。

  3. 以下是我正在处理的片段。希望它应该是可读的。

    import requests, sys
    
    # if __name__ == "__main__":
    base_url = "http://spoj.com"
    autologin_hash = "*************" # Your user hash, taken from cookie
    autologin_login = "************" # Your user name
    session_id = "************" # Login session, can be retrieved when logged in
    
    cookies_info = {
        "autologin_login": autologin_login,
        "autologin_hash": autologin_hash
    }
    
    ext_id = {
        "cpp": "1"
    }
    
    filename = "test.cpp"
    problem_name = str(filename.split(".")[0]).upper()
    extension = filename.split(".")[1]
    
    submit_url = base_url + "/submit/"
    parts = {
        "PHPSESSID": session_id,
        "action": "/submit/complete",
        "file": open(filename, "rb"),
        "subm_file": "",
        "lang": ext_id[extension],
        "problemcode": problem_name
    }
    
    requests.post(submit_url, 
        params={"PHPSESSID": session_id},
        files=parts,
        cookies=cookies_info)
    print "Submission sent!"
    

1 个答案:

答案 0 :(得分:0)

  1. 如何系统地检查发送POST请求时要包含哪些参数?
  2. 我不是网站spoj.com的成员,但您要求的是基本的网络抓取。找到用于在网站上提交代码的HTML表单,然后使用Firebug或Chrome开发人员控制台查找具有名称属性的HTML输入元素。找到它们之后,您可以制作一个Python脚本来系统地检查这些元素。如果有一天元素丢失,页面可能会改变。

    示例代码:

    webpage = requests.get(form_url, params={"PHPSESSID": session_id}, cookies=cookies_info)
    html = BeautifulSoup(webpage.text)
    form = html.find('form')
    inputs = form.findAll('input')
    names = []
    for i in inputs:
        names.append(i['name'])
    
    1. 如何立即检查我发送的POST请求是否成功?
    2. 检查响应的状态代码。成功请求应为200

      # Make the request
      r = requests.post(submit_url, 
          params={"PHPSESSID": session_id},
          files=parts,
          cookies=cookies_info)
      
      # Check the response code
      if r.status_code == '200':
          print "Submission successful!"
      else:
          print "Submission met a status code of: %s" % r.status_code