Nodetonet REST API'si, Bearer token ile kimlik dogrulanan HTTPS uzerinden duz JSON'dir. Kurmak zorunda oldugunuz ozel bir SDK yoktur; platformun tumunu standart requests kutuphane ile Python'dan surebilirsiniz. Bu, mobil proxy olusturma, yapilandirma ve yikma; geo-hedefleme parametreleri atama; donusen token gruplari yonetme; kota, sure ve istemci-bazi dogrulama ayarlama islemlerinin hepsini kendi otomasyon scriptlerinizden yapabilecegiz anlamina gelir.
Bu rehber, her CRUD islemi icin ham tek-seferlik fonksiyonlarla baslar, sonra hepsini herhangi bir projeye suruklep birakabileceginiz kucuk bir NodetonetClient sinifina katlar. Sonunda; sayfalandirma, hiz sinirlamasi ve oturum yeniden kullanimini herhangi bir ekstra bagimlilik olmadan elen atan tek bir dosyaniz olacak.
On kosul: kisisel API anahtarinizi kopyalamis (API anahtarinizi anlama'da anlatildi) ve hard-code etmek yerine bir ortam degiskeninde sakliyorsunuz.
export NTN_KEY="ntn_live_a8c3...f2e1"
1. En az gecerli cagri — proxy'leri listele
Her Nodetonet API cagrisi ayni sekli izler: bir yontem, https://nodetonet.com/api/v1 altindaki bir yol, Authorization: Bearer basligi ve isteege bagli bir JSON govdesi. Yanit her zaman {data: ..., meta: ...} seklindedir.
import os
import requests
KEY = os.environ['NTN_KEY']
BASE = 'https://nodetonet.com/api/v1'
r = requests.get(
f'{BASE}/proxies',
headers={'Authorization': f'Bearer {KEY}'},
timeout=10,
)
r.raise_for_status()
for p in r.json()['data']:
print(p['id'], p['protocol'], p['host'], p['port'])
Tam istemci yuzeyi bu kadar — diger her endpoint bu dort satirin bir varyasyonudur.
2. Geo-hedefleme ile proxy olustur
Bir JSON govedesyle /proxies'e POST atin. Zorunlu alanlar protocol, tokenId ve serverId'dir (proxy'yi calistiracak edge sunucu). Port, baslik ve kimlik bilgileri gibi geri kalan her seyin makul varsayilanlari vardir.
Geo-hedefleme veya operator secimi uygulamak icin, bir baglanti istemcisinin yapacagi gibi kullanici-adi eklerini iletirsiniz; ancak burada bunlari olusturma sirasinda belirlersiniz, boylece her asagi akis istemcisi dogru cikisi otomatik olarak alir:
payload = {
'title': 'scraper-tr-turkcell-1',
'protocol': 'http', # ya da 'socks5' — bkz. /features/socks5-http-proxies
'port': 'auto',
'tokenId': 'tok_3kzl8w9',
'serverId': 'srv_de_1',
# opsiyonel: token duzeyinde bir operator/ulke cikisi zorla
'usernameModifier': '-country-tr', # Turk cikisi araciligiyla yonlendir
}
r = requests.post(
f'{BASE}/proxies',
headers={'Authorization': f'Bearer {KEY}'},
json=payload,
timeout=15,
)
r.raise_for_status()
proxy = r.json()['data']
print('olusturuldu', proxy['id'], '->',
f"http://{proxy['username']}:{proxy['password']}@{proxy['host']}:{proxy['port']}")
Yanit, yeni tahsis edilen username, password, host ve port'u icerir; bir baglanti dizesi olusturmak ve hemen trafik yonlendirmeye baslamak icin ihtiyaciniz olan her sey. SOCKS5 icin asagi akis istemcisinde http:// yerine socks5h:// kullanin.
3. Guncelle ve sil
PATCH, kismi bir payload alir; yalnizca degistirmek istediginiz alanlar. DELETE kalicidir.
# bir proxy'yi yeniden adlandir
requests.patch(
f'{BASE}/proxies/{proxy_id}',
headers={'Authorization': f'Bearer {KEY}'},
json={'title': 'scraper-tr-yeniden-adlandirildi'},
timeout=10,
).raise_for_status()
# yik
requests.delete(
f'{BASE}/proxies/{proxy_id}',
headers={'Authorization': f'Bearer {KEY}'},
timeout=10,
).raise_for_status()
Bir DELETE'in ardindan proxy, birkac saniye icinde her edge node'dan kaldirilir ve port paylasilan havuza geri doner. Uzerinden gecen aktif istemci baglantisi temiz bir TCP kapatmasi alir.
4. Yeniden kullanilabilir bir istemci sinifi
O snippet'leri uc farkli scripte kopyala-yapistirdiktan sonra tek bir sarmalayici isteyeceksiniz. Iste sade, bagimlilik-icermeyen bir tane — tek dosya, miras yok, metaclass numarasi yok — ham requests cagrilarinin yapamadigi dort seyi halleder:
- Baglanti yeniden kullanimi — tek bir
Session, TCP/TLS baglantilarini cagrilar arasinda sicak tutar; bu, bir dongude cok sayida proxy olusturdugunuzda veya incelediginizde onem kazanir. - Otomatik kimlik dogrulama basliglari — Bearer token bir kez oturumda ayarlanir, her cagrida tekrarlanmaz.
- Hiz siniri farkindanligi — 429 yaniti,
retry_afterdegerini tasiy tipli birRateLimitedistisnasina donustururlur, boylece yeniden deneme mantiginiz basliklar analiz etmek zorunda kalmaz. - Saydam sayfalandirma —
iter_proxies()tum sayfalaari gezer; buyuk filolara sahip hesaplara karsi sayfa numaralarini kendiniz takip etmedenfor p in client.iter_proxies():yazabilirsiniz.
import os
import requests
class NodetonetClient:
def __init__(self, key=None, base='https://nodetonet.com/api/v1', timeout=10):
self.key = key or os.environ['NTN_KEY']
self.base = base.rstrip('/')
self.timeout = timeout
self.session = requests.Session()
self.session.headers.update({
'Authorization': f'Bearer {self.key}',
'User-Agent': 'nodetonet-python/0.1',
})
def _req(self, method, path, **kw):
r = self.session.request(
method, f'{self.base}{path}',
timeout=self.timeout, **kw,
)
if r.status_code == 429:
retry = int(r.headers.get('Retry-After', '1'))
raise RateLimited(retry)
r.raise_for_status()
return r.json()
# ---- proxies ----
def list_proxies(self, page=1, per_page=25):
return self._req('GET', '/proxies', params={'page': page, 'perPage': per_page})
def get_proxy(self, proxy_id):
return self._req('GET', f'/proxies/{proxy_id}')['data']
def create_proxy(self, **fields):
return self._req('POST', '/proxies', json=fields)['data']
def update_proxy(self, proxy_id, **fields):
return self._req('PATCH', f'/proxies/{proxy_id}', json=fields)['data']
def delete_proxy(self, proxy_id):
return self._req('DELETE', f'/proxies/{proxy_id}')
# ---- helpers ----
def iter_proxies(self):
page = 1
while True:
resp = self.list_proxies(page=page, per_page=100)
for p in resp['data']:
yield p
if page >= resp['meta']['totalPages']:
return
page += 1
class RateLimited(Exception):
def __init__(self, retry_after):
super().__init__(f'rate limited, retry after {retry_after}s')
self.retry_after = retry_after
5. Toplu olustur ve temizle
c = NodetonetClient()
# bir dongude on proxy ayaga kaldir
for i in range(10):
p = c.create_proxy(
title=f'batch-{i}',
protocol='http',
port='auto',
tokenId='tok_3kzl8w9',
serverId='srv_de_1',
)
print(p['id'], f"http://{p['username']}:{p['password']}@{p['host']}:{p['port']}")
# daha sonra, bu calistiirmadan gelenleri yik
for p in c.iter_proxies():
if p['title'].startswith('batch-'):
c.delete_proxy(p['id'])
Nodetonet aylik abonelik olmadan on odemeli kredi kullandigi icin, sildiginus proxy'ler aninda maliyet tahakkuk ettirmeyi durdurur. Bu, gecici-filo kaliplarini hem pratik hem de ekonomik killar: bir is icin olusturun, bittiginde yikin. Faturalandirma modeli hakkinda daha fazla bilgi icin kullandikca-ode fiyatlandirmasi yazisini okuyun.
6. API araciligiyla sticky oturumlar
Bir asagi akis istemcisinin sticky oturuma ihtiyaci oldugunda (ornegin, IP degistirmeden coklu istekler arasinda giris durumunu korumak icin), o istemciye verdiginiz baglanti dizesindeki proxy kullanici adina bir -session-XXXX eki ekleyin. Ayri bir proxy olusturmaniz gerekmez; ayni endpoint, istemcinin gonderdigi kullanici adi ekine bagli olarak hem donusen hem de sticky trafige hizmet eder.
Oturum kullanici adlarini programatik olarak olusturdunuz bir otomasyonda:
import uuid
def sticky_url(proxy):
session_id = uuid.uuid4().hex[:8]
user = f"{proxy['username']}-session-{session_id}"
return f"http://{user}:{proxy['password']}@{proxy['host']}:{proxy['port']}"
p = c.create_proxy(title='odeme-akisi', protocol='http',
port='auto', tokenId='tok_3kzl8w9', serverId='srv_de_1')
print(sticky_url(p))
7. API yanitleri bir bakista
Asagidaki tablo en cok kullanacaginiz endpoint'leri, HTTP yontemlerini, beklenen basari durumunu ve data alaninin ne icerdigi ozetler:
| Islem | Yontem | Yol | Basari durumu | data alani |
|---|---|---|---|---|
| Proxy'leri listele | GET | /proxies | 200 | Proxy nesneleri dizisi |
| Tek proxy al | GET | /proxies/:id | 200 | Tek proxy nesnesi |
| Proxy olustur | POST | /proxies | 201 | Kimlik bilgilerini iceren yeni proxy |
| Proxy guncelle | PATCH | /proxies/:id | 200 | Guncellenmis proxy nesnesi |
| Proxy sil | DELETE | /proxies/:id | 204 | Bos |
8. Yapilmaya deger hata yonetimi
Produksiyonda gercekten karsilasacaginiz uc basarisizlik modu:
- 401 Yetkisiz — anahtar donusoruldu veya iptal edildi. Gizli deponuzdan yeniden okuyun ve bir kez daha deneyin. Hala basarisiz oluyorsa, bir insana yuzey cikartin.
- 429 Cok Fazla Istek —
retry_aftersaniye geri cekilin ve yeniden deneyin. Yukaridaki sinif, o alani yanit basligindan zaten cikartilmis sekildeRateLimitedfirlatir. - 5xx Sunucu Hatasi — gecici platform sorunu. GET'i aninda yeniden deneyin; POST, PATCH veya DELETE icin birkac saniye bekleyin ve yalnizca islemi kendi tarafinizda idempotent hale getirdiyseniz yeniden deneyin; ornegin kendi
title'inizdaki bir tekilistirme anahtari tasiyarak ve tekrar olusturmadan once o baslikta bir proxy olup olmadigini kontrol ederek.
Async Python'u tercih ediyor musunuz? Ayni sinif seklihttpx.AsyncClientile calisir —requests.Session'i bir async istemciyle degistirin ve her metodaasync/awaitekleyin. Tel protokolu identiktir; yalnizca G/C katmani degisir.
Sirada ne var
- Ilk REST API cagriniz — bu rehberin uzerine insaa edildigi curl duzeyinde giris.
- Toplu islemler: 100 proxy'yi yonetme — buyuk filo otomasyonu icin desenler.
- Token gruplari ve cihaz havuzlari — tek bir endpoint'ten bircok telefona nasil round-robin yapilir.
- Rotating mobil proxy ne zaman kullanilir — istemci mantiginizi yazmadan once rotating ve sticky arasinda karar verin.
- Mobil proxy genel bakisi — yaptiginiz API cagrilarinin ardinindaki platform yetenekleri.
- Proxy checker — olusturdugunuz proxy'nin canlı oldugunu ve beklenen IP'yi donduruyor oldugunu dagitimdan once dogrulayin.
Gelistirmeye baslamaya hazir misiniz? Ucretsiz bir hesap olusturun ve bir dakika icinde API anahtarinizi alin.