Налаштування проксі в node-fetch

Проксі в node-fetch і вбудованому fetch Node.js: HttpsProxyAgent в опції agent, ProxyAgent з undici в dispatcher, порти 823 і 10000–20000.

Оновлено · Редакція 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-fetch: коротка відеоінструкція · 0:32

Покрокова інструкція, як підключити проксі Prokso в node-fetch. Займе кілька хвилин.

Крок 1. Візьміть дані проксі в особистому кабінеті

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

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

Крок 2. Встановіть пакети

Потрібні node-fetch і https-proxy-agent: npm i node-fetch https-proxy-agent.

Крок 3. Передайте агент проксі в запит

Створіть HttpsProxyAgent з адресою проксі й передайте його в опції agent. Збережіть код у файл із розширенням .mjs і запустіть через node.

import fetch from "node-fetch";
import { HttpsProxyAgent } from "https-proxy-agent";

const agent = new HttpsProxyAgent("http://ЛОГІН:ПАРОЛЬ@gw.prokso.com:823");
const res = await fetch("https://api.ipify.org?format=json", { agent });
console.log(await res.json());
Приклад запуску: у виводі — IP проксі, а не ваш. На порту 823 кожен запуск дає нову адресу
Приклад запуску: у виводі — IP проксі, а не ваш. На порту 823 кожен запуск дає нову адресу

Крок 4. Вбудований fetch у Node.js 18 і новіших

Вбудований fetch опцію agent не приймає. Для нього встановіть undici (npm i undici) і передайте ProxyAgent в опції dispatcher.

import { ProxyAgent } from "undici";

const dispatcher = new ProxyAgent("http://ЛОГІН:ПАРОЛЬ@gw.prokso.com:823");
const res = await fetch("https://api.ipify.org?format=json", { dispatcher });
console.log(await res.json());

Крок 5. Оберіть порт під завдання

Порт 823 — новий IP на кожен запит, порти 10000–20000 — та сама адреса до 120 хвилин. Для SOCKS5 візьміть пакет socks-proxy-agent і порт 824 або фіксований порт.

Крок 6. Перевірте вивід

Запустіть приклад: скрипт звертається до https://api.ipify.org і друкує IP, який бачить сайт. Це має бути адреса проксі, а не ваша. Помилка 407 означає неправильний логін або пароль. Сторінка «Мій IP» у браузері тут не допоможе: браузер іде напряму.

Тайм-аут і повтори

У fetch немає тайм-ауту за замовчуванням: запит, що завис, чекатиме нескінченно. Задавайте межу через AbortSignal.timeout() і повторюйте лише тимчасові збої:

import fetch from "node-fetch";
import { HttpsProxyAgent } from "https-proxy-agent";

const agent = new HttpsProxyAgent("http://USERNAME:PASSWORD@gw.prokso.com:823");

async function get(url, tries = 3) {
  for (let i = 1; i <= tries; i++) {
    try {
      const res = await fetch(url, { agent, signal: AbortSignal.timeout(30000) });
      if (![502, 503, 504].includes(res.status)) return res;   // retry only temporary failures
    } catch (e) {
      if (i === tries) throw e;
    }
    await new Promise((r) => setTimeout(r, 1000 * i));          // growing pause
  }
  throw new Error("no response after retries");
}

console.log(await (await get("https://prokso.com/ip")).text());

На порту 823 кожен повтор іде з нового IP. Коди 403 і 429 повторювати одразу не варто: це відповідь сайту, а не збій з'єднання.

Один агент на всі запити

Створюйте агент один раз і передавайте його в усі запити. Агент зберігає відкриті з'єднання з проксі, і повторні запити йдуть швидше. Новий агент на кожен запит — це нове з'єднання й зайва затримка.

Що означають помилки

  • Статус 407. Проксі не прийняв логін або пароль чи на плані закінчився трафік.
  • ECONNREFUSED. Одруківка в хості або порту проксі.
  • AbortError або TimeoutError. Спрацював ваш тайм-аут: сайт не відповів вчасно.
  • Запит пішов із вашого IP. Ви використовуєте вбудований fetch, а він опцію agent не читає — потрібен dispatcher з undici.

Докладніше про коди відповіді — на сторінці коди помилок проксі.

Питання й відповіді

Чому вбудований fetch ігнорує проксі?

Вбудований fetch у Node.js працює на бібліотеці undici й не читає опцію agent. Проксі для нього задається через dispatcher, як у прикладі з ProxyAgent.

Чи можна задати проксі для всіх запитів одразу?

Так: в undici є функція setGlobalDispatcher — передайте їй ProxyAgent на початку програми, і вбудований fetch піде через проксі без додаткових опцій.

Що вибрати: node-fetch чи вбудований fetch?

У нових проєктах на Node.js 18 і новіших достатньо вбудованого fetch з undici. node-fetch має сенс, якщо він уже використовується в проєкті.

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

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