Deno ve Bun'da Proxy Kullanımı: Geliştirici Rehberi

Deno ve Bun'da fetch ile proxy kullanımı, geo-targeting, sticky session yönetimi ve production ipuçları. Çalışan kod örnekleriyle eksiksiz rehber.

Using Proxies in Deno and Bun: A Code-First Guide
Bu makalede

Modern JavaScript çalışma zamanları olan Deno ve Bun, fetch() API'sini yerleşik olarak sunar; ancak proxy desteği varsayılan olarak etkin değildir. Deno ve Bun'da proxy kullanımı, doğru yapılandırma ile oldukça güçlü ve esnek bir süreçtir. Bu rehberde, her iki çalışma zamanında proxy'leri nasıl kuracağınızı, residential IP'lerle rotasyonu nasıl yapacağınızı ve production ortamında karşılaşacağınız tuzakları nasıl aşacağınızı çalışır kod örnekleriyle ele alıyoruz.

Deno ve Bun'da Proxy Kullanımı: Temel Farklar

Web tarayıcılarının aksine, Deno ve Bun'daki fetch() fonksiyonu proxy ayarlarını otomatik olarak okumaz. Bunun nedeni, her iki çalışma zamanının da WHATWG Fetch standardını uygulamasıdır; bu standart, proxy yapılandırmasını spesifikasyonun bir parçası olarak tanımlamaz. Sonuç olarak, geliştiricinin proxy'yi açıkça ileten bir HTTP istemcisi oluşturması veya runtime'a özel seçenekler kullanması gerekir.

Deno, bunu Deno.createHttpClient() ile çözer. Bu fonksiyon, proxy seçeneği içeren bir yapılandırma nesnesi alır ve döndürülen istemci, fetch() çağrısına { client } parametresi olarak geçirilir:

// Deno: createHttpClient ile proxy'li fetch
const client = Deno.createHttpClient({
  proxy: {
    url: "http://gate.proxyhat.com:8080",
    basicAuth: {
      username: "user-country-US",
      password: "pass",
    },
  },
});

const res = await fetch("https://httpbin.org/ip", { client });
const data = await res.json();
console.log(data); // { origin: "<residential-IP>" }

Bun ise çok daha kısa bir yol sunar. Bun'un fetch API'si, standart fetch imzasını genişletir ve proxy seçeneğini doğrudan ikinci argüman olarak kabul eder:

// Bun: tek satırda proxy'li fetch
const res = await fetch("https://httpbin.org/ip", {
  proxy: "http://user-country-US:pass@gate.proxyhat.com:8080",
});
const data = await res.json();
console.log(data);

Her iki yöntem de residential proxy trafiğini ProxyHat ağ geçidinden geçirir. Deno'da proxy kimlik bilgileri ayrı bir basicAuth nesnesinde verilirken, Bun'da standart URL kimlik doğrulama formatı kullanılır.

Çalışma Zamanı Karşılaştırması

