使用请求模块POST数据时出现400错误请求错误

时间:2015-04-17 00:16:50

标签: python python-requests

标题说明了一切,关于它的奇怪部分是GET请求和没有数据的POST请求不会导致发生此错误。我假设我正在发布的数据有问题,但不太确定。顺便说一句,我正在使用cfscrape模块(Re:https://github.com/Anorov/cloudflare-scrape)来绕过Cloudflare DDoS保护加载页面。无论如何,这是代码:

payload = { "username" : "testusername", "password" : "testpassword", "code" : "1111", "submit" : "Login" }
scraper = cfscrape.create_scraper()
res = scraper.post("http://www.umggaming.com/user/login", data=payload)
print res.content

在POST数据时我得到的响应是

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>cloudflare-nginx</center>
</body>

如前所述,其他请求即GET请求和不包含数据的POST请求成功响应html源代码。我现在很困惑。希望有人可以帮助我。谢谢。

@amow:

url = 'http://umggaming.com/user/login'
values = { 'username' : 'testusername', 'password' : 'testpassword', 'code' : '1111', 'submit' : 'Login' }
heads = { 
    'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (FM Scene 4.6.1)', 
    'Referer' : 'http://www.umggaming.com/user/login',
    'Cookie' : '__cfduid=EXAMPLE; cf_clearance=EXAMPLE'
}
data = urllib.urlencode(values)
req = urllib2.Request(url, headers=heads, data=data)
response = urllib2.urlopen(req)
result = response.read()
print result
编辑:我能够使用上面的代码绕过Cloudflare,但是在发送POST请求时我没有得到预期的响应。如果提交的用户名/密码/代码对无效,则该页面应回复“抱歉您的密码或代码不正确”。 - 我没有得到那个回应。关于为什么会发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:0)

我使用Python urllib测试了你的问题。我发现:

  

如果您没有此网站的Cookie,则会为您提供503代码和Cookie __cfduid

     

在503页面中,它会发送请求/cdn-cgi/l/chk_jschl?xxxxx以获取另一个Cookie cf_clearance

     

然后你可以在标题中使用这两个cookie和一个引用来发送帖子。

答案 1 :(得分:0)

老问题,但由于它是Google搜索结果的顶级产品,因此我会在尝试获得非常相似的结果时为我提供解决方案。

实际上非常简单:如果您没有获得授权,那么Cloudflare似乎不会接受邮寄请求。然而。这意味着您首先必须为该域发出一个简单的GET请求,让cfscrape绕过它,然后您就可以POST无论您做什么。

上述代码的简单修复方法是:

payload = { "username" : "testusername", "password" : "testpassword", "code" : "1111", "submit" : "Login" }
url = "http://www.umggaming.com/user/login"

scraper = cfscrape.create_scraper()
scraper.get(url) # Make a simple GET request to bypass CloudFlare and get the authorisation cookies first
res = scraper.post("http://www.umggaming.com/user/login", data=payload)

print res.content