2013-09-30 59 views
4

我想使用機械化發送POST,但是我的代碼有時不工作(我知道爲什麼)。我使用過機械化,斜紋和請求。隨着機械和斜紋它正在工作,並與要求它不是。可能我是以錯誤的方式做的。用機械化和請求發送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] 

從我所瞭解的,機械化或斜紋首先得到的頁面,填寫表格和發送表單。但問題在於,有時目標頁面顯示隨機頁面,沒有任何形式。在那種情況下,我收到一個錯誤,顯然是因爲沒有可以顯示的表單。我不想處理這個錯誤,因爲我已經知道帖子的網址。即使顯示了一些隨機頁面,在我點擊下一頁之後,也會載入相同的表單。 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. 確實張貼了用機械化和要求(無需下載第一頁)
  2. 如何處理CSRF令牌?
  3. 如何調試「的urlopen錯誤[錯誤61]連接被拒絕」

回答

1

必須以獲取會話cookie和CSRF令牌獲取表單頁面。

連接拒絕錯誤可能是由於你有封鎖的網站由於通過自動化手段張貼到登錄頁面。

+1

我不能這樣做:http:// pastie。org/8367073我得到相同的錯誤 – avi

+0

@avi聽起來像你的IP被封鎖了。您應該從另一臺主機嘗試或獲取新的IP(即重置您的adsl路由器)。 – Rolando

+0

我試過了,但沒有成功。而且我的其他代碼與斜紋工作正常 – avi

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令牌並將其保存在您的應用程序中,併爲每個新請求添加它。