Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 24, 2012 10:14:22

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как проигнорировать ошибку перенаправления на другой url: urllib.error.HTTPError: HTTP Error 302

Возникла такая вот проблема, которую не могу решить своими силами.
Коротко словами: Требуется аутентификация при обращении на https страницу. Там мы вводим логин с паролем и после этого сервер всегда перенаправляет нас на один из двух url: в случае успеха или в случае удачи. Проблема в том, что в обоих случаях он выдает ошибку 302 (это у него такая особенность и от меня это не зависит). Все-бы ничего, но я urllib в этом случае завершает свою работу с генерацией ошибки, хотя успешный переход на новый url происходит.
Собственно, код:

import urllib.request, http.client
http.client.HTTPConnection.debuglevel = 1
params = urllib.parse.urlencode({'login': '***', 'password': '***'})
params = params.encode('utf-8')
request = urllib.request.Request('https://*****/login.php',
                                 data=params) 
opener = urllib.request.build_opener() # тут были попытки сделать свой RedirectHandler и ErrorProcessor
f = opener.open(request)
>>>
 Traceback (most recent call last):
......
urllib.error.HTTPError: HTTP Error 302: Found - Redirection to url '/interface.php' is not allowed
То есть дальше я ничего не могу делать с этой “открытой” страницей.
Может быть так принято писать сервера с выдачей ошибки 302, или может я не понимаю чего-то. Если у кого есть какие-нибудь размышления, я готов внимательно выслушать.
p.s. Тема эта для меня нова, поэтому мог не совсем корректно поставить вопрос.



Офлайн

#2 Июнь 24, 2012 10:47:46

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Как проигнорировать ошибку перенаправления на другой url: urllib.error.HTTPError: HTTP Error 302

POST Запрос редиректится, а urllib это не нравится:
FancyURLopener

Note According to the letter of RFC 2616, 301 and 302 responses to POST requests must not be automatically redirected without confirmation by the user. In reality, browsers do allow automatic redirection of these responses, changing the POST to a GET, and urllib reproduces this behaviour.

Вроде решение:
http://coding.derkeiler.com/Archive/Python/comp.lang.python/2009-01/msg01578.html

Еще, не увидел обработку кук, без них сайт не узнает, что клиент залогинен.

Если стандартной библиотекой не ограничены, рекомендую requests или Grab. В них таких проблем не должно быть, и пользоваться намного удобнее.

Офлайн

#3 Июнь 24, 2012 11:06:21

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как проигнорировать ошибку перенаправления на другой url: urllib.error.HTTPError: HTTP Error 302

Спасибо за инфо.
Если я ловлю эту ошибку (HTTPError 302), то по ней я могу узнать, что переключение произошло на ту страницу, которая считается successful. А подключив обработку кукисов, сервер еще и выдает SESSID.

# возможно, это чопорно, но смог таким образом получить cookie от сервера, хотя urllib и ругается на 302 ошибку
j = http.cookiejar.CookieJar()
.....
cookie_proc = urllib.request.HTTPCookieProcessor(  j )
opener = urllib.request.build_opener( cookie_proc )
.....
Значит ли, что мне больше ничего и не надо, если после этого мне нужно делать запрос уже на другую (заранее известную страницу) с указанием этого SESSID?
А с библиотеками ограничен, то есть возможность использования только стандартные, включенные в python.

p.s. Спасибо за ссылки на полезные библиотеки.



Отредактировано Isem (Июнь 24, 2012 11:12:46)

Офлайн

#4 Июнь 24, 2012 11:10:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

Как проигнорировать ошибку перенаправления на другой url: urllib.error.HTTPError: HTTP Error 302

Isem
Требуется аутентификация при обращении на https страницу. Там мы вводим логин с паролем и после этого сервер всегда перенаправляет нас на один из двух url: в случае успеха или в случае удачи.
http.client.HTTPSConnection() ?



Офлайн

#5 Июнь 24, 2012 11:15:09

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как проигнорировать ошибку перенаправления на другой url: urllib.error.HTTPError: HTTP Error 302

py.user.next
http.client.HTTPSConnection() ?
С помощью этих классов я даже не смог залогиниться, уж не знаю почему. Поэтому переключился на urllib после гугливания.



Офлайн

#6 Июнь 24, 2012 11:36:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

Как проигнорировать ошибку перенаправления на другой url: urllib.error.HTTPError: HTTP Error 302

Isem
я даже не смог залогиниться, уж не знаю почему
а как ты логинился ?
urllib делает то же самое



Отредактировано py.user.next (Июнь 24, 2012 11:36:55)

Офлайн

#7 Июнь 25, 2012 07:47:15

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Как проигнорировать ошибку перенаправления на другой url: urllib.error.HTTPError: HTTP Error 302

py.user.next
а как ты логинился ?
Ну сам логин проходит. Но я что-то не нашел, как ловить в этом случае редирект и кукисы.
Но, в общем то, проблему решил (с помощью urllib). Хотя, конечно, в другом варианте тоже было бы интересно разобраться.



Отредактировано Isem (Июнь 25, 2012 07:59:12)

Офлайн

#8 Июнь 25, 2012 09:34:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

Как проигнорировать ошибку перенаправления на другой url: urllib.error.HTTPError: HTTP Error 302

Isem
Ну сам логин проходит. Но я что-то не нашел, как ловить в этом случае редирект и кукисы.
а что там в ответе ?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version