Настройка прокси в Node.js

Прокси в Node.js с axios и https-proxy-agent: HTTP(S) и SOCKS5, новый IP на каждый запрос через порт 823, фиксированный IP для сессии и кодирование пароля.

Обновлено · Редакция Prokso

Данные для подключения
Хост
gw.prokso.com
Порт
823 HTTP · 824 SOCKS5 — новый IP на каждый запрос · 10000–20000 фиксированный IP (sticky-сессия), HTTP(S) и SOCKS5
Логин и пароль
в кабинете, на странице плана

Готовые строки в нужном формате генерирует кабинет: выберите страну, тип IP и протокол.

Коротко
  • Хост — gw.prokso.com, порты 823 (HTTP), 824 (SOCKS5), 10000–20000 (фиксированный IP, HTTP или SOCKS5)
  • Логин и пароль — в кабинете на странице плана
  • Проверяйте IP в ответе самого запроса через прокси: страница «Мой IP» в браузере ваш скрипт не проверяет
Прокси в Node.js: короткая видеоинструкция · 0:33

Пошаговая инструкция, как подключить прокси Prokso в Node.js. Займёт несколько минут.

Шаг 1. Возьмите данные прокси в кабинете

Откройте план и скопируйте хост gw.prokso.com, порт, логин и пароль. Порт 823 — HTTP, 824 — SOCKS5 (оба дают новый IP на каждый запрос); порты 10000–20000 — фиксированный IP до 120 минут, работают и как HTTP, и как SOCKS5 (каждый порт — отдельный адрес). Страну задают в логине: логин__cr.ua.

Блок «Доступ» на странице плана: хост, порты, логин и пароль для строки прокси
Блок «Доступ» на странице плана: хост, порты, логин и пароль для строки прокси

Шаг 2. Установите пакеты

Для запросов через прокси понадобятся axios и https-proxy-agent: npm i axios https-proxy-agent.

Шаг 3. Создайте агент прокси

Передайте адрес прокси в HttpsProxyAgent и подключите его к запросу. Опцию proxy: false оставляйте, чтобы axios не накладывал собственные настройки.

// npm i axios https-proxy-agent
import axios from "axios";
import { HttpsProxyAgent } from "https-proxy-agent";

const agent = new HttpsProxyAgent("http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823");
const { data } = await axios.get("https://api.ipify.org?format=json", { httpsAgent: agent, proxy: false });
console.log(data);

Сохраните код как check.mjs и запустите node check.mjs.

Шаг 4. Переключайтесь между режимами

Порт 823 — новый IP на каждый запрос, 10000–20000 — постоянный IP для сессии. Для SOCKS5 используйте пакет socks-proxy-agent и порт 824 (ротация) или тот же фиксированный порт 10000–20000.

Шаг 5. Проверьте вывод скрипта

Запустите пример из шага 3: axios идёт на https://api.ipify.org через агент прокси и выводит в консоль { ip: '…' }. Это адрес, который видит сайт, — он должен отличаться от вашего. Если видите ошибку 407, проверьте логин и пароль. Страница «Мой IP» в браузере здесь ничего не покажет: браузер идёт напрямую.

Пример запуска: в выводе — IP прокси, а не ваш. На порту 823 каждый запуск даёт новый адрес
Пример запуска: в выводе — IP прокси, а не ваш. На порту 823 каждый запуск даёт новый адрес

Один агент на всё приложение

Создавайте агент прокси один раз и переиспользуйте его во всех запросах. Новый агент на каждый запрос открывает новое соединение с прокси, и скрипт работает медленнее. Удобнее всего собрать экземпляр axios с нужными настройками:

import axios from "axios";
import { HttpsProxyAgent } from "https-proxy-agent";

const agent = new HttpsProxyAgent("http://USERNAME:PASSWORD@gw.prokso.com:823");
// one client for the whole app: proxy, timeout, no built-in axios proxy
const http = axios.create({ httpAgent: agent, httpsAgent: agent, proxy: false, timeout: 30000 });

const { data } = await http.get("https://prokso.com/ip");
console.log(data);

Тайм-аут задавайте явно: по умолчанию axios ждёт ответа бесконечно, и один зависший запрос остановит очередь.

Что означают ошибки

  • Ответ 407. Прокси не принял логин или пароль. Проверьте строку и остаток трафика на плане.
  • ECONNREFUSED. На указанном хосте и порту никто не отвечает: опечатка в адресе или порте.
  • ETIMEDOUT или ECONNRESET. Соединение оборвалось или не установилось. Повторите запрос: на порту 823 он уйдёт с нового IP.
  • Запрос ушёл с вашего IP. Не указано proxy: false, и axios применил собственные настройки, либо агент не передан для нужного протокола.

Коды 403 и 429 приходят от сайта, а не от прокси. Что с ними делать, описано на странице коды ошибок прокси.

Параллельные запросы

Promise.all запускает все запросы сразу. Для сотен адресов это перегружает и сайт, и ваш скрипт. Ограничивайте число одновременных запросов очередью: десяти–двадцати обычно достаточно, а при ответах 429 уменьшайте.

Вопросы и ответы

Читает ли Node.js переменные HTTP_PROXY?

Встроенные модули по умолчанию их не читают. Надёжнее передавать прокси явно через агент, как в примере.

Как закодировать пароль со спецсимволами?

Оберните логин и пароль в <code>encodeURIComponent()</code> при сборке адреса прокси.

Как держать один IP для серии запросов?

Замените порт 823 на фиксированный порт из диапазона 10000–20000: все запросы через него пойдут с одного IP, пока длится сессия.