уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

logo_proxy

Давненько собирался разобраться с тем как использовать разные прокси в Synapse, но всё как-то не подворачивалась задача для применения проксей на практике, потом вроде бы подвернулась тема — времени не было, появилось время.

Подвернулась как раз необходимая задачка. Суть которой заключается в том, чтобы парсить большое количество страниц с Яндекс и Гугл (не только для проверки нахождения страницы в индексе). Как известно, при очень частом обращении с одного IP-адреса Яндекс может наказать “злоумышленника” показав вместо страницы с информацией фигушку каптчу. Решением для небольших програмок-парсилок может быть банальная задержка в несколько секунд между запросами. Однако, когда количество запросов переваливает, скажем за 1000 задержка может выйти боком для пользователя, т.к. отрабатывать программка будет очень уж долго. Решением проблемы является использование прокси и библиотека Synapse дает нам возможность использовать как HTTP так и SOCKS4 и SOCKS5 прокси.

Использование HTTP proxy

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://webdelphi.ru') then
      begin
        {Тут обрабатываем контент}
      end
    else
      begin
        {тут говорим, что всё плохо и обрабатываем ошибки}
      end;
    end;

Если прокся «живая», то ваш запрос успешно обработается и вернется код 200, если «мертвая», то можете получить кучу ошибок, начиная от 500 до всяких 1091 и т.д.

Использование SOCKS proxy

Отличительной особенностью этого типа прокси является то, что SOCKS позволяет работать с любыми (версия Socks 4 — с TCP, Socks 5 — с TCP и UDP) протоколами. SOCKS proxy передает данные от клиента к серверу, не вникая в содержимое и поэтому может работать с HTTP, FTP, SMTP, POP3, NNTP и т.д. Так как SOCKS дают нам с вами больше возможностей их применения, а сами прокси различаются по версии, то, соответсвенно, и в Synapse для этого вида прокси отведено большее количество свойств:

//IP-адрес прокси
property SocksIP: string read FSocksIP write FSocksIP;
//Порт SOCKS сервера. DПо умолчанию '1080'
property SocksPort: string read FSocksPort write FSocksPort;
//пользователь
property SocksUsername: string read FSocksUsername write FSocksUsername;
//пароль
property SocksPassword: string read FSocksPassword write FSocksPassword;
//время ожидания ответа от сервера. По умолчанию 1 минута - 60000;
property SocksTimeout: integer read FSocksTimeout write FSocksTimeout;
//Если True, то символьные имена хостов не переводятся в IP-адреса, но передаются через proxy
property SocksResolver: Boolean read FSocksResolver write FSocksResolver;
//Тип SOCKS. По умолчанию используются SOCKS5}
property SocksType: TSocksType read FSocksType write FSocksType;
//True если класс использует SOCKS proxy
property UsingSocks: Boolean read FUsingSocks;
//Если соединение с SOCKS proxy провалено, то это свойство содержит код ошибки
property SocksLastError: integer read FSocksLastError;

 

Первая проблема с которой Вы можете столкнуться при использовании SOCKS proxy в Synapse — это ошибка «Connection Timed Out» или “10061 Connection refused” и, наконец, 10054 “Connection Reset by peer” при том, что прокси будет 100% рабочая. Решить проблему помогает флаг SocksResolver – устанавливаете его в False и соединение проходит как надо. В принципе – эта проблема оказалась на данный момент единственной с которой я столкнулся при использовании SOCKS proxy в Synapse.

Пример использования SOCKS proxy аналогичен тому, что приведен выше для HTTP proxy, поэтому особенно на нем останавливаться не будем, а лучше перейдем к более интересному вопросу – как проверять прокси на работоспособность, анонимность, прозрачность и т.д.

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

Вот, пожалуй и вся информация о том, как использовать proxy в Delphi, а конкретнее – с библиотекой Synapse. Здесь я не старался выкладывать горы кода Delphi, реализующего проверку прокси в многопоточном режиме и т.д. – всё это можно написать самостоятельно, имея достаточно навыков по работе с Delphi в принципе.

Книжная полка

Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
17 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Владимир Богдановский

Толковая статья, ставлю google +1

Марсель
Марсель
02/04/2013 14:15

Здравствуйте!
пробую написать свой парсер странички, и остался момент с авторизацией на проксе
пытаюсь авторизоваться на сайте, все работало, до того как не появился прокси сервер.
кажется там NTLM авторизация

HTTP/1.0 407 Proxy Authentication Required
Server: squid/2.7.STABLE7
Date: Tue, 02 Apr 2013 08:02:35 GMT
Content-Type: text/html
Content-Length: 1290
X-Squid-Error: ERR_CACHE_ACCESS_DENIED 0
Proxy-Authenticate: NTLM
Proxy-Authenticate: Basic realm=»Squid proxy-caching web server»
X-Cache: MISS from squid_work.icb.local
Via: 1.0 squid_work.icb.local:3128 (squid/2.7.STABLE7)
Connection: keep-alive
Proxy-Connection: keep-alive

