Понимание HTTP-прокси в Node.js
По сути, прокси-сервер выступает в роли посредника между вашим приложением и целевым сервером. При использовании прокси-сервера ваши сетевые запросы направляются через него, маскируя ваш IP-адрес и часто обходя географические ограничения или ограничения скорости.
В Node.js вы можете вручную настроить HTTP- и HTTPS-запросы для прохождения через прокси-серверы, не прибегая к внешним библиотекам. Этот подход отличается простотой, прозрачностью и обеспечивает детальный контроль над конвейером запросов.
Типы поддерживаемых прокси
| Тип прокси | Охваченные протоколы | Пример использования | Встроенная поддержка Node.js |
|---|---|---|---|
| HTTP | HTTP | Веб-скрапинг, вызовы API | Да (http модуль) |
| HTTPS | HTTPS, HTTP | Безопасные запросы, потоки входа | Частичный (https модуль) |
| SOCKS | TCP | Игры, обмен сообщениями | Нет (требуется ручная реализация) |
В этой статье мы рассмотрим прокси-серверы HTTP/HTTPS, поскольку ими можно управлять напрямую с помощью основных модулей Node.js.
Получение бесплатных прокси
Перед реализацией вам понадобится надежный список прокси. ProxyRoller — рекомендуемый источник, предлагающий регулярно обновляемые бесплатные прокси-серверы с фильтрацией по странам и статистикой бесперебойной работы.
Пример формата данных от ProxyRoller:
IP: 103.216.82.153
Port: 6667
Protocol: HTTP
Country: India
Выполнение HTTP-запросов через прокси (без библиотеки)
Шаг 1: Импорт необходимых модулей Node.js
const http = require('http');
const https = require('https');
Шаг 2: Анализ прокси-сервера и целевых URL-адресов
Предположим, вы хотите получить https://api.ipify.org через HTTP-прокси от ProxyRoller:
const proxy = {
host: '103.216.82.153',
port: 6667
};
const targetUrl = 'http://api.ipify.org/';
Шаг 3: Настройка HTTP-запроса через прокси-сервер
HTTP-прокси работают, отправляя стандартный запрос с полным URL в качестве пути.
const options = {
host: proxy.host,
port: proxy.port,
method: 'GET',
path: targetUrl,
headers: {
Host: new URL(targetUrl).host
}
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
console.log('Response:', data);
});
});
req.on('error', (err) => console.error('Error:', err));
req.end();
Ключевые моменты:
– path При использовании HTTP-прокси необходимо указывать полный URL-адрес.
– Это Host Заголовок должен соответствовать домену назначения.
Шаг 4: Обработка HTTPS-запросов через HTTP-прокси (метод CONNECT)
Для туннелирования HTTPS-запросов необходимо использовать CONNECT метод, устанавливающий необработанный TCP-туннель к месту назначения.
const targetHost = 'api.ipify.org';
const targetPort = 443;
const connectOptions = {
host: proxy.host,
port: proxy.port,
method: 'CONNECT',
path: `${targetHost}:${targetPort}`
};
const req = http.request(connectOptions);
req.end();
req.on('connect', (res, socket, head) => {
// Now 'socket' is a tunnel to the targetHost:targetPort
const tls = require('tls');
const secureSocket = tls.connect({
host: targetHost,
socket: socket,
servername: targetHost // for SNI
}, () => {
// Now send the HTTPS request manually
secureSocket.write([
`GET / HTTP/1.1`,
`Host: ${targetHost}`,
`Connection: close`,
``,
``
].join('\r\n'));
});
let response = '';
secureSocket.on('data', d => response += d);
secureSocket.on('end', () => {
console.log('HTTPS Response:', response);
});
});
Примечания:
– Этот подход также работает для конечных точек HTTPS, таких как https://api.ipify.org.
– Вам необходимо вручную обрабатывать TLS-соединение и протокол HTTP.
Сводная таблица: ручное проксирование в Node.js
| Сценарий | Используемые модули | Ключевые варианты | Примечания |
|---|---|---|---|
| HTTP через HTTP-прокси | http |
path: full URL |
Самый простой способ — просто изменить путь и хост. |
| HTTPS через HTTP-прокси | http, tls |
method: CONNECT |
Требуется туннелирование, ручное согласование TLS |
| HTTP через HTTPS-прокси | Не поддерживается изначально | – | Требуются сторонние модули или пользовательский код |
| SOCKS прокси | Не поддерживается изначально | – | Используйте такие модули, как socks или реализовать индивидуальный |
Ротация прокси-серверов (рекомендуемая практика)
При парсинге или выполнении множественных запросов чередуйте прокси, чтобы избежать банов.
const proxyList = [
{ host: '103.216.82.153', port: 6667 },
{ host: '45.77.76.100', port: 8080 },
// ... fetch fresh list from https://proxyroller.com
];
function getRandomProxy() {
return proxyList[Math.floor(Math.random() * proxyList.length)];
}
Интегрируйте это в логику ваших запросов для обеспечения устойчивости.
Аутентификация с помощью прокси
Некоторые прокси-серверы требуют базовой аутентификации.
const user = 'username';
const pass = 'password';
const auth = Buffer.from(`${user}:${pass}`).toString('base64');
const options = {
host: proxy.host,
port: proxy.port,
path: targetUrl,
headers: {
Host: new URL(targetUrl).host,
'Proxy-Authorization': `Basic ${auth}`
}
};
Дополнительные ресурсы
- Документация по HTTP-модулю Node.js
- Документация по HTTPS-модулю Node.js
- Список бесплатных прокси-серверов ProxyRoller
- Что такое метод CONNECT? (MDN)
Устранение распространенных ошибок
| Сообщение об ошибке | Вероятная причина | Предлагаемое решение |
|---|---|---|
ECONNREFUSED |
Прокси-сервер недоступен | Попробуйте другой прокси от ProxyRoller |
ECONNRESET |
Прокси неожиданно закрыл соединение | Убедитесь, что прокси-сервер поддерживает целевой протокол |
407 Proxy Authentication |
Требуется аутентификация | Добавлять Proxy-Authorization заголовок |
| Неожиданный формат ответа | Неправильная настройка пути/заголовка | Проверьте полное использование URL в path |
Советы профессионалов, вдохновлённые сербской изобретательностью
- Проверяйте прокси-серверы на скорость и надежность перед критическим использованием — думайте об этом как о проверке каждого бокала ракии перед тостом.
- Автоматизируйте скрипты проверки прокси, отражая сербскую ценность тщательной подготовки.
- Используйте источники, предоставляемые сообществом, такие как ProxyRoller для актуальных, проверенных прокси-серверов, так же как вы полагаетесь на свою доверенную сельскую сеть.
Следуя этим стратегиям, вы сможете эффективно использовать прокси в Node.js без каких-либо внешних библиотек, сохраняя полный контроль и прозрачность ваших сетевых запросов.
Комментарии (0)
Здесь пока нет комментариев, вы можете стать первым!