HTTP proxy сервера сегодня самые популярные. Возможность их использования включена во многие программы: браузеры, download менеджеры, ICQ-клиенты и т.д. Соответственно, в Сети Вы можете обнаружить уйму сайтов, раздающих списки HTTP proxy, есть прокси-чекалки, проверяющие списки проксей на работоспособность, так как proxy часто “умирают”. Про проверку на “смерть” прокси мы поговорим позднее, а пока про использование.
Итак, у клиента THTTPSend для работы с прокси имеются следующие свойства:
property ProxyHost: string read FProxyHost Write FProxyHost;//хост ли IP proxy //порт по которому идёт подключение property ProxyPort: string read FProxyPort Write FProxyPort; //логин, если требуется авторизация property ProxyUser: string read FProxyUser Write FProxyUser; //пароль property ProxyPass: string read FProxyPass Write FProxyPass;
Для того, чтобы использовать в работе HTTP proxy достаточно прописать у клиента необходимые параметры, например, так:
with THTTPSend.Create do begin ProxyHost:='156.123.128.133'; ProxyPort:='8080'; if HTTPMethod('GET','http://www.webdelphi.ru') then begin {Тут обрабатываем контент} end else begin {тут говорим, что всё плохо и обрабатываем ошибки} end; end;
Если прокся «живая», то ваш запрос успешно обработается и вернется код 200, если «мертвая», то можете получить кучу ошибок, начиная от 500 до всяких 1091 и т.д.
Проверка прокси в Delphi
Вначале немного размышлений на тему проверки прокси на работоспособность. Первое, что приходит на ум, когда речь идёт о проверке сервера – это отправить пинг или проверить соединение по заданному порту. Может это решение и более выгодное в плане затрат времени на проверку, но не всегда дает положительный результат, т.к. на тот же порт, который использовал наш прокси его владелец теоретически может повесить и простой сервис, например, по проверки тех же списков прокси. Как вариант можно задать нашему клиенту THTTPSend параметры проверяемого прокси и попробовать загрузить какую-нибудь заранее известную легковесную страничку из Интернет – если грузится, значит все в порядке, прокси рабочий. Реализовать такую проверку в Delphi – раз плюнуть. Другой вопрос, более сложный в плане реализации – проверка на анонимность и прозрачность.
Во-первых, немного понятий.
Прозрачные proxy (transparent proxy) – никак не скрывают ни Ваш IP-адрес, ни факт использования прокси. Для парсинга чего-либо этот тип прокси подходит весьма слабо т.к. к гуглу ходить не надо, поисковик да и любой сервер с проверкой на прокси легко “выцепит” вас с такой проксей.
Анонимные proxy (anonymous proxy) – все прокси так или иначе скрывающие Ваш IP-адрес можно назвать анонимными. Этот тип прокси можно поделить на следующие:
Простые анонимные (anonymous proxy) – скрывают только Ваш IP-адрес, заменяя его на свой, но никак не скрывают факт использования прокси.
Искажающие proxy (distorting proxy) – как и простые анонимные прокси эти не срывают факт использования прокси, но скрывают Ваш IP-адрес, заменяя его случайным адресом.
Элитные анонимные proxy (high anonymous / elite proxy) – полностью скрывают факт использования прокси.
Понятное дело, что самые распространенные из анонимных – это простые анонимные прокси. Остается открытым вопрос – как узнать на сколько анонимным является прокси?
Вариантов в принципе много, но все они сводятся к одному простому и вместе с тем эффективному методу – проверка переменных окружения (информации, передаваемой клиентом серверу). Уверен, что на Delphi можно написать программу, совмещающую в себе и клиент и сервер и чекать прокси “не отходя от кассы”, но наиболее простой вариант – это найти в сети онлайн-чекер и отсылать на него запрос через THTTPSend, предварительно настроенный на проверяемый прокси. После чего – парсим страницу с выдачей сервиса и делаем вывод о прозрачности. Конечно, недостаток такого подхода есть, хотя бы даже по тому, что верстка сервиса может поменяться и придётся переписывать регулярные выражения, а может и лезть в код программы, но вариант относительно прост в использовании, надо только знать какие переменные окружения проверять, а переменные будут следующими:
REMOTE_ADDR — IP адрес клиента
HTTP_VIA — если не пустая, значит используется proxy.
HTTP_X_FORWARDED_FOR — если не пустая, значит используется proxy. Значение — реальный IP адрес клиента.
Алгоритм проверки на анонимность может быть следующий:
Если REMOTE_ADDR = Ваш IP, то прокси не используется;
1. Если выполняются следующие условия:
REMOTE_ADDR = proxy IP,
HTTP_VIA = proxy IP,
HTTP_X_FORWARDED_FOR = Ваш IP
то используется прозрачный proxy
2. Если выполняются условия:
REMOTE_ADDR = IP proxy
HTTP_VIA = IP proxy
HTTP_X_FORWARDED_FOR = IP proxy
то используется простой анонимный proxy
3. Если выполняются условия:
REMOTE_ADDR = IP proxy
HTTP_VIA = IP proxy
HTTP_X_FORWARDED_FOR = случайный IP
то используется искажающий proxy
4. Если выполняются условия:
REMOTE_ADDR = IP proxy
HTTP_VIA = не определен
HTTP_X_FORWARDED_FOR = не определен
то используется элитный proxy
Теперь, что касается сервиса для проверки. Если у Вас есть возможность разместить собственный скрипт проверки в Сети, то это будет замечательно, т.к. в этом случае Вы всегда будете в курсе всех изменений на странице (вы же будете её менять) и парсить такую страничку будет элементарно. Самый простой скрипт проверки одного прокси может быть таким:
<?php echo "\r\n"."REMOTE_ADDR=".getenv('REMOTE_ADDR'); echo "\r\n"."HTTP_X_FORWARDED_FOR=".getenv('HTTP_X_FORWARDED_FOR'); echo "\r\n"."HTTP_VIA=".getenv('HTTP_VIA'); ?>
Каждая переменная окружения будет размещаться на новой строке, а значение от названия будет отделяться знаком «=» — распирсить такой текст элементарно просто и, думаю, что даже при минимальных навыках работы с Сетью Вы справитесь с задачей быстро.
Остался последний вопрос – как узнать тип прокси? Первый способ – по косвенному признаку – номеру порта. SOCKS proxy часто содержат порт 1081 или 1080, HTTP proxy часто содержат 80 или 8080. Но часто не значит всегда. Поэтому пока я вижу один более менее правильный вариант проверки типа прокси с использованием Synapse:
Вначале настроить клиента на использование прокси как HTTP – если появится ошибка, то перенастроить прокси как SOCKS4/5 и повторить попытку. Если обе попытки провальный, то прокси “мёртвый”, если какая-либо попытка оказалась успешной – анализируем переменные окружения и делаем вывод о прозрачности/анонимности proxy.
Кстати, ещё одним немаловажным моментом является время ответа сервера. Если используется proxy, то время на выполнение запроса неизбежно возрастает и иногда значительно, поэтому важно иметь под рукой не список не только рабочих, но и быстрых прокси.
Вот, пожалуй и вся информация о том, как использовать proxy в Delphi, а конкретнее – с библиотекой Synapse.