Проксі в Delphi/Pascal
Delphi та Free Pascal залишаються популярними для розробки Windows-застосунків. Робота з проксі здійснюється через бібліотеки Indy (стандарт Delphi), Synapse та WinINet API.
Indy (Internet Direct)
Indy — це вбудована бібліотека Delphi для мережевого програмування.
HTTP Проксі
uses IdHTTP, IdSSLOpenSSL;
procedure FetchViaProxy;
var
HTTP: TIdHTTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
HTTP := TIdHTTP.Create(nil);
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
HTTP.IOHandler := SSL;
// Proxy configuration
HTTP.ProxyParams.ProxyServer := 'proxy_ip';
HTTP.ProxyParams.ProxyPort := 8080;
HTTP.ProxyParams.ProxyUsername := 'username';
HTTP.ProxyParams.ProxyPassword := 'password';
HTTP.ProxyParams.BasicAuthentication := True;
WriteLn(HTTP.Get('https://httpbin.org/ip'));
finally
SSL.Free;
HTTP.Free;
end;
end;
SOCKS5 Проксі через Indy
uses IdHTTP, IdSocks, IdSSLOpenSSL;
procedure FetchViaSocks5;
var
HTTP: TIdHTTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
Socks: TIdSocksInfo;
begin
HTTP := TIdHTTP.Create(nil);
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
Socks := TIdSocksInfo.Create(nil);
try
// SOCKS5 configuration
Socks.Host := 'proxy_ip';
Socks.Port := 1080;
Socks.Version := svSocks5;
Socks.Username := 'username';
Socks.Password := 'password';
Socks.Authentication := saUsernamePassword;
SSL.TransparentProxy := Socks;
HTTP.IOHandler := SSL;
WriteLn(HTTP.Get('https://httpbin.org/ip'));
finally
Socks.Free;
SSL.Free;
HTTP.Free;
end;
end;
SOCKS4
Socks.Version := svSocks4;
// SOCKS4 does not support authentication
Socks.Authentication := saNoAuthentication;
Synapse
Synapse — це альтернативна мережева бібліотека для Free Pascal та Delphi.
Встановлення
Завантажте з synapse.ararat.cz та додайте до свого проєкту.
HTTP Проксі
uses httpsend;
procedure FetchViaSynapseProxy;
var
HTTP: THTTPSend;
begin
HTTP := THTTPSend.Create;
try
HTTP.ProxyHost := 'proxy_ip';
HTTP.ProxyPort := '8080';
HTTP.ProxyUser := 'username';
HTTP.ProxyPass := 'password';
if HTTP.HTTPMethod('GET', 'https://httpbin.org/ip') then
WriteLn(HTTP.Document.DataString)
else
WriteLn('Error: ', HTTP.ResultCode);
finally
HTTP.Free;
end;
end;
SOCKS через Synapse
uses blcksock;
procedure FetchViaSynapseSocks;
var
Sock: TTCPBlockSocket;
begin
Sock := TTCPBlockSocket.Create;
try
Sock.SocksIP := 'proxy_ip';
Sock.SocksPort := '1080';
Sock.SocksUsername := 'username';
Sock.SocksPassword := 'password';
Sock.SocksType := ST_Socks5;
Sock.Connect('httpbin.org', '80');
if Sock.LastError = 0 then begin
Sock.SendString('GET /ip HTTP/1.1' + #13#10 +
'Host: httpbin.org' + #13#10 +
#13#10);
WriteLn(Sock.RecvString(10000));
end;
finally
Sock.Free;
end;
end;
WinINet API (Windows)
Використання системного Windows API:
uses WinInet;
procedure FetchViaWinINet;
var
hInternet, hConnect: HINTERNET;
Buffer: array[0..4095] of Char;
BytesRead: DWORD;
begin
// Open with proxy
hInternet := InternetOpen(
'MyApp',
INTERNET_OPEN_TYPE_PROXY,
PChar('http://proxy_ip:8080'),
nil,
0
);
if hInternet <> nil then begin
// Set proxy authentication
InternetSetOption(hInternet, INTERNET_OPTION_PROXY_USERNAME,
PChar('username'), Length('username'));
InternetSetOption(hInternet, INTERNET_OPTION_PROXY_PASSWORD,
PChar('password'), Length('password'));
hConnect := InternetOpenUrl(hInternet,
'https://httpbin.org/ip', nil, 0,
INTERNET_FLAG_RELOAD, 0);
if hConnect <> nil then begin
InternetReadFile(hConnect, @Buffer, SizeOf(Buffer), BytesRead);
WriteLn(Copy(Buffer, 1, BytesRead));
InternetCloseHandle(hConnect);
end;
InternetCloseHandle(hInternet);
end;
end;
Використання системних проксі
hInternet := InternetOpen(
'MyApp',
INTERNET_OPEN_TYPE_PRECONFIG, // use system settings
nil,
nil,
0
);
Ротація проксі
type
TProxyInfo = record
Host: string;
Port: Integer;
Username: string;
Password: string;
end;
var
Proxies: array of TProxyInfo;
ProxyIndex: Integer = 0;
function GetNextProxy: TProxyInfo;
begin
Result := Proxies[ProxyIndex mod Length(Proxies)];
Inc(ProxyIndex);
end;
procedure FetchWithRotation(const URL: string);
var
HTTP: TIdHTTP;
Proxy: TProxyInfo;
begin
Proxy := GetNextProxy;
HTTP := TIdHTTP.Create(nil);
try
HTTP.ProxyParams.ProxyServer := Proxy.Host;
HTTP.ProxyParams.ProxyPort := Proxy.Port;
HTTP.ProxyParams.ProxyUsername := Proxy.Username;
HTTP.ProxyParams.ProxyPassword := Proxy.Password;
try
WriteLn(HTTP.Get(URL));
except
on E: Exception do
WriteLn('Error with proxy ', Proxy.Host, ': ', E.Message);
end;
finally
HTTP.Free;
end;
end;
Поради
- Indy — стандартний вибір для Delphi, постачається з IDE
- Synapse — для Free Pascal та кросплатформних проєктів
- WinINet — лише для Windows-застосунків, використовує системний стек
- Для SOCKS використовуйте Indy TIdSocksInfo або Synapse SocksType
- OpenSSL DLL — не забудьте розмістити libeay32.dll та ssleay32.dll поруч із вашим exe для HTTPS
Висновок
Delphi/Pascal надають зрілі інструменти для роботи з проксі. Indy є найбільш комплексним рішенням, що підтримує HTTP, SOCKS4, SOCKS5 та автентифікацію. Для простих завдань на Windows WinINet API є швидким варіантом без зовнішніх залежностей.