Python没有向正确的URL发送HTTP POST请求

时间:2015-06-22 23:53:55

标签: python http post request urllib

我最近正在制作这个ask.fm“垃圾”机器人(没有ask.fm既没有IP限制也没有验证码来阻止僵尸程序)。所以无论如何,我确保网址是正确的,但每次我发送POST请求到ask.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)

基本上没有错误,但请求是错误的网址,我已多次检查过该变量是否有正确的网址,也许是重定向?但是我该如何检查重定向?我怎么能让它像一个普通的浏览器一样,我已经为Opera提供了默认的标题。

1 个答案:

答案 0 :(得分:2)

我认为在this PHP library的帮助下,我知道问题是什么。您缺少真实性令牌,因此ask.fm认为您的请求是假的(因为它是)。

假设PHP库有效,那么您需要这样做:

  1. 抓取http://ask.fm以获取验证您的请求所需的令牌。
  2. 例如,如果您在浏览器中打开网站,则会发现以下内容:

      var AUTH_TOKEN = "aNotgbm1V9WvBGr//it4N2vSfhSBSP6nGZkx7rrnNL0=";
    

    PHP lib通过将整个页面变为字符串并使用RegEx /(var AUTH_TOKEN = ")(.*)(";)/来实现此目的。

    1. 在发布问题时包含令牌。
    2. 将您的代码更改为

      data = urllib.urlencode({
          'question[question_text]':Quest,
          'authenticity_token':authToken
      })
      

      其中authToken当然是包含您从网站上抓取的字符串的变量(在此示例中为aNotgbm1V9WvBGr//it4N2vSfhSBSP6nGZkx7rrnNL0=)。

      PHP还添加了'question[force_anonymous]':1。如果用户将$anon设置为true并且他们已登录。

      1. 将您的POST网址更改为http://ask.fm/[username]/questions/create/
      2. 这应该是关于它的。我确保你添加了PHP lib使用的所有HTTP头:

        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
        

        BTW,this question显示urllib2的不同用法。以防它有帮助。