Özellik Deno Bun
Proxy yapılandırma yöntemi Deno.createHttpClient({ proxy }) fetch(url, { proxy })
Kimlik doğrulama formatı Ayrı basicAuth nesnesi URL içine gömülü
SOCKS5 desteği Evet (socks5:// URL) Evet (socks5:// URL)
Custom CA sertifikaları caCerts seçeneği Ortam değişkeni
Bağlantı havuzu (connection pool) Otomatik (client bazlı) Otomatik

Geo-Targeting ve Sticky Session'lar

ProxyHat, geo-targeting ve sticky session parametrelerini kullanıcı adına gömer. Bu, proxy kimlik bilgilerini değiştirerek belirli bir ülke, şehir veya IP adresinden gelen istekleri simüle etmenizi sağlar. Format şu şekildedir:

// Ülke bazlı geo-targeting
const proxyUS = "http://user-country-US:pass@gate.proxyhat.com:8080";

// Şehir bazlı geo-targeting
const proxyBerlin = "http://user-country-DE-city-berlin:pass@gate.proxyhat.com:8080";

// Sticky session (aynı IP'yi korur)
const proxySticky = "http://user-session-abc123:pass@gate.proxyhat.com:8080";

// Ülke + sticky session birleşimi
const proxyUSSticky = "http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080";

SOCKS5 kullanmanız gereken durumlarda, port 1080 olarak değiştirilir:

// Deno'da SOCKS5 proxy
const socksClient = Deno.createHttpClient({
  proxy: {
    url: "socks5://user-country-US-session-abc123:pass@gate.proxyhat.com:1080",
  },
});

const res = await fetch("https://httpbin.org/ip", { client: socksClient });
console.log(await res.json());

Sticky session'lar, bir oturum boyunca aynı IP adresini korumak için kritiktir. Örneğin, e-ticaret sitelerinde sepete ürün ekleme ve ödeme adımlarının aynı IP'den gelmesi gerekir; aksi halde oturum geçersiz sayılabilir. ProxyHat'te sticky session'lar varsayılan olarak 10 dakika boyunca aynı IP'yi korur.

Ortam Değişkenleri ile Proxy Yapılandırması

Deno ve Bun, HTTP_PROXY ve HTTPS_PROXY ortam değişkenlerini farklı şekillerde ele alır. Deno, bu değişkenleri createHttpClient kullanılmadığında otomatik okuyabilir; ancak bu davranış sürümler arasında değişebilir. En güvenilir yaklaşım, her iki runtime'da da proxy'yi açıkça yapılandırmaktır.

// Ortam değişkeni yaklaşımı (Deno)
// HTTP_PROXY=http://user-country-US:pass@gate.proxyhat.com:8080 deno run script.ts

// Programatik olarak ortam değişkeninden okuma
const proxyUrl = Deno.env.get("HTTPS_PROXY") ??
  "http://user-country-US:pass@gate.proxyhat.com:8080";

const client = Deno.createHttpClient({
  proxy: { url: proxyUrl },
});

const res = await fetch("https://httpbin.org/headers", { client });
console.log(await res.json());

Ortam değişkeni yaklaşımı, CI/CD pipeline'larında ve Docker container'larında faydalıdır; çünkü proxy kimlik bilgilerini koddan ayrı tutar. Ancak, farklı istekler için farklı geo-targeting parametreleri kullanmanız gerekiyorsa, per-client yapılandırması tercih edilmelidir. ProxyHat kullanıcı adına country veya session eklemek için her istekte yeni bir client oluşturmanız gerekir.

Residential Proxy'ler Neden Gerekli?

Datacenter IP'leri, Cloudflare, Akamai ve PerimeterX gibi anti-bot sistemleri tarafından hızlı bir şekilde tespit edilir. MDN belgelerine göre, IP tabanlı rate limiting ve coğrafi filtreleme yaygın bir savunma katmanıdır. Residential proxy'ler, gerçek İSS'lere ait IP adresleri kullandığı için bu filtreleri aşmada çok daha etkilidir.

SERP takibi, e-ticaret fiyat karşılaştırması ve sosyal medya araştırması gibi yüksek blok riski taşıyan hedeflerde, residential proxy'ler başarılı istek oranını %90'ın üzerine çıkarabilir. Datacenter proxy'lerle bu oran bazen %20'ye düşebilir. ProxyHat'ın residential ağı, 190+ ülkede IP adresleri sunar ve coğrafi konum seçimine izin verir.

Sticky Session Havuzu ile Eşzamanlı Rotasyon

Aşağıdaki örnek, birden fazla sticky session oluşturur ve bunları eşzamanlı isteklerde kullanır. Her session farklı bir IP adresini temsil eder:

// Deno: Sticky session havuzu ile eşzamanlı rotasyon
const PROXY_GATEWAY = "gate.proxyhat.com:8080";
const PROXY_USER = "user";
const PROXY_PASS = "pass";

function createStickyClient(country: string, sessionId: string) {
  const username = `user-country-${country}-session-${sessionId}`;
  return Deno.createHttpClient({
    proxy: {
      url: `http://${PROXY_GATEWAY}`,
      basicAuth: { username, password: PROXY_PASS },
    },
  });
}

async function fetchWithTimeout(
  url: string,
  client: Deno.HttpClient,
  timeoutMs = 10000,
): Promise<Response> {
  const controller = new AbortController();
  const timeout = setTimeout(() => controller.abort(), timeoutMs);
  try {
    return await fetch(url, { client, signal: controller.signal });
  } finally {
    clearTimeout(timeout);
  }
}

// 5 farklı sticky session ile eşzamanlı istek
const sessions = Array.from({ length: 5 }, (_, i) => `sess-${i}-${Date.now()}`);
const countries = ["US", "DE", "GB", "FR", "JP"];

const results = await Promise.all(
  sessions.map(async (sessionId, i) => {
    const client = createStickyClient(countries[i], sessionId);
    const res = await fetchWithTimeout(
      "https://httpbin.org/ip",
      client,
      10000,
    );
    return await res.json();
  }),
);

console.log(results);

Bu örnekte, Promise.all ile 5 istek eşzamanlı olarak gönderilir ve her biri farklı bir ülkeden farklı bir sticky session kullanır. AbortController ile 10 saniyelik zaman aşımı uygulanır; böylece takılı kalan bir istek tüm süreci bloke etmez.

Production İpuçları

Retry ile Backoff Stratejisi

Production ortamında, proxy istekleri geçici hatalara maruz kalır: ağ kesintileri, hedef sitenin geçici olarak 429 veya 503 dönmesi, veya proxy IP'sinin geçici olarak bloklanması. Exponential backoff ile retry mekanizması bu sorunları zarif bir şekilde çözer:

// Deno: Exponential backoff ile retry
async function fetchWithRetry(
  url: string,
  client: Deno.HttpClient,
  maxRetries = 3,
  baseDelay = 1000,
): Promise<Response> {
  let lastError: Error | null = null;

  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    try {
      const controller = new AbortController();
      const timeout = setTimeout(() => controller.abort(), 15000);

      const res = await fetch(url, {
        client,
        signal: controller.signal,
      });
      clearTimeout(timeout);

      // 429 veya 5xx hatalarında retry yap
      if (res.status === 429 || res.status >= 500) {
        throw new Error(`HTTP ${res.status}`);
      }

      return res;
    } catch (err) {
      lastError = err as Error;
      if (attempt < maxRetries) {
        const delay = baseDelay * Math.pow(2, attempt);
        console.warn(
          `Attempt ${attempt + 1} failed, retrying in ${delay}ms...`,
        );
        await new Promise((r) => setTimeout(r, delay));
      }
    }
  }

  throw lastError;
}

