发送带有机械化和请求的邮件。

2024-04-19 06:39:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用mechanize发送一篇文章,但是我的代码有时不起作用(我知道原因)。我使用机械化,斜纹布和要求。有了机械化和斜纹布,它就工作了,有了要求,它就不工作了。可能我做错了。

我的机械化代码。以下工作:

#!/usr/bin/env python
import sys
import urllib
import mechanize
from mechanize import ParseResponse, urlopen, urljoin
response = urlopen(url)
forms = ParseResponse(response, backwards_compat=False)
form = forms[0]
form["username"] = "avi"
form["password"] = "stackoverflow"
urlopen(form.click())

我的斜纹代码。它还可以工作:

import os
import twill
from twill.commands import *
out = open(os.devnull,"w")
twill.set_output(out)
go(url)
formvalue("1", "username", "avi")
formvalue("1", "password", "stackoverflow")
submit()
go(url2) #some protected page
content = show()
print 'content is',content[:100]

据我所知,mechanize或twill首先获取页面,填充表单并发送表单。但这里的问题是,有时目标页显示随机页,没有任何形式。在这种情况下,我得到一个错误,显然是因为没有表格显示。我不想处理这个错误,因为我已经知道post URL。即使显示了一些随机页面,但在我单击“下一步”之后,也会加载相同的表单。POST url、字段都保持不变。所以我想直接发送POST请求,因为我已经知道所需的所有细节。这是我的代码,based on

browser = mechanize.Browser()
parameters = {"username" : "avi",
          "password" : "stackoverflow",
         }  
data = urllib.urlencode(parameters)
browser.open(post_url,data)
cool = browser.open(post_url + '%s' % data).read()
print cool

我得到一个错误:

urllib2.URLError: <urlopen error [Errno 61] Connection refused>

我也试过同样的要求。但我也犯了同样的错误。代码如下:

import requests
from requests import session
payload = { 'username': 'avi','password': 'stackoverflow'}
url1 = 'http://example.com/login.php'
url2 = 'http://example.com/protected.php'

with session() as c:
    c.post(url1, data=payload)
    c.get(url2)

所以我到处戳,在网上看了很少的代码,我认为这不起作用,因为要防止CSRF。所以我和twill上了同一页,做了展示,看到了一些象征的价值:

enter image description here

我想要的是:

  1. 使用mechanize和requests发帖(不首先下载页面)
  2. 如何处理CSRF令牌?
  3. 如何调试“urlopen错误[Errno 61]连接被拒绝”

Tags: 代码importformurldata错误usernamepassword
2条回答

您必须检索表单页才能获取会话cookies和csrf令牌。

“连接被拒绝”错误可能是由于您通过自动方式发布到登录页而被网站阻止所致。

我成功地使用了下面的代码:

params = {u'user_login': self.USER, u'password':self.PASSWORD}
data = urllib.urlencode(params)
request = mechanize.Request( loginURL )
response = mechanize.urlopen(request, data=data)

为了处理CSRF令牌问题,我在控制器中添加了以下行:

skip_before_filter :verify_authenticity_token, :only => [:create]

为了保持请求之间的会话,我使用cookiesJar。但您可以从请求中检索CSRF令牌并将其保存在应用程序中,将其添加到每个新请求中。

相关问题 更多 >