2013-09-30 9 views
4

기계화를 사용하여 POST를 보내려고하지만 내 코드가 가끔 작동하지 않습니다 (이유를 알고 있습니다). 기계화, 능직 및 요청을 사용했습니다. 기계화와 능직으로 작동하고 요청으로 그렇지 않습니다. 아마 내가 잘못하고있다.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()) 

마이 twill 코드. 그것은 또한 작동한다 :

내가 이해하고, 기계화 또는 능 직물이 처음에는 페이지를 가져 와서 양식을 채운다. 하지만 문제는 여기에, 때로는 대상 페이지가 어떤 형태도없이 임의의 페이지를 표시합니다. 이 경우에는 표시 할 양식이 없으므로 오류가 발생합니다. 게시 URL을 이미 알고 있기 때문에이 오류를 처리하고 싶지 않습니다. 임의의 페이지가 표시 되더라도 다음을 클릭하면 같은 양식이로드됩니다. POST url 필드는 모두 동일하게 유지됩니다. 그래서 나는 필요한 모든 것을 이미 알고 있기 때문에 POST 요청을 직접 보내고 싶었습니다.

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

내가 요청 같은 일을 시도 :

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 

나는 오류가 발생 : 여기에 내 코드, based on이다. 하지만 위와 같은 오류가 발생합니다. 여기에 코드가 있습니다 :

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를 막기 위해 작동하지 않는다고 생각합니다. 다운로드하지 않고 (기계화 및 요청에

  1. 마 POST : 그래서, 능 직물과 같은 페이지에 가서 showforms를하고 토큰 일부 값이 보았다

    여기 enter image description here

    내가 원하는 무엇인가가 페이지 처음)

  2. CSRF 토큰을 처리하는 방법은 무엇입니까? 디버깅하는 방법

답변

1

당신은 세션 쿠키와 CSRF 토큰을 얻기 위해 양식 페이지를 검색에있는 'urlopen 오류 [errno를 61] 연결이 거부 됨'.

자동 로그인을 통해 로그인 페이지에 게시되어 사이트가 차단되어 연결이 거부 된 것일 수 있습니다.

+1

http : // pastie도이 작업을 수행 할 수 없습니다.org/8367073 동일한 오류가 발생합니다. – avi

+0

IP가 차단 된 것처럼 들립니다. 다른 호스트에서 시도하거나 새로운 IP를 얻으십시오 (예 : adsl 라우터 재설정). – Rolando

+0

시도했지만 성공하지 못했습니다. 그리고 능 직물이있는 다른 코드도 잘 작동합니다. – avi

3

내가 성공을 아래의 코드를 사용했습니다 :

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

요청 사이의 세션을 유지하려면 :

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 토큰 문제를 처리하기 위해, 나는 아래에있는 내 컨트롤러에 라인을 추가 쿠키 Jar를 사용합니다. 그러나 요청에서 CSRF 토큰을 가져 와서 응용 프로그램에 보관하고 각각의 새 요청을 추가 할 수 있습니다.