2013-05-10 4 views
0

Я не могу отправить данные POST для доступа к моей учетной записи, используя библиотеку запросов в Python. В результате soup такое же, как если бы POST не было отправлено Это код, который я использовал и работал на другом сайте:Отправка данных POST с помощью библиотеки запросов в Python

def get_data(final_url): 
    payload = {'session[email]':'[email protected]','session[password]':'mypwd','session[remember_me]':'0','commit':'Sign in'} 
    with requests.session() as ses: 
     log_soup = BeautifulSoup(ses.get('https://www.login-page.com/login').text) 
     payload['utf8'] = log_soup.findAll('input',attrs={'name':'utf8'})[0].get('value') 
     payload['authenticity_token'] = log_soup.findAll('input',attrs={'name':'authenticity_token'})[0].get('value') 
     ses.post('https://www.login-page.com/login',data=payload) 
     req = ses.get(final_url) 

     soup = BeautifulSoup(req.text) 

    return soup 


<form accept-charset="UTF-8" action="/sign_in" class="main_form" id="new_session" method="post" novalidate="novalidate"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;"/><input name="authenticity_token" type="hidden" value="l5+2s90FtEUsS3GHlr2tAktcxSW8jqgXx3mXEwIlAzE="/></div><div class="error_message"> 
</div> 
<dl> 
<dt><label for="session_email">Email</label></dt> 
<dd> 
<div class="input_border"><input autofocus="autofocus" class="text required email" id="session_email" name="session[email]" placeholder="Email" size="30" type="email"/></div> 
</dd> 
</dl> 
<dl> 
<dt><label for="session_password">Password</label></dt> 
<dd> 
<div class="input_border"><input class="text required" id="session_password" name="session[password]" placeholder="Password" size="30" type="password"/></div> 
</dd> 
</dl> 
<div class="checkbox_field"><input name="session[remember_me]" type="hidden" value="0"/><input id="session_remember_me" name="session[remember_me]" type="checkbox" value="1"/><label for="session_remember_me">Remember me</label></div> 
<table class="buttons"> 
<tr> 
<td><input class="button public" data-disable-with="Please wait..." name="commit" type="submit" value="Sign in"/></td> 
<td class="forgot_password"><a href="/passwords/new">Forgot your password?</a></td> 
</tr> 
</table> 
</form> 

Данные, POST, полученных после ручного входа в систему заключается в следующем:

utf8:✓ 
authenticity_token:l5+2s90FtEUsS3GHlr2tAktcxSW8jqgXx3mXEwIlAzE= 
session[email]:[email protected] 
session[password]:mypwd 
session[remember_me]:0 

Большое спасибо за помощь!

+0

ли страница входа ожидать JSON-кодированные данные, или форму в кодировке? Может быть, это просто не в состоянии проанализировать ваши опубликованные данные? –

+0

Да, я думаю, что это так, но я добавил 'json.dumps (payload)' для отправки в качестве моих данных, но форма не была отправлена. – Matt

+1

Данные POST от вашего ручного ведения журнала - где вы это получили? Есть ли вероятность, что вы можете выполнить тот же запрос с wirehark? Он _looks_, как будто вы вызываете 'запросы' правильно, и поэтому было бы неплохо определить, находится ли он на стороне клиента или сервера –

ответ

2

Какую версию запросов вы используете? Если это что-то между 0.14.x и 1.2.0, вы должны обновиться до 1.2.0. Cookies в сеансе не будут правильно настроены при перенаправлении, а 1.2.0 исправить это.

Другая проблема заключается в том, что вам, вероятно, следует проверить ответ от ses.post(url, data=payload). Вы должны обязательно проверить, что вы получаете код статуса (в данном случае, поскольку вы ожидаете перенаправления), что-то вроде строк 301 или 302.

Предполагая, что все вышесказанное проверено, ваш веб-сайт может быть делать некоторые фанки User-Agent анализ, и вы также можете проверить, что с браузером строки агента пользователя, например,

ses.headers['User-Agent'] = '...' 
response = ses.post(url, data=payload) 
final_response = ses.get(final_url) 
+0

+1 за то, что заставило меня понять, что моя версия устарела и сэкономит много горя на будущее. Также я передал заголовок, как вы предлагали, без видимого эффекта. Код статуса, который я получаю, составляет не 200, а не 301 или 302, поэтому я предполагаю, что я не передаю данные POST, как я должен быть. – Matt

+0

@Matt затем проверяет историю ответа на перенаправление. Кроме того, вы можете сделать следующее: 'ses.post (url, data = payload, allow_redirects = False)', который даст вам ответ перенаправления и сообщит вам, куда вы должны перенаправляться. Это может также препятствовать истечению срока действия вашего файла cookie, если он определяет, что вы очищаете сайт. –

+1

Спасибо, что посадили меня на правильном пути! Вы были очень полезны! – Matt

Смежные вопросы