2013-09-30 4 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] 

Исходя из того, что я понимаю, механизируйте или сперма сначала достает страницу, заполняет форму и отправляет форму. Но проблема здесь, иногда целевая страница отображает случайную страницу без какой-либо формы. В этом случае я получаю ошибку, очевидно, потому что нет формы для показа. Я не хочу обрабатывать эту ошибку, потому что я уже знаю URL-адрес публикации. даже если отображается некоторая случайная страница, после того, как я нажимаю далее, загружается одна и та же форма. 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. Do POST с Mechanize и запросами (без загрузки страница первая)
  2. Как обращаться с токенами CSRF?
  3. Как отлаживать «urlopen ошибки [Errno 61] В соединении отказано»

ответ

1

Вы должны загрузки страницы формы для того, чтобы получить кук сессии и маркер CSRF.

Отказано, что сообщение об ошибке было связано с тем, что вы заблокировали сайт из-за публикации на странице входа через автоматические средства.

+1

Я тоже не могу это сделать: http://pastie.org/8367073 Я получаю ту же ошибку – avi

+0

@avi звучит так, как ваш IP заблокирован.Вы должны попробовать другой хост или получить новый IP (например, сбросить свой рекламный маршрутизатор). – Rolando

+0

Я пробовал, но не успел. А также мой другой код с twill работает нормально – 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] 

Чтобы сохранить сеанс связи между запросами , Я использую cookieJar. Но вы можете получить токен CSRF из своего запроса и сохранить его в своем приложении, добавив его каждый новый запрос.