Как аутентифицировать сайт с помощью Python, используя urllib2? - PullRequest
3 голосов
/ 03 марта 2012

После долгих чтений здесь, в Stackoverflow, а также в Интернете, я все еще борюсь с тем, чтобы все заработало.

Моя задача: получить доступ к ограниченной части веб-сайта, для которого ячлен, использующий Python и urllib2.

Из того, что я прочитал, код должен выглядеть следующим образом:

mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()

url = 'http://www.domain.com'

mgr.add_password(None, url, 'username', 'password')
handler = urllib2.HTTPBasicAuthHandler(mgr)
opener = urllib2.build_opener(handler)

urllib2.install_opener(opener)

try:
    response = urllib2.urlopen('http://www.domain.com/restrictedpage')
    page = response.read()
    print page.geturl()
except IOError, e:
    print e

Печать не печатает "http://www.domain.com/restrictedpage",, но показывает" http://www.domain.com/login", поэтому мои учетные данные несохранено / обработано, и меня перенаправляют.

Как я могу заставить это работать?Я пытался в течение нескольких дней и продолжаю бить в одни и те же тупики.Я перепробовал все примеры, которые смог найти, но безрезультатно.

Мой главный вопрос: что нужно для аутентификации на сайте с использованием Python и urllib2?Быстрый вопрос: что я делаю не так?

Ответы [ 2 ]

11 голосов
/ 26 декабря 2013

Сначала проверьте вручную, что на самом деле происходит при успешной аутентификации (инструкции с Chrome):

  • Откройте инструменты разработчика в Chrome (Ctrl + Shift + I)
  • Нажмите Сетьtab
  • Идите и выполните аутентификацию вручную (перейдите на страницу, введите user + passwd + submit)
  • проверьте метод POST на вкладке Network инструментов разработчика
  • проверьте заголовки запроса, параметры строки запроса и данные формы.Там вы найдете всю необходимую информацию в своем собственном POST.

Затем установите расширение "Advanced Rest Client (ARC)" Chrome

Используйте ARC для созданиядействительный POST для аутентификации.

Теперь вы знаете, что должно быть в ваших заголовках и данных формы.Вот пример кода с использованием запросов, которые работали для меня на одном конкретном сайте:

import requests

USERNAME = 'user' # put correct usename here
PASSWORD = 'password' # put correct password here

LOGINURL = 'https://login.example.com/'
DATAURL = 'https://data.example.com/secure_data.html'

session = requests.session()

req_headers = {
    'Content-Type': 'application/x-www-form-urlencoded'
}

formdata = {
    'UserName': USERNAME,
    'Password': PASSWORD,
    'LoginButton' : 'Login'
}

# Authenticate
r = session.post(LOGINURL, data=formdata, headers=req_headers, allow_redirects=False)
print r.headers
print r.status_code
print r.text

# Read data
r2 = session.get(DATAURL)
print "___________DATA____________"
print r2.headers
print r2.status_code
print r2.text
0 голосов
/ 04 марта 2012

Для HTTP Basic Auth вы можете сослаться на это: http://www.voidspace.org.uk/python/articles/authentication.shtml

...