Jak skonfigurować proxy w node-fetch

Proxy w node-fetch i we wbudowanym fetch z Node.js: HttpsProxyAgent w opcji agent, ProxyAgent z undici jako dispatcher, porty 823 i 10000–20000.

Zaktualizowano · Redakcja Prokso

Dane do połączenia
Host
gw.prokso.com
Port
823 HTTP · 824 SOCKS5 — nowy IP przy każdym żądaniu · 10000–20000 stały IP na całą sesję, HTTP(S) i SOCKS5
Login i hasło
w panelu klienta, na stronie planu

Gotowe wiersze w potrzebnym formacie wygenerujesz w panelu klienta: wybierz kraj, typ IP i protokół.

W skrócie
  • Host gw.prokso.com, porty 823 (HTTP), 824 (SOCKS5), 10000–20000 (stały IP, HTTP lub SOCKS5)
  • Login i hasło znajdziesz w panelu klienta na stronie planu
  • Sprawdzaj IP w odpowiedzi na samo żądanie wysłane przez proxy: strona Mój IP w przeglądarce nie testuje Twojego skryptu

Instrukcja krok po kroku, jak podłączyć proxy Prokso w node-fetch. Zajmie to kilka minut.

Krok 1. Pobierz dane proxy z panelu klienta

Otwórz swój plan i skopiuj host gw.prokso.com, port, login i hasło. Port 823 to HTTP, a 824 to SOCKS5 (oba dają nowy IP przy każdym żądaniu); porty 10000–20000 utrzymują jeden IP przez całą sesję do 120 minut i działają zarówno jako HTTP, jak i SOCKS5 (każdy port to osobny adres). Kraj ustawiasz w loginie: username__cr.ua.

Blok „Dostęp” na stronie planu: host, porty, login i hasło do linii proxy
Blok „Dostęp” na stronie planu: host, porty, login i hasło do linii proxy

Krok 2. Zainstaluj pakiety

Potrzebujesz node-fetch i https-proxy-agent: npm i node-fetch https-proxy-agent.

Krok 3. Przekaż agenta proxy do żądania

Utwórz HttpsProxyAgent z URL proxy i przekaż go w opcji agent. Zapisz kod w pliku z rozszerzeniem .mjs i uruchom go poleceniem node.

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

const agent = new HttpsProxyAgent("http://USERNAME:PASSWORD@gw.prokso.com:823");
const res = await fetch("https://api.ipify.org?format=json", { agent });
console.log(await res.json());
Przykład uruchomienia: w wyniku widać IP proxy, a nie Twoje. Na porcie 823 każde uruchomienie daje nowy adres
Przykład uruchomienia: w wyniku widać IP proxy, a nie Twoje. Na porcie 823 każde uruchomienie daje nowy adres

Krok 4. Wbudowany fetch w Node.js 18 i nowszym

Wbudowany fetch ignoruje opcję agent. W jego przypadku zainstaluj undici (npm i undici) i przekaż ProxyAgent w opcji dispatcher.

import { ProxyAgent } from "undici";

const dispatcher = new ProxyAgent("http://USERNAME:PASSWORD@gw.prokso.com:823");
const res = await fetch("https://api.ipify.org?format=json", { dispatcher });
console.log(await res.json());

Krok 5. Dobierz port do zadania

Port 823 daje nowy IP przy każdym żądaniu, a porty 10000–20000 utrzymują ten sam adres do 120 minut. Dla SOCKS5 użyj pakietu socks-proxy-agent z portem 824 albo portem ze stałym IP.

Krok 6. Sprawdź wynik

Uruchom przykład: skrypt wywołuje https://api.ipify.org i wypisuje IP, który widzi strona. Powinien to być adres proxy, a nie Twój. Błąd 407 oznacza nieprawidłowy login lub hasło. Strona Mój IP w przeglądarce nic tu nie pokaże, bo przeglądarka łączy się bezpośrednio.

Timeout i ponowienia

fetch domyślnie nie ma timeoutu: zawieszone żądanie będzie czekać w nieskończoność. Ustaw limit przez AbortSignal.timeout() i ponawiaj tylko chwilowe błędy:

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());

Na porcie 823 każde ponowienie wychodzi z nowego IP. Kodów 403 i 429 nie warto ponawiać od razu: to odpowiedź strony, a nie błąd połączenia.

Jeden agent dla wszystkich żądań

Utwórz agenta raz i przekazuj go do wszystkich żądań. Agent utrzymuje otwarte połączenia z proxy, więc kolejne żądania idą szybciej. Nowy agent przy każdym żądaniu to nowe połączenie i dodatkowe opóźnienie.

Co oznaczają błędy

  • Status 407. Proxy nie przyjęło loginu lub hasła albo w planie skończył się transfer.
  • ECONNREFUSED. W hoście lub porcie proxy jest literówka.
  • AbortError lub TimeoutError. Zadziałał Twój własny timeout: strona nie odpowiedziała na czas.
  • Żądanie wyszło z Twojego własnego IP. Używasz wbudowanego fetch, a on nie odczytuje opcji agent: potrzebujesz dispatcher z undici.

Więcej o kodach odpowiedzi znajdziesz na stronie kody błędów proxy.

Jeśli proxy nie działa

Pytania i odpowiedzi (FAQ)

Dlaczego wbudowany fetch ignoruje proxy?

Wbudowany fetch w Node.js działa na bibliotece undici i nie odczytuje opcji agent. Proxy ustawia się w nim przez dispatcher, tak jak w przykładzie z ProxyAgent.

Czy mogę ustawić proxy dla wszystkich żądań naraz?

Tak: undici ma setGlobalDispatcher – przekaż mu ProxyAgent na początku programu, a wbudowany fetch będzie szedł przez proxy bez dodatkowych opcji.

Co wybrać: node-fetch czy wbudowany fetch?

W nowych projektach na Node.js 18 i nowszym wystarczy wbudowany fetch z undici. node-fetch ma sens, jeśli projekt już go używa.

Jak zakodować hasło ze znakami specjalnymi?

Owiń login i hasło w encodeURIComponent(), kiedy budujesz adres proxy.