Python CookieJar сохраняет куки, но не отправляет их на сайт - PullRequest
4 голосов
/ 24 ноября 2011

Я пытаюсь зайти на сайт, используя urllib2 и cookiejar. Это сохраняет идентификатор сеанса, но когда я пытаюсь открыть другую ссылку, которая требует аутентификации, он говорит, что я не вошел в систему. Что я делаю неправильно?

Вот код, который мне не удался:

import urllib
import urllib2
import cookielib

cookieJar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))

# Gives response saying that I logged in succesfully
response = opener.open("http://site.com/login", "username=testuser&password=" + md5encode("testpassword"))

# Gives response saying that I am not logged in
response1 = opener.open("http://site.com/check")

Ответы [ 2 ]

4 голосов
/ 24 ноября 2011

Ваша реализация выглядит нормально ... и должна работать.

Должно быть отправлено правильное значение cookies, но я вижу это как случай, когда сайт фактически не регистрирует вас.

Как вы можете сказать, что он не отправляет cookies или может быть cookies, который вы получаете, не тот, который аутентифицирует вас.

Используйте: response.info(), чтобы увидеть заголовки ответов, чтобы увидеть, какие куки вы получаете на самом деле.

Возможно, сайт не регистрирует вас, потому что:

  • Имеется проверка на User-agent, которую вы не устанавливаете, поскольку некоторые сайты открываются из 4 основных браузеров только для запрета доступа к ботам.

  • Сайт может искать какое-то специальное скрытое поле формы, которое вы, возможно, не отправляете.

1 совет:

from urllib import urlencode
# Use urlencode to encode your data

data = urlencode(dict(username='testuser', password=md5encode("testpassword")))
response = opener.open("http://site.com/login", data)

Более того, здесь 1 странная вещь:

  • Вы md5 кодируете свой пароль перед отправкой. (Strange)
  • Обычно это делается сервером перед сравнением с базой данных.
  • Это возможно, только если site.com реализует md5 в javascript.
  • Это очень редкий случай, поскольку только 0,01% веб-сайтов могут это сделать.
  • Убедитесь, что это может быть проблемой, и вы предоставляете хешированную форму, а не реальный пароль для сервера.
  • Итак, сервер снова вычислил бы md5 для вашего хеша md5.

Выезд .. !! :)

2 голосов
/ 19 сентября 2012

У меня была похожая проблема с моим собственным тестовым сервером, который нормально работал с браузером, но не с решением urllib2.build_opener.

Проблема, похоже, в urllib2.Как подсказывают эти ответы , проще использовать более мощную механизированную библиотеку вместо urllib2:

cookieJar = cookielib.CookieJar()
browser = mechanize.Browser()
browser.set_cookiejar(cookieJar)
opener = mechanize.build_opener(*browser.handlers)

И открыватель будет работать как положено!

...