Авторизация на сайте через прокси с аутентификацией на Python

На самом деле такой пугающе сложный заголовок описывает весьма тривиальную задачу.
Совсем недавно мне понадобилось написать приложение на Python, которое бы из-за HTTP прокси сервера с аутентификацией (используя логин и пароль), заходило бы на сайт рекламной сети и проверяло баланс аккаунта. Для выполнения задумки был использован Python 2.7.1.

Многие пользователи могут подумать про себя: «Что тут такого особенного? Описываем Handler прокси, а дальше urllib2 и все готово». Однако на словах все проще, чем в реализации. Приступим к написанию программы.

В первую очередь мы импортируем такие модули (зачем будет нужен модуль cookielib, я объясню позже):

import urllib2,urllib,cookielib


Дальше наши данные от прокси:

proxys = "192.168.23.4:8080" # в формате прокси:порт
user = "login" # прокси логин
password = "password" # прокси пароль


Ну и собственно начинаем строить нашу программу по кирпичикам.
Прежде всего инициализируем прокси и собираем все воедино:
proxy = urllib2.ProxyHandler({"http" : proxys}) #инициализация 
proxy_auth_handler = urllib2.ProxyBasicAuthHandler() # инициализация авторизации в прокси
proxy_auth_handler.add_password('realm', 'uri', user, password) # добавляем логин и пароль в прокси


Теперь наверное самая важная часть, на которой мне и попались подводные камни. Дело в том что тут уже можно было применить методы urllib2.build_opener() и urllib2.install_opener() и спокойно получать страничку через прокси, используя обычный urllib2.urlopen() с параметрами для авторизации, но не тут то было. Все работало, данные отправлялись, но в ответ мне возвращалась сиротливая страничка '404'.
Тут пришло время копнуть глубже. Установив Firebug расширение для Mozilla Firefox, я узнал что между страницей авторизации и до самого входа в аккаунт, есть некая промежуточная страничка, которая только сообщала «302 Found», и установив кукисы, уже оттуда перекидала пользователя в аккаунт.

Вот и приходит на помощь библиотека cookielib, которая помогает, так сказать, устранить такие проблемы.

cookieJar = cookielib.CookieJar() # инициализация cookielib


Важный момент! Мы должны собрать все методы за одну инициализацию urllib2.build_opener()!

# собираем загрузчик прокси, авторизации и кукилиба
opener = urllib2.build_opener(proxy, proxy_auth_handler,urllib2.HTTPCookieProcessor(cookieJar))
urllib2.install_opener(opener) # устанавливаем загрузчик


Вот и все. Можно смело отправлять запросы на авторизацию, не боясь что она провалиться
( В данном случае для авторизации использован POST запрос).

params = urllib.urlencode({'name' : 'user_login','pass' : 'user_password','submit' : 'Войти'})
get = urllib2.Request("http://testsite.ru/?a=enter" , params)
f = opener.open(get,params)
f = f.read() # читаем ответ и выводим в консоль
print f


Дальше можно смело ходить по аккаунту и парсить данные используя регулярные выражения или
модуль Beautiful Soup.

Исходный код можно найти тут.


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.