$ curl -x http://user:pass@xxx.nodetonet.com:48888 https://api.ipify.org→ 188.114.96.7$ curl ... -H "X-Session: abc" # sticky→ 188.114.96.7 # same IP (TTL 600s)$ curl ... -H "X-Rotate: 1" # rotate→ 92.184.117.42 # new IP SDK EXAMPLES nodetonet.com
SDK Python Node.js Go Ruby REST API

Nodetonet SDK örnekleri — Python, Node.js, Go ve Ruby, her biri ~20 satır

Bearer token ile Nodetonet REST API'sini çağıran Python, Node.js, Go ve Ruby için hazır SDK tarzı istemciler. Henüz resmi SDK yok; ancak API yüzeyi o kadar küçük ki DIY bir sarıcı 30 satırın altında kalır.

N Nodetonet Team
15 Mayıs 2026 8 dk okuma

Kısaca: Nodetonet küçük ve kararlı bir REST API'ye sahiptir. Resmi SDK'lar hazır olana kadar herhangi bir dilde çalışan bir istemciyi yaklaşık 20 satırda yazabilirsiniz — bu sayfa tam olarak o 20 satırı Python, Node.js, Go ve Ruby için hazır şekilde sunuyor.

Bu sayfa, en çok sorulan dört dil için kısa ve çalışan SDK tarzı örnekleri topluyor: Python, Node.js, Go ve Ruby. Her örnek POST /api/v1/proxies'e karşı bir proxy ya da tünel oluşturur, URL'yi yazdırır ve bir repo'ya nodetonet.py, nodetonet.mjs vb. olarak bırakılacak kadar kısadır. Ne çağırdığınız konusunda daha fazla bağlam istiyorsanız REST API: ilk çağrınız ve API anahtarınızı anlama yazılarıyla başlayın.

Kapsam hakkında bir not: PyPI, npm, pkg.go.dev veya RubyGems'te henüz birinci parti SDK yayınlamıyoruz. REST API küçük — bir ana kaynak, dört fiil — dolayısıyla "SDK yok" ile "kullanışlı bir SDK" arasındaki boşluk yaklaşık 20 satır kod. Resmi SDK çıktığında pip install nodetonet diyebileceksiniz ve aynı şekli dahili yeniden deneme, sayfalama ve typed hata desteğiyle elde edeceksiniz.

API'ye kısa bir bakış

Dil örneklerine dalmadan önce, çekirdek kaynağın şekli şu. Aşağıdaki her istemci bu dört işlemi kapsar:

FiilYolNe yaparKimlik doğrulama
POST/api/v1/proxiesProxy / tünel oluştururBearer token
GET/api/v1/proxiesProxy'leri listelerBearer token
GET/api/v1/proxies/:idTek proxy'yi incelerBearer token
DELETE/api/v1/proxies/:idProxy'yi silerBearer token

Bearer token'ınız paneldeki /tokens altında yer alır — ortam değişkeninde tutun, asla doğrudan koda gömmayın. POST gövdesi subdomain, target_host ve target_port alır; yanıt gövdesi size id ve url döndürür. API yüzeyi bu kadar. Makinenin okuyabileceği tam spec /openapi.json adresinde bulunuyor.

1 · Python

Tek dosya, tek bağımlılık (requests). Token'ı bir ortam değişkeninden okur, böylece güvenle commit edilebilir. Script'ler, Jupyter notebook'ları, Django uygulamaları veya herhangi bir Python otomasyon hattı için uygundur — Python'da programatik tünel oluşturma yazısındaki örüntüler gibi.

# nodetonet.py
import os, requests

BASE = "https://nodetonet.com/api/v1"
TOKEN = os.environ["NTN_TOKEN"]
H = {"Authorization": f"Bearer {TOKEN}",
     "Content-Type": "application/json"}

def create_proxy(subdomain, target_port, target_host="127.0.0.1"):
    r = requests.post(f"{BASE}/proxies", json={
        "subdomain": subdomain,
        "target_host": target_host,
        "target_port": target_port,
    }, headers=H, timeout=10)
    r.raise_for_status()
    return r.json()

def delete_proxy(proxy_id):
    r = requests.delete(f"{BASE}/proxies/{proxy_id}", headers=H, timeout=10)
    r.raise_for_status()

if __name__ == "__main__":
    p = create_proxy("alice-dev", 3000)
    print(p["url"])

İşlevsel bir Python istemcisi bu. Olduğu gibi kullanın, bir sınıf içine sarın ya da tek seferlik entegrasyonlar için bir Jupyter notebook'a yapıştırın. raise_for_status() çağrısı hataları sessizce yutmak yerine hemen yüzeye çıkarır.

2 · Node.js

