2011-11-24 2 views
4

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

Вот код, который не может для меня:

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") 

ответ

4

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

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

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

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

Сайт не может сохранять вас, потому что:

  • Его имея чек на 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.

Отъезд .. !! :)

+0

Благодарим вас за ответ. Я работаю над клиентским программным обеспечением для некоторого сервиса, и я напрямую общаюсь с человеком, который реализует php-сервер. Пароль должен быть отправлен в качестве хэша md5 из соображений безопасности. И нет никаких скрытых полей формы. Я попробую использовать механизатор или Curl. –

+0

Рассмотрите возможность получения ответа, ответив на него и приняв ответ, нажав «галочку» рядом с ответом. Так вы благодаритесь за stackoverflow. –

+1

@TomRay Хеширование пароля таким образом, прежде чем отправлять его, на самом деле ничего не защищает - это просто предоставление * производного * пароля, который так же хорош, как пароль с точки зрения безопасности. Тот, кто реализовал эту службу, не думал четко. – zigg

2

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

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

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

И нож будет работать, как и ожидалось!

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