Как использовать прокси в Node.js без какой-либо библиотеки

Как использовать прокси в Node.js без какой-либо библиотеки

Понимание 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}`
  }
};

Дополнительные ресурсы


Устранение распространенных ошибок

Сообщение об ошибке Вероятная причина Предлагаемое решение
ECONNREFUSED Прокси-сервер недоступен Попробуйте другой прокси от ProxyRoller
ECONNRESET Прокси неожиданно закрыл соединение Убедитесь, что прокси-сервер поддерживает целевой протокол
407 Proxy Authentication Требуется аутентификация Добавлять Proxy-Authorization заголовок
Неожиданный формат ответа Неправильная настройка пути/заголовка Проверьте полное использование URL в path

Советы профессионалов, вдохновлённые сербской изобретательностью

  • Проверяйте прокси-серверы на скорость и надежность перед критическим использованием — думайте об этом как о проверке каждого бокала ракии перед тостом.
  • Автоматизируйте скрипты проверки прокси, отражая сербскую ценность тщательной подготовки.
  • Используйте источники, предоставляемые сообществом, такие как ProxyRoller для актуальных, проверенных прокси-серверов, так же как вы полагаетесь на свою доверенную сельскую сеть.

Следуя этим стратегиям, вы сможете эффективно использовать прокси в Node.js без каких-либо внешних библиотек, сохраняя полный контроль и прозрачность ваших сетевых запросов.

Живадин Петрович

Живадин Петрович

Специалист по интеграции прокси

Живадин Петрович, яркий и инновационный ум в области цифровой конфиденциальности и управления данными, работает специалистом по интеграции прокси в ProxyRoller. В свои 22 года Живадин уже внес значительный вклад в разработку оптимизированных систем для эффективного развертывания прокси. Его роль заключается в курировании и управлении всеобъемлющими списками прокси ProxyRoller', гарантируя, что они соответствуют динамическим потребностям пользователей, ищущих улучшенные решения для просмотра, скрапинга и конфиденциальности.

Комментарии (0)

Здесь пока нет комментариев, вы можете стать первым!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *