使用机械化和请求发送POST。

时间:2013-09-30 13:35:43

标签: python csrf python-requests mechanize-python twill

我正在尝试使用mechanize发送一个POST但是我的代码有时不会工作(我知道为什么)。我用过机械,斜纹和要求。机械化和斜纹它是工作的,而不是请求。可能我是以错误的方式做到这一点。

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

#!/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]

根据我的理解,机械化或斜纹首先获取页面,填写表格并发送表格。但问题是,有时目标页面显示随机页面,没有任何形式。在那种情况下,我得到一个错误,显然是因为没有表格可以显示。我不想处理这个错误,因为我已经知道帖子的URL。即使显示了一些随机页面,在我单击下一步之后,也会加载相同的表单。 POST网址,字段都保持不变。所以我想直接发送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。所以我用斜纹去了同一页,做了showforms并看到了令牌有一些价值:

enter image description here

这就是我想要的:

  1. 使用机械化和请求进行POST(不先下载页面)
  2. 如何处理CSRF令牌?
  3. 如何调试'urlopen错误[Errno 61]拒绝连接'

2 个答案:

答案 0 :(得分:3)

我已成功使用以下代码:

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令牌并将其保留在您的应用程序中,并将每个新请求添加到其中。

答案 1 :(得分:2)

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

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