无法发出POST请求

时间:2014-01-11 10:26:13

标签: python urllib2

编辑:我重申了这个问题,因为我不仅无法登录,而且我甚至无法在没有错误的情况下发出简单的POST请求。看下面的代码,它应该返回一个json列表,而不是我得到一个错误页面。

import urllib2
import cookielib
import calendar
import datetime
opener = urllib2.build_opener(
    urllib2.HTTPRedirectHandler(),
    urllib2.HTTPHandler(debuglevel = 0),
    urllib2.HTTPSHandler(debuglevel = 0),
    urllib2.HTTPCookieProcessor(cookielib.CookieJar()),
)
opener.addheaders = [
   ('User-agent', "Mozilla/5.0"),
   ("Content-Type", "application/json")
]
data = '{"searchFilter":{"TimeFrame":10000,"NotTradingExotics":false,"Page":0,"PageSize":20,"AffiliateId":-1,"SortExpression":"Ranking","SortDirection":"Ascending"}}'.encode()
tmp = calendar.timegm(datetime.datetime.now().utctimetuple()) * 1000
url = "https://www.zulutrade.com/WebServices/Performance.asmx/SearchProviders?_tsmp=" + str(tmp)
opener.open(url, data)
res = opener.open(url, data)
print opener.handlers[7].cookiejar._cookies
if "An unexpected error occured" in res.read():
    raise Exception("Login failed")

2 个答案:

答案 0 :(得分:1)

我使用HTTPFox(用于读取请求的Firefox插件)检查了https://www.zulutrade.com/登录表单,并且您缺少处理登录的POST网址中使用的_tsmp QUERY_STRING参数。我认为您的JSON帖子是正确的,但您错过了该参数(我认为他们使用它来避免回复攻击)。

HTTPFox showing the parameter

答案 1 :(得分:1)

这不是您问题的直接答案,但您可能需要考虑使用下面的(稍微简单一点)代码:

import urllib2,cookielib

def Login(username,password):
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
    url1 = "https://www.zulutrade.com"
    url2 = "https://www.zulutrade.com/WebServices/User.asmx/Login"
    data = "?username="+username+"&password="+password
    socket = opener.open(url1)
    socket = opener.open(url2,data)
    return socket.read()