const client = Deno.createHttpClient({
  proxy: {
    url: "http://gate.proxyhat.com:8080",
    basicAuth: { username: "user-country-US", password: "pass" },
  },
});

const res = await fetchWithRetry("https://httpbin.org/ip", client);
console.log(await res.json());

Custom CA Sertifikaları

Kurumsal ağlarda veya MITM proxy'lerle çalışırken, özel CA sertifikaları gerekebilir. Deno, caCerts seçeneği ile PEM formatlı sertifikaları destekler:

// Deno: Custom CA sertifikası ile HTTPS
const caCert = await Deno.readTextFile("./custom-ca.pem");

const client = Deno.createHttpClient({
  proxy: {
    url: "http://gate.proxyhat.com:8080",
    basicAuth: { username: "user-country-DE", password: "pass" },
  },
  caCerts: [caCert],
});

const res = await fetch("https://httpbin.org/ip", { client });
console.log(await res.json());

Bağlantı Yeniden Kullanımı

Deno'da Deno.createHttpClient() ile oluşturulan istemci, otomatik olarak bağlantı havuzu yönetimi yapar. Aynı client'ı birden fazla istekte tekrar kullanmak, TCP handshake ve TLS anlaşma maliyetlerini azaltır. 100 eşzamanlı istek için 100 ayrı client oluşturmak yerine, sticky session başına bir client oluşturun ve o client'ı tüm o session'ın isteklerinde yeniden kullanın.

ProxyHat Node SDK ile Karşılaştırma

ProxyHat, hem Deno hem de Bun altında çalışan bir Node SDK'sı da sunar. SDK, proxy yönetimini soyutlar ve rotation, retry ve session yönetimini otomatikleştirir. Aşağıdaki örnek, ham proxy kullanımı ile SDK kullanımını yan yana gösterir:

// Ham proxy kullanımı (Deno)
const client = Deno.createHttpClient({
  proxy: {
    url: "http://gate.proxyhat.com:8080",
    basicAuth: {
      username: "user-country-US-session-abc123",
      password: "pass",
    },
  },
});
const res1 = await fetch("https://httpbin.org/ip", { client });

// ProxyHat SDK kullanımı (Deno + Bun uyumlu)
// npm install @proxyhat/node-sdk
import { ProxyHat } from "@proxyhat/node-sdk";

