Python 未发送 HTTP POST 请求更正 URL
Python not sending HTTP POST request to correct URL
我最近制作了这个 ask.fm "spam" 机器人(没有 ask.fm 既没有 IP 限制也没有验证码来阻止机器人)。所以无论如何,我确保 url 是正确的,但每次我发送 POST 请求来询问。fm/usernamehere 它将请求发送到 ask.fm,我不是知道为什么。
import urllib
import urllib2
print("What username do you want to spam?")
username = raw_input()
print("How many questions do you wanna spam?")
numQ = int(raw_input())
print("What is the question that you want to spam?")
Quest = raw_input()
url = "http://ask.fm/" + username
print(url)
for i in range(0, numQ):
data = urllib.urlencode({'question[question_text]':Quest})
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36 OPR/30.0.1835.59',
'Host' : 'ask.fm',
'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Referer' : 'https://www.google.com.eg/',
'Accept-Language' : 'en-GB,en-US;q=0.8,en;q=0.6'}
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
d = response.read()
if(d.find("Your question has been sent") != -1):
print("Successfully sent!")
else:
print("Failed to send!")
print(d)
基本上没有报错,就是请求出错了url,检查了好几次变量都正确url,可能是重定向了?但是如何检查重定向?我如何让它像普通浏览器一样运行,我已经为 Opera 提供了默认的 headers。
我想在 this PHP library 的帮助下我知道问题出在哪里了。您缺少真实性令牌,因此 ask.fm 认为您的请求是假的(因为它是)。
假设 PHP 库正常工作,这就是您需要做的:
- 抓取 http://ask.fm 以获得验证请求所需的令牌。
例如,如果您在浏览器中打开网站,您会发现如下内容:
var AUTH_TOKEN = "aNotgbm1V9WvBGr//it4N2vSfhSBSP6nGZkx7rrnNL0=";
PHP 库通过将整个页面变成一个字符串并使用 RegEx /(var AUTH_TOKEN = ")(.*)(";)/
.
来实现这一点
- 当您 POST 您的问题时包含令牌。
将您的代码更改为
data = urllib.urlencode({
'question[question_text]':Quest,
'authenticity_token':authToken
})
其中 authToken
当然是一个包含您从网站上抓取的字符串的变量(在本例中,aNotgbm1V9WvBGr//it4N2vSfhSBSP6nGZkx7rrnNL0=
)。
PHP 还添加了 'question[force_anonymous]':1
。如果用户将 $anon
设置为 true 并且他们已登录。
- 将您的 POST URL 更改为 http://ask.fm/[username]/questions/create/
应该就是这样了。我会确保你添加所有 HTTP headers PHP lib 也使用:
CURLOPT_URL => "http://ask.fm/$nickname/questions/create/",
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_CONNECTTIMEOUT => 10 ,
CURLOPT_MAXREDIRS => 10,
CURLOPT_REFERER => "http://ask.fm/$nickname/",
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0',
CURLOPT_HEADER => FALSE,
CURLOPT_COOKIEJAR => "cookies.txt",
CURLOPT_COOKIEFILE => "cookies.txt",
CURLOPT_SSL_VERIFYPEER => FALSE,
CURLOPT_SSL_VERIFYHOST => 2
顺便说一句,this question 显示了 urllib2
的不同用法。以防万一它有帮助。
我最近制作了这个 ask.fm "spam" 机器人(没有 ask.fm 既没有 IP 限制也没有验证码来阻止机器人)。所以无论如何,我确保 url 是正确的,但每次我发送 POST 请求来询问。fm/usernamehere 它将请求发送到 ask.fm,我不是知道为什么。
import urllib
import urllib2
print("What username do you want to spam?")
username = raw_input()
print("How many questions do you wanna spam?")
numQ = int(raw_input())
print("What is the question that you want to spam?")
Quest = raw_input()
url = "http://ask.fm/" + username
print(url)
for i in range(0, numQ):
data = urllib.urlencode({'question[question_text]':Quest})
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36 OPR/30.0.1835.59',
'Host' : 'ask.fm',
'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Referer' : 'https://www.google.com.eg/',
'Accept-Language' : 'en-GB,en-US;q=0.8,en;q=0.6'}
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
d = response.read()
if(d.find("Your question has been sent") != -1):
print("Successfully sent!")
else:
print("Failed to send!")
print(d)
基本上没有报错,就是请求出错了url,检查了好几次变量都正确url,可能是重定向了?但是如何检查重定向?我如何让它像普通浏览器一样运行,我已经为 Opera 提供了默认的 headers。
我想在 this PHP library 的帮助下我知道问题出在哪里了。您缺少真实性令牌,因此 ask.fm 认为您的请求是假的(因为它是)。
假设 PHP 库正常工作,这就是您需要做的:
- 抓取 http://ask.fm 以获得验证请求所需的令牌。
例如,如果您在浏览器中打开网站,您会发现如下内容:
var AUTH_TOKEN = "aNotgbm1V9WvBGr//it4N2vSfhSBSP6nGZkx7rrnNL0=";
PHP 库通过将整个页面变成一个字符串并使用 RegEx /(var AUTH_TOKEN = ")(.*)(";)/
.
- 当您 POST 您的问题时包含令牌。
将您的代码更改为
data = urllib.urlencode({
'question[question_text]':Quest,
'authenticity_token':authToken
})
其中 authToken
当然是一个包含您从网站上抓取的字符串的变量(在本例中,aNotgbm1V9WvBGr//it4N2vSfhSBSP6nGZkx7rrnNL0=
)。
PHP 还添加了 'question[force_anonymous]':1
。如果用户将 $anon
设置为 true 并且他们已登录。
- 将您的 POST URL 更改为 http://ask.fm/[username]/questions/create/
应该就是这样了。我会确保你添加所有 HTTP headers PHP lib 也使用:
CURLOPT_URL => "http://ask.fm/$nickname/questions/create/",
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_CONNECTTIMEOUT => 10 ,
CURLOPT_MAXREDIRS => 10,
CURLOPT_REFERER => "http://ask.fm/$nickname/",
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0',
CURLOPT_HEADER => FALSE,
CURLOPT_COOKIEJAR => "cookies.txt",
CURLOPT_COOKIEFILE => "cookies.txt",
CURLOPT_SSL_VERIFYPEER => FALSE,
CURLOPT_SSL_VERIFYHOST => 2
顺便说一句,this question 显示了 urllib2
的不同用法。以防万一它有帮助。