Давненько собирался разобраться с тем как использовать разные прокси в 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 и др.
|
Толковая статья, ставлю google +1
благодарствую =)
Здравствуйте!
пробую написать свой парсер странички, и остался момент с авторизацией на проксе
пытаюсь авторизоваться на сайте, все работало, до того как не появился прокси сервер.
кажется там 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
помогите пожалуйста пройти авторизацию на прокси сервере
если будет надо скину дополнительную инфу. спасибо
Synapse не умеет работать с прокси с NTLM-авторизацией.
Мне удалось допилить с помощью http://cryptocode.ru/synapse/NTLMAuthDemoApps_Synapse38b2.zip
Посмотрел как это реализовано у них и перенес их доработки на текущую версию Synapse.
>>Synapse не умеет работать с прокси с NTLM-авторизацией.
Я таакие прокси никогда не использовал. За ссылочку спасибо — кому-нибудь пригодиться
можно ссылочку обновить? Спасибо!
>> Мне удалось допилить с помощью http://cryptocode.ru/synapse/NTLMAuthDemoApps_Synapse38b2.zip
Посмотрел как это реализовано у них и перенес их доработки на текущую версию Synapse.
Можете выложить на текущую версию Synapse где-нибудь, если нетрудно?
Добрый день! Как ни странно, актуально, но в сети все ссылки удалены. Из Delphi5 с Synapse не могу через прокси с NTLM файлы качать. Через браузеры все работает как SSO с аутентификацией пользователя, а из программы никак. Помогите новой ссылочкой, пожалуйста!
Прошло 11 лет после вашего ответа, живой ссылки по NTLM для Синапса в сети уже нет. Может где-то у Вас завалялся этот архив с демо
Здравствуйте. Все ссылки на демки собраны на этой странице https://webdelphi.ru/razrabotchiku/isxodniki-delphi/#synapse Самих исходников синапса, к сожалению, не сохранилось
Столкнулся с проблемой при работе с сокс5.
httpsend.Timeout:=10000;
httpsend.Sock.SocksTimeout:=10000;
Но если сокс-сервер не рабочий, то ждешь все равно 21000. Это долго. Кто как решил эту проблему?
Даже больше напишу:
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 секунду! Как это исправить?
HTTP.Sock.SocksResolver:=False;
Пытаюсь чекать прокси с помощью Synapse. Список ip:port подставляю из результата Масскана. Главная проблема — утечка памяти. После чека 100к хостов программа наглухо виснет и ее размер в отведенной памяти возрастает в разы, с медленной динамикой во время работы. try….finaly не помогает. Есть ли идеи улучшить стабильность?
Видимо, нужно найти откуда идет утечка памяти? ReportMemoryLeaksOnShutdown := true; в секции initialization выставлять пробовали? Помогает в поиске утечек
Использую 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.
Разобрался. Не корректно работает Synapse с последними обновлениями версия [r207]. С версией [r150] — он же релиз 40 все работает. Всем спасибо. ;)