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

标签 python http post request urllib

我最近制作了这个 ask.fm “垃圾邮件”机器人(没有 ask.fm 既没有 IP 限制也没有验证码来阻止机器人)。所以无论如何,我确保 url 是正确的,但每次我将 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)

基本上没有错误,但是请求到的是错误的url,我检查了好几次变量的url是正确的,也许是重定向了?但是如何检查重定向?我怎样才能让它像普通浏览器一样运行,我已经为 Opera 提供了默认 header 。

最佳答案

我想在this PHP library的帮助下我知道问题出在哪里。您缺少真实性 token ,所以 ask.fm 认为您的请求是假的(因为它是假的)。

假设 PHP 库正常工作,这就是您需要做的:

  1. http://ask.fm获取验证请求所需的 token 。

例如,如果您在浏览器中打开网站,您会发现如下内容:

  var AUTH_TOKEN = "aNotgbm1V9WvBGr//it4N2vSfhSBSP6nGZkx7rrnNL0=";

PHP 库通过将整个页面放入一个字符串并使用正则表达式 /(var AUTH_TOKEN = ")(.*)(";)/ 来实现这一点。

  1. 在您发布问题时包含 token 。

将您的代码更改为类似

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

当然,authToken 是一个包含您从网站抓取的字符串的变量(在本例中,aNotgbm1V9WvBGr//it4N2vSfhSBSP6nGZkx7rrnNL0=)。

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

  1. 将您的 POST URL 更改为 http://ask.fm/[username]/questions/create/

这应该是关于它的。我会确保您也添加了 PHP 库使用的所有 HTTP header :

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 的不同用法。以防万一。

关于Python 不向正确的 URL 发送 HTTP POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30991730/

相关文章:

html - SVG堆栈, anchor 元素和HTTP提取

python - 从 python 中的 c 模块捕获打印输出

python - 通过 Python 的 SQLite 有多快

php - 如何发出生成与 Firefox 相同的响应 header 的 cURL 请求

c++ - 如何将 HTTP 消息从另一个节点解析到 gRPC 服务器

wordpress - 帖子有多种语言吗?

php - MySQL查询无法读取PHP变量

windows - 等效于 cURL 命令上传文件的 PowerShell

python - 如何在 Flask 中使用 psycopg2 (postgresql) 的连接池

python - 三个数的最大乘积