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, то время на выполнение запроса неизбежно возрастает и иногда значительно, поэтому важно иметь под рукой не список не только рабочих, но и быстрых прокси.

P.S.

Вот, пожалуй и вся информация о том, как использовать proxy в Delphi, а конкретнее – с библиотекой Synapse.