Socks5Proxy

Node.js proxy ayarları, HTTP ve SOCKS5 proxy'lerini fetch ve https'e bağlama

Bu rehber, Node.js 18 ve üzerinde Socks5Proxy'nin HTTP proxy'sini undici ProxyAgent ile, SOCKS5 proxy'sini socks-proxy-agent ile bağlama yöntemini ve API ile liste alıp döndürme kodunu açıklar.

Node.js'de proxy kullanmak için ne gerekiyor?

Node.js'deki fetch işlevi undici kütüphanesiyle çalışır ve varsayılan olarak proxy ayarlarını okumaz. Bu yüzden HTTP proxy'leri için undici'nin ProxyAgent'ını dispatcher olarak geçirmeniz, SOCKS5 proxy'leri için ise socks-proxy-agent'ı Node'un https modülüne ajan olarak vermeniz gerekir.

Örnekte IP 198.51.100.23, HTTP port 8000, SOCKS5 port 1080, kullanıcı adı spx_user ve şifre spx_pass kullanılmaktadır. Tüm kodlar ES modül formatındadır (.mjs).

npm install undici socks-proxy-agent

fetch'e HTTP proxy nasıl bağlanır?

ProxyAgent'a proxy adresini verin, kullanıcı adı ve şifreyi token seçeneğine Basic kimlik doğrulama değeri olarak ekleyin. undici'den alınan fetch'e dispatcher olarak geçirirseniz, bu istek proxy üzerinden gider. HTTPS adresleri CONNECT yöntemiyle şifrelenmiş olarak iletilir.

Aynı ProxyAgent'ı birden çok istekte yeniden kullanırsanız bağlantı yeniden kullanılır ve daha hızlı olur. Her proxy için bir agent oluşturup sırayla kullanabilirsiniz.

import { fetch, ProxyAgent } from "undici";

const agent = new ProxyAgent({
  uri: "http://198.51.100.23:8000",
  token: "Basic " + Buffer.from("spx_user:spx_pass").toString("base64"),
});

const res = await fetch("https://api.ipify.org?format=json", { dispatcher: agent });
console.log(res.status, await res.json()); // "ip" should be the proxy IP

SOCKS5 proxy nasıl bağlanır?

socks-proxy-agent, Node'un http, https modülleriyle birlikte kullanılan bir ajandır. Adresi socks5h olarak yazarsanız, alan adı çözümlemesi proxy tarafında yapılır. Aşağıdaki örnek, https.get'e ajansı geçirerek yanıt gövdesini toplar ve yazdırır.

axios gibi http modülü üzerinde çalışan kütüphanelerde de httpAgent ve httpsAgent'a aynı agent eklenerek SOCKS5 istekleri yapılabilir.

import https from "node:https";
import { SocksProxyAgent } from "socks-proxy-agent";

const agent = new SocksProxyAgent("socks5h://spx_user:spx_pass@198.51.100.23:1080");

https.get("https://api.ipify.org?format=json", { agent }, (res) => {
  let body = "";
  res.on("data", (chunk) => (body += chunk));
  res.on("end", () => console.log(res.statusCode, body));
}).on("error", (err) => console.error("request failed:", err.message));

API ile listeyi alıp döngüye sokmak için ne yapmalıyım?

Başlangıçta API ile liste alınır ve her proxy için bir ajan oluşturulur, her istekte bir sonraki ajan kullanılır. Aşağıdaki kod, HTTP listesini ip:port:user:pass formatında alarak ProxyAgent dizisi oluşturur ve başarısız olursa bir sonraki proxy ile tekrar dener.

İsteklere mutlaka AbortSignal.timeout ile bir zaman sınırı ekleyin. Yanıt alınamayan istekler birikirse tüm işlem yavaşlar.

import { fetch, ProxyAgent } from "undici";

const API = "https://socks5proxy.io/api/v1";
const KEY = "YOUR_API_KEY";

const text = await (await fetch(API + "/proxies/download?format=ip:port:user:pass&protocol=http", {
  headers: { Authorization: "Bearer " + KEY },
})).text();

const agents = text.trim().split("\n").map((line) => {
  const [ip, port, user, pass] = line.trim().split(":");
  return new ProxyAgent({
    uri: "http://" + ip + ":" + port,
    token: "Basic " + Buffer.from(user + ":" + pass).toString("base64"),
  });
});

let i = 0;
async function get(url, tries = 3) {
  for (let t = 0; t < tries; t++) {
    const dispatcher = agents[i++ % agents.length];
    try {
      const res = await fetch(url, { dispatcher, signal: AbortSignal.timeout(20000) });
      if (res.ok) return await res.text();
    } catch {
      // try the next proxy
    }
  }
  return null;
}

console.log((await get("https://example.com/"))?.length);