помогите пожалуйста пройти авторизацию на прокси сервере
если будет надо скину дополнительную инфу. спасибо

toxicdream
toxicdream
09/07/2013 16:33
Ответить на  Марсель

Synapse не умеет работать с прокси с NTLM-авторизацией.
Мне удалось допилить с помощью http://cryptocode.ru/synapse/NTLMAuthDemoApps_Synapse38b2.zip
Посмотрел как это реализовано у них и перенес их доработки на текущую версию Synapse.

Tabu13
Tabu13
02/03/2021 04:18
Ответить на  Vlad

можно ссылочку обновить? Спасибо!

Wild Pointer
15/01/2014 12:10
Ответить на  toxicdream

>> Мне удалось допилить с помощью http://cryptocode.ru/synapse/NTLMAuthDemoApps_Synapse38b2.zip
Посмотрел как это реализовано у них и перенес их доработки на текущую версию Synapse.
Можете выложить на текущую версию Synapse где-нибудь, если нетрудно?

Tabu13
Tabu13
02/03/2021 04:17
Ответить на  toxicdream

Добрый день! Как ни странно, актуально, но в сети все ссылки удалены. Из Delphi5 с Synapse не могу через прокси с NTLM файлы качать. Через браузеры все работает как SSO с аутентификацией пользователя, а из программы никак. Помогите новой ссылочкой, пожалуйста!

zubr12345
zubr12345
28/12/2023 20:46
Ответить на  toxicdream

Прошло 11 лет после вашего ответа, живой ссылки по NTLM для Синапса в сети уже нет. Может где-то у Вас завалялся этот архив с демо

Proger
Proger
14/05/2014 12:31

Столкнулся с проблемой при работе с сокс5.
httpsend.Timeout:=10000;
httpsend.Sock.SocksTimeout:=10000;

Но если сокс-сервер не рабочий, то ждешь все равно 21000. Это долго. Кто как решил эту проблему?

Proger
Proger
14/05/2014 17:40

Даже больше напишу:

httpsend.Sock.SocksType := ST_Socks5;
httpsend.Sock.SocksIP:=’192.168.1.10′;
httpsend.Sock.SocksPort:=’4081′;

httpsend.Timeout:=5000;
httpsend.Sock.SocksTimeout:=5000;
httpsend.Sock.SetTimeout(5000);
httpsend.Sock.SetSendTimeout(5000);
httpsend.Sock.SetRecvTimeout(5000);

Сокс не работает. И вместо того, чтобы ждать 5сек и получить ответ об ошибке соединения, жду 21 секунду (какое-то магическое значение, где данное время прописанно, я не нашел). Как сделать время ожидания 5 сек, а на 21?
Вот и нашел слабое место synapse — таймауты.
Кстати, даже если напрямую без прокси пытаться открыть несуществующий сайт, например http://192.168.10.10, то все равно ждем эти магические 21 секунду! Как это исправить?

AnGel
AnGel
16/07/2017 07:59
Ответить на  Proger

HTTP.Sock.SocksResolver:=False;

Anatol
Anatol
24/08/2017 07:06

Пытаюсь чекать прокси с помощью Synapse. Список ip:port подставляю из результата Масскана. Главная проблема — утечка памяти. После чека 100к хостов программа наглухо виснет и ее размер в отведенной памяти возрастает в разы, с медленной динамикой во время работы. try….finaly не помогает. Есть ли идеи улучшить стабильность?

Александр
29/10/2017 04:14

Использую Free Pascal 3.0 на Ubuntu 16.04

При обращении через прокси к http — все ок код 200
выбираю страницу https — прокси не отвечает, код 500.

Проблема в недостающих dll которые есть под Windows?

проверял на заведомо рабочих прокси (

uses classes,httpsend,blcksock,ssl_openssl;
var url,result:string; HTTP:THttpSend; list:TStringList;
begin
HTTP:=THttpSend.Create;
HTTP.KeepAliveTimeout:=3000;
HTTP.proxyHost:=’112.140.184.136′;
HTTP.proxyPort:=’3128′;
HTTP.Protocol:=’1.1′;
HTTP.UserAgent:=’Mozilla/5.0′;
HTTP.HTTPMethod(‘GET’,url);
list:=TStringList.Create;
list.LoadFromStream(HTTP.Document);
str(HTTP.ResultCode,result);
writeln(result+#13#10+list.Text);
writeln(HTTP.Headers.Text);
writeln(HTTP.Cookies.Text);
list.Free;
HTTP.Free;
end.

Александр
31/10/2017 02:17

Разобрался. Не корректно работает Synapse с последними обновлениями версия [r207]. С версией [r150] — он же релиз 40 все работает. Всем спасибо. ;)