const ph = new ProxyHat({
  username: "user",
  password: "pass",
  defaultCountry: "US",
});

// SDK otomatik rotation ve retry yapar
const res2 = await ph.fetch("https://httpbin.org/ip", {
  country: "DE",
  session: "order-123",
  timeout: 10000,
  retries: 3,
});
console.log(await res2.json());

SDK, npm: specifier ile Deno'da da çalışır: import { ProxyHat } from "npm:@proxyhat/node-sdk";. Bun'da ise standart import ile kullanılabilir. SDK'nın avantajı, session rotation, otomatik retry ve health checking'i yerleşik olarak sunmasıdır. Ham proxy yaklaşımı ise daha fazla kontrol ve daha az bağımlılık sağlar. Detaylı yapılandırma için ProxyHat belgelerine bakabilirsiniz.

Etik Scraping ve Yasal Hususlar

Proxy kullanırken, hedef sitenin robots.txt dosyasına ve Hizmet Şartları'na (ToS) uymak önemlidir. Amerika Birleşik Devletleri'nde Computer Fraud and Abuse Act (CFAA), yetkisiz erişimi suç sayabilir; ancak hiQ v. LinkedIn davasında mahkeme, herkese açık verilerin scrape edilmesini genel olarak CFAA kapsamında yetkisiz erişim saymamıştır. Avrupa Birliği'nde ise GDPR, kişisel verilerin işlenmesini düzenler ve IP adresleri GDPR kapsamında kişisel veri sayılır.

En iyi pratikler:

  • Önce hedef sitenin resmi API'sini kontrol edin. Çoğu platform (Reddit, GitHub, Twitter) ücretsiz veya ücretli API sunar.
  • Yalnızca herkese açık verileri toplayın; kimlik doğrulaması gerektiren sayfaları scrape etmeyin.
  • İstek hızınızı makul tutun: saniyede 1–2 istek, çoğu site için kabul edilebilir bir orandır.
  • robots.txt dosyasını parse edin ve Disallow kurallarına uyun.
  • Topladığınız verileri GDPR veya CCPA kapsamında değerlendirin ve gerekli anonimleştirmeyi yapın.

Web scraping kullanım senaryolarımız ve SERP takibi sayfalarımızda, etik scraping pratiklerini daha detaylı ele aldık. ProxyHat fiyatlandırması için fiyatlandırma sayfamızı inceleyebilirsiniz.

Key Takeaways

Önemli Çıkarımlar:

  • Deno'da proxy için Deno.createHttpClient({ proxy }) ve fetch(url, { client }) kullanın; Bun'da ise fetch(url, { proxy }) tek satırda yeterlidir.
  • Geo-targeting ve sticky session parametrelerini kullanıcı adına gömün: user-country-US-session-abc123.
  • SOCKS5 için port 1080, HTTP için 8080 kullanın.
  • Residential proxy'ler, yüksek blok riski taşıyan hedeflerde başarı oranını %90'ın üzerine çıkarır.
  • AbortController ile zaman aşımı, Promise.all ile eşzamanlılık, ve exponential backoff ile retry uygulayın.
  • Etik scraping: önce resmi API'leri deneyin, robots.txt'ye uyun, kişisel verileri GDPR'ye uygun işleyin.

SSS

Deno ve Bun'da proxy kullanımı nedir?

Deno ve Bun'da proxy kullanımı, bu modern JavaScript çalışma zamanlarında HTTP/HTTPS isteklerini bir proxy sunucusu üzerinden yönlendirme işlemidir. Deno'da Deno.createHttpClient({ proxy }) ile özel bir HTTP istemcisi oluşturulur ve fetch()'e { client } olarak geçirilir. Bun'da ise fetch(url, { proxy }) tek parametre ile proxy URL'i doğrudan verilir. Her iki yöntem de ProxyHat'ın gate.proxyhat.com:8080 ağ geçidi ile uyumludur.

Deno ve Bun'da proxy kullanımı neden önemlidir?

Proxy kullanımı, IP tabanlı blokları aşmak, coğrafi içerik kısıtlamalarını atlatmak ve rate limit'leri dağıtmak için kritiktir. Residential proxy'ler, gerçek İSS IP'leri kullandığı için Cloudflare ve Akamai gibi anti-bot sistemlerini aşmada datacenter proxy'lere göre çok daha etkilidir. Deno ve Bun gibi modern runtime'larda yerleşik proxy desteği, geliştiricilerin ekstra kütüphane kurmadan proxy trafiğini yönetmesini sağlar.

Deno ve Bun'da proxy kullanımı için hangi proxy tipi en iyisidir?

Yüksek blok riski taşıyan hedefler (e-ticaret, SERP, sosyal medya) için residential proxy'ler en iyi seçenektir; çünkü gerçek İSS IP'leri kullanırlar ve tespit edilme olasılığı daha düşüktür. Datacenter proxy'ler daha hızlı ve daha ucuzdur; ancak kolayca tespit edilirler. ProxyHat, her iki tipi de sunar; ayrıca 190+ ülkede geo-targeting ve 10 dakikalık sticky session desteği sağlar. SOCKS5 gerektiğinde port 1080 kullanılır.

Deno ve Bun'da proxy kullanırken blokları nasıl önlersiniz?

Blokları önlemek için: (1) Her istekte farklı bir sticky session kullanarak IP rotasyonu yapın; (2) AbortController ile 10–15 saniyelik zaman aşımı uygulayın; (3) Exponential backoff ile retry yapın (örneğin 1s, 2s, 4s); (4) İstekler arasında rastgele gecikmeler ekleyin; (5) Realistic User-Agent ve Accept-Language başlıkları gönderin; (6) robots.txt kurallarına uyun ve saniyede 1–2 istekle makul bir hız tutturun.

Sık sorulan sorular

Deno ve Bun'da proxy kullanımı nedir?

Deno ve Bun'da proxy kullanımı, bu modern JavaScript çalışma zamanlarında HTTP/HTTPS isteklerini bir proxy sunucusu üzerinden yönlendirme işlemidir. Deno'da Deno.createHttpClient({ proxy }) ile özel bir HTTP istemcisi oluşturulur ve fetch()'e { client } olarak geçirilir. Bun'da ise fetch(url, { proxy }) tek parametre ile proxy URL'i doğrudan verilir. Her iki yöntem de ProxyHat'ın gate.proxyhat.com:8080 ağ geçidi ile uyumludur.

Deno ve Bun'da proxy kullanımı neden önemlidir?

Proxy kullanımı, IP tabanlı blokları aşmak, coğrafi içerik kısıtlamalarını atlatmak ve rate limit'leri dağıtmak için kritiktir. Residential proxy'ler, gerçek İSS IP'leri kullandığı için Cloudflare ve Akamai gibi anti-bot sistemlerini aşmada datacenter proxy'lere göre çok daha etkilidir. Deno ve Bun gibi modern runtime'larda yerleşik proxy desteği, geliştiricilerin ekstra kütüphane kurmadan proxy trafiğini yönetmesini sağlar.

Deno ve Bun'da proxy kullanımı için hangi proxy tipi en iyisidir?

Yüksek blok riski taşıyan hedefler (e-ticaret, SERP, sosyal medya) için residential proxy'ler en iyi seçenektir; çünkü gerçek İSS IP'leri kullanırlar ve tespit edilme olasılığı daha düşüktür. Datacenter proxy'ler daha hızlı ve daha ucuzdur; ancak kolayca tespit edilirler. ProxyHat, her iki tipi de sunar; ayrıca 190+ ülkede geo-targeting ve 10 dakikalık sticky session desteği sağlar. SOCKS5 gerektiğinde port 1080 kullanılır.

Deno ve Bun'da proxy kullanırken blokları nasıl önlersiniz?

Blokları önlemek için: (1) Her istekte farklı bir sticky session kullanarak IP rotasyonu yapın; (2) AbortController ile 10–15 saniyelik zaman aşımı uygulayın; (3) Exponential backoff ile retry yapın (örneğin 1s, 2s, 4s); (4) İstekler arasında rastgele gecikmeler ekleyin; (5) Realistic User-Agent ve Accept-Language başlıkları gönderin; (6) robots.txt kurallarına uyun ve saniyede 1–2 istekle makul bir hız tutturun.

Başlamaya hazır mısınız?

148'den fazla ülkede residential, ISP ve mobil proxy'ler. Ücretsiz hesap oluşturun.

Ücretsiz hesap oluştur
← Bloga Dön