IP yetkilendirme kullanınca kod nasıl değişir?

Node.js sunucunuzun IPv4 adresini kontrol paneline eklediğinizde, ProxyAgent'da token seçeneğini çıkarıp sadece adresi kullanabilirsiniz. SOCKS5 için de socks5h://198.51.100.23:1080 gibi kullanıcı adı ve şifre olmadan kullanabilirsiniz. Şifreleri ortam değişkenlerinde veya kodda saklamanıza gerek kalmaz, bu da birden fazla sunucuya dağıtımı kolaylaştırır.

axios kullanıyorsam nasıl bağlanırım?

axios, Node'un http, https modülleri üzerinde çalıştığından proxy kullanmak için agent geçirebilirsiniz. SOCKS5 için socks-proxy-agent'ı httpAgent ve httpsAgent'a ekleyin, axios'un proxy seçeneğini false yaparak iki ayarın çakışmasını önleyin.

HTTP proxy axios'un proxy seçeneğine host, port, auth eklenerek de kullanılabilir ancak HTTPS adreslerinde agent kullanmak daha stabil olabilir. https-proxy-agent paketi ile HTTP proxy de aynı yapıda bağlanabilir.

import axios from "axios";
import { SocksProxyAgent } from "socks-proxy-agent";

const agent = new SocksProxyAgent("socks5h://spx_user:spx_pass@198.51.100.23:1080");
const client = axios.create({ httpAgent: agent, httpsAgent: agent, proxy: false, timeout: 20000 });

const { data } = await client.get("https://api.ipify.org?format=json");
console.log(data);

Aynı anda birden fazla istek gönderirken nelere dikkat edilmeli?

Promise.all ile binlerce isteği aynı anda başlatırsanız, çok fazla bağlantı açıldığından hem proxy hem de hedef siteye yük biner. Aynı anda işlenecek istek sayısını sınırlandıran bir iş kuyruğu oluşturun. Küçük bir fonksiyonla kendiniz yapabilir veya p-limit gibi bir paket kullanabilirsiniz.

Proxy'ler arasında eşzamanlı bağlantı sayısını eşit dağıtırsanız tek bir IP'ye istek yığılması olmaz. Paylaşımlı planlarda 500 eşzamanlı bağlantı dahildir, toplam eşzamanlı istek sayısını buna göre ayarlayın.

Çevre değişkenleriyle tüm isteklere proxy uygulanabilir mi?

undici'nin EnvHttpProxyAgent'i HTTP_PROXY, HTTPS_PROXY, NO_PROXY ortam değişkenlerini okuyarak proxy'yi belirler. setGlobalDispatcher ile kaydederseniz, o işlemin tüm fetch'leri proxy üzerinden geçer. Birden çok kütüphane içinde fetch kullanıyorsa, tek seferde uygulanabilir, bu da kullanışlıdır.

Global ayarlar, tüm isteklerde aynı IP'nin kullanılmasına neden olur, bu nedenle IP'lerin paylaşıldığı toplama işlemlerinden ziyade tek bir ülkeden erişim gerektiren araçlar veya testler için uygundur. Döngü gerekiyorsa, her istekte dispatcher'ı geçin.

// HTTPS_PROXY=http://spx_user:spx_pass@198.51.100.23:8000 node app.mjs
import { EnvHttpProxyAgent, setGlobalDispatcher, fetch } from "undici";

setGlobalDispatcher(new EnvHttpProxyAgent());
const res = await fetch("https://api.ipify.org");
console.log(await res.text());

Sık karşılaşılan sorunlar nasıl çözülür?

Node.js dahili fetch'e dispatcher geçtiğinizde görmezden geliniyorsa, undici paketinden fetch'i de içe aktardığınızdan emin olun. Dahili fetch ile yüklediğiniz undici sürümleri farklıysa ajan uyumsuzluğu olabilir, bu yüzden fetch ve ProxyAgent'ı aynı paketten almak en güvenli yöntemdir.

407 yanıtı, kimlik bilgilerinin yanlış olduğu anlamına gelir. Token değerinde Basic'ten sonra kullanıcı_adı:şifre'nin base64'e dönüştürülmüş hali olduğunu kontrol edin. ECONNREFUSED genellikle yanlış port kullanıldığında olur. HTTP ajanları için HTTP portunu, SOCKS ajanları için SOCKS5 portunu kullanın.

  • fetch ve ProxyAgent aynı undici paketinde
  • 407: Token değeri ve kayıtlı IP'yi kontrol edin
  • ECONNREFUSED: HTTP portu ve SOCKS5 portu ayrımı
  • Tüm isteklere zaman sınırı
Node.js proxy ayarları, undici·SOCKS5 ajan bağlantısı | Socks5Proxy