标题说明了一切,关于它的奇怪部分是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请求时我没有得到预期的响应。如果提交的用户名/密码/代码对无效,则该页面应回复“抱歉您的密码或代码不正确”。 - 我没有得到那个回应。关于为什么会发生这种情况的任何想法?
答案 0 :(得分:0)
我使用Python urllib测试了你的问题。我发现:
如果您没有此网站的Cookie,则会为您提供503代码和Cookie
__cfduid
。在503页面中,它会发送请求
/cdn-cgi/l/chk_jschl?xxxxx
以获取另一个Cookiecf_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