Sıfır npm bağımlılığı — Node 18+ yerleşik fetch'ini kullanır. Bir projeye nodetonet.mjs olarak ekleyin. Serverless bir fonksiyon, bir derleme betiği veya yerel geliştirme sırasında bir Next.js API route'unda eşit derecede çalışır.

// nodetonet.mjs
const BASE  = 'https://nodetonet.com/api/v1';
const TOKEN = process.env.NTN_TOKEN;

async function api(path, opts = {}) {
  const res = await fetch(BASE + path, {
    ...opts,
    headers: {
      Authorization: 'Bearer ' + TOKEN,
      'Content-Type': 'application/json',
      ...(opts.headers || {}),
    },
  });
  if (!res.ok) throw new Error(res.status + ' ' + (await res.text()));
  return res.json();
}

export const createProxy = (subdomain, port, host = '127.0.0.1') =>
  api('/proxies', { method: 'POST', body: JSON.stringify({
    subdomain, target_host: host, target_port: port,
  })});

export const deleteProxy = (id) =>
  api('/proxies/' + id, { method: 'DELETE' });

const p = await createProxy('alice-dev', 3000);
console.log(p.url);

3 · Go

Yalnızca standart kütüphane — üçüncü taraf paket gerekmez. Uzun süre çalışan bir daemon veya tek seferlik bir CLI ile birleştirin. Struct etiketleri JSON yanıt şekliyle örtüştüğünden unmarshalling doğrudandır.

// nodetonet.go
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
    "os"
)

type Proxy struct {
    ID  string `json:"id"`
    URL string `json:"url"`
}

func CreateProxy(sub string, port int) (*Proxy, error) {
    body, _ := json.Marshal(map[string]interface{}{
        "subdomain": sub, "target_host": "127.0.0.1", "target_port": port,
    })
    req, _ := http.NewRequest("POST",
        "https://nodetonet.com/api/v1/proxies", bytes.NewReader(body))
    req.Header.Set("Authorization", "Bearer "+os.Getenv("NTN_TOKEN"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    if err != nil { return nil, err }
    defer res.Body.Close()
    if res.StatusCode >= 300 {
        return nil, fmt.Errorf("status %d", res.StatusCode)
    }
    p := &Proxy{}
    return p, json.NewDecoder(res.Body).Decode(p)
}

func main() {
    p, _ := CreateProxy("alice-dev", 3000)
    fmt.Println(p.URL)
}

Go istemcisinin tamamı bu — module nodetonet dışında herhangi bir go.mod gerekmez. Daha büyük bir serviste son tarih yayılımı gerekiyorsa deyimsel Go yaklaşımı context.WithTimeout ile güzel eşleşir.

4 · Ruby

Yine standart kütüphane — net/http ve json kullanır. Gem bağımlılığı eklemeden bir Rails uygulamasına veya Sinatra betiğine bırakın.

# nodetonet.rb
require 'net/http'
require 'json'
require 'uri'

TOKEN = ENV.fetch('NTN_TOKEN')

def create_proxy(subdomain, target_port, target_host: '127.0.0.1')
  uri = URI('https://nodetonet.com/api/v1/proxies')
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  req = Net::HTTP::Post.new(uri)
  req['Authorization'] = "Bearer #{TOKEN}"
  req['Content-Type']  = 'application/json'
  req.body = {
    subdomain: subdomain,
    target_host: target_host,
    target_port: target_port,
  }.to_json
  res = http.request(req)
  raise "HTTP #{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
  JSON.parse(res.body)
end

if __FILE__ == $PROGRAM_NAME
  puts create_proxy('alice-dev', 3000)['url']
end

5 · Ölçeklenen hata yönetimi

Yukarıdaki DIY istemciler 2xx olmayan durumda hata çıkarır ama yeniden denemez. Bunları production'da kullanmaya başladığınızda çağrıyı üstel geri-çekimli bir yeniden denemeye sarın: 409 subdomain'in kullanımda olduğu anlamına gelir (yeniden üretin), 429 hız-sınırı (geri çekilin), 5xx geçici (en fazla üç kez yeniden deneyin). 401'i kalıcı hata olarak değerlendirin — token'ınız yanlış veya iptal edilmiş demektir.

# Python — yeniden deneme yardımcısı
import time

def create_with_retry(sub, port, attempts=3):
    for i in range(attempts):
        try:
            return create_proxy(sub, port)
        except requests.HTTPError as e:
            code = e.response.status_code
            if code == 409:
                sub = f"{sub}-{int(time.time()) % 1000}"
            elif code in (429, 500, 502, 503, 504):
                time.sleep(2 ** i)
            else:
                raise
    raise RuntimeError("yeniden denemeler sonunda vazgeçildi")

Production kalitesinde hata yönetiminin tünel yaşam döngüsüyle birlikte tam çalışan bir örneği için Python'da programatik tünel oluşturma'ya bakın. Proxy'leri production otomasyonunda sağlıklı tutmaya ilişkin operasyonel ipuçları için tünel sağlığınızı izleme'ye göz atın.

6 · OpenAPI spec'inden typed istemci üretme

Yukarıda kapsanmayan bir dile ihtiyacınız varsa — Java, C#, Swift, Kotlin, Rust, PHP — /openapi.json adresinde yayınladığımız spec'e karşı openapi-generator kullanın. Generator modeller, istek oluşturucular ve temel hata yönetimiyle eksiksiz bir typed istemci üretir:

npx @openapitools/openapi-generator-cli generate   -i https://nodetonet.com/openapi.json   -g python   -o ./nodetonet-istemci

python yerine generator'ın desteklediği herhangi bir hedefi koyun. Üretilen kod ayrıntılı ama doğru; resmi SDK'yı beklerken IDE otomatik tamamlama ve istek-şekli doğrulaması sağlar.

7 · Resmi SDK'lar yol haritasında

REST API kanonik arayüzdür ve öyle kalacak. SDK'lar üstüne konan kolaylıklardır: yeniden deneme, sayfalama, yapılandırılmış hatalar ve IDE'nin istek şeklini tamamlaması. Şu sırayla yayınlıyoruz:

Yukarıdaki DIY sarıcılardan resmi SDK'lara geçiş tek satırlık bir import değişikliği olacak — fonksiyon ve alan adları kasıtlı olarak hizalı tutuldu. İlerlemeyi takip etmek için değişiklik günlüğü ve yol haritası'na bakın.

İlgili kaynaklar

Sıkça sorulan sorular

Nodetonet neden resmi SDK'lardan önce REST API yayınladı?
Bir REST API aynı anda her dile hizmet eder. Resmi olarak desteklenen SDK'ların her biri tek bir dili kapsar ve sürüm döngüsü başına özel bakım gerektirir. API'yi önce yayınlayarak tüm kullanıcıların önünü hemen açtık; SDK'lar daha sonra talep sırasına göre üste ekleniyor. Python ve Node.js 2026 3. çeyrek için sıranın başında.
OpenAPI spec'inden bugün typed bir istemci üretebilir miyim?
Evet. openapi-generator generate -i https://nodetonet.com/openapi.json -g python -o ./client komutunu çalıştırın (python yerine desteklenen herhangi bir dili koyun). Üretilen istemci ayrıntılı ama doğru — resmi SDK'yı beklerken otomatik tamamlama ve istek-şekli doğrulaması sağlar.
DIY örneklerden resmi SDK'ya geçiş kodumu bozar mı?
Hayır. Fonksiyon adları (create_proxy, delete_proxy, list_proxies) ve alan adları kasıtlı olarak REST şekliyle hizalanmış, dolayısıyla geçiş çoğunlukla tek satırlık bir import değişikliği olacak. Resmi SDK yeniden deneme, sayfalama iteratörleri ve typed hata sınıfları ekler — bunların hiçbiri mevcut çağrı yerlerini bozmaz.
API token'ımı nerede bulabilirim?
Paneldeki /tokens altında. Şifre gibi davranın: bir ortam değişkeninde saklayın (asla kaynak kontrolüne koymayın), ifşa olduğunu düşünüyorsanız döndürün ve ayrı uygulamalar için ayrı token'lar oluşturun, böylece birini diğerlerini etkilemeden iptal edebilirsiniz. Tam güvenlik rehberi için API anahtarınızı anlama yazısına bakın.
API aracılığıyla hangi kaynak türlerini yönetebilirim?
Bugün birincil kaynak proxy'lerdir — HTTP tünelleri ve mobil proxy uç noktalarının arkasındaki nesnelerin aynısı. Oluşturabilir, listeleyebilir, inceleyebilir ve silebilirsiniz. Cihaz yönetimi, token grupları ve faturalandırma şimdilik panel arayüzünde; API yüzeyi yeni sürümler yayınladıkça genişleyecek.
SDK örnekleri rotating ve sticky proxy'lerle çalışır mı?
Evet — API proxy uç noktasını oluşturur; rotating veya sticky seçimi oluşturma sırasında değil, bağlantı sırasında bir kullanıcı-adı ekiyle kontrol edilir. Yapışkan oturum için proxy kullanıcı adına -session-XXXX ekleyin. Tam ayrıntı için sözlükteki sticky session ve rotating proxy maddelerine bakın.

Kendi SDK'nızı 20 satırda yazın

/tokens'tan bir token alın ve yukarıdaki örneklerden herhangi birini yapıştırın. İlk tünel 60 saniye sürer.