Отправка 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"] = "stackru"
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", "stackru")
submit()
go(url2) #some protected page
content = show()
print 'content is',content[:100]
Из того, что я понимаю, механизатор или твил сначала получает страницу, заполняет форму и отправляет форму. Но проблема здесь в том, что иногда целевая страница отображает случайную страницу без какой-либо формы. В этом случае я получаю ошибку, очевидно, потому что нет формы для показа. Я не хочу обрабатывать эту ошибку, потому что я уже знаю URL поста. даже если отображается какая-то случайная страница, после нажатия кнопки "Далее" загружается та же самая форма. URL-адрес POST, все поля остаются одинаковыми. Поэтому я хотел отправить запрос POST напрямую, так как я уже знаю все необходимое. Вот мой код, основанный на:
browser = mechanize.Browser()
parameters = {"username" : "avi",
"password" : "stackru",
}
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': 'stackru'}
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, сделал showforms и увидел, что есть некоторая ценность с токеном:
Вот что я хочу:
- Делать POST с механизацией и запросами (без загрузки страницы в первую очередь)
- Как обращаться с токенами CSRF?
- Как отладить "ошибка urlopen [Errno 61] Отказано в соединении"
2 ответа
Я использовал код ниже с успехом:
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 из вашего запроса и сохранить его в своем приложении, добавляя его при каждом новом запросе.
Вы должны получить страницу формы, чтобы получить куки сеанса и токен csrf.
Ошибка соединения отклонена, возможно, из-за того, что сайт был заблокирован из-за публикации на странице входа с помощью автоматических средств.