Авторизация на сайте через прокси с аутентификацией на 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.
Исходный код можно найти тут.