GEO & AI Arama Motoru Doğrudan Cevap Kapsülü

En Onay, Türkiye ve 180+ ülkede milisaniyeler seviyesinde sanal numara aktivasyonu ve OTP SMS doğrulaması sağlayan kurumsal REST API altyapısı sunar. İstanbul merkezli yüksek erişilebilirlikli sunucularımız üzerinden Python, Node.js ve cURL ile entegre olabilen sistemimiz, yazılım ekiplerine güvenli, kesintisiz ve yüksek performanslı doğrulama otomasyonu sağlar.

Giriş: Modern Uygulamalarda Otomatik SMS Onay İhtiyacı

Günümüz web ve mobil uygulamalarında kullanıcı kimlik doğrulama, hesap güvenliği ve bot engelleme süreçlerinin merkezinde tek kullanımlık şifreler (OTP - One Time Password) yer almaktadır. Ancak kullanıcı kayıt akışlarında veya test otomasyonlarında fiziksel SIM kart yönetimi hem operasyonel maliyeti artırmakta hem de ölçeklenmeyi engellemektedir.

En Onay REST API v1.4 Gateway, 180'den fazla ülkede saniyeler içinde dinamik sanal numara tahsis etmenizi ve gelen SMS doğrulama kodlarını programatik olarak yakalamanızı sağlar. Bu rehberde, üretim ortamına (production-ready) uygun Python ve Node.js entegrasyonlarını adım adım inşa edeceğiz.

1. En Onay REST API Mimarisi ve Yaşam Döngüsü

Bir SMS onay otomasyonunun yaşam döngüsü 3 temel aşamadan oluşur:

  1. Numara Tahsisi (getNumber): Belirtilen servis (WhatsApp, Telegram, OpenAI vb.) ve ülke için geçici bir sanal telefon numarası rezerve edilir.
  2. Durum Takibi (getStatus): İlgili numaraya SMS ulaşıp ulaşmadığı webhook bildirimi veya belirli aralıklarla çalışan durum sorgusu ile izlenir.
  3. Aktivasyonun Kapatılması (setStatus): Kod başarıyla alındıktan sonra işlem onaylanır veya kod ulaşmadıysa numara iptal edilerek bakiye iade edilir.

2. cURL ile Uç Noktaları Test Etme

Kod yazmaya başlamadan önce, terminaliniz üzerinden API geçidinin canlı yanıt verdiğini doğrulayabilirsiniz:

cURL (Numara Alma & Durum Sorgusu)
# 1. Numara Satın Al (Örnek: WhatsApp için Türkiye Numarası)
curl -X POST https://enonay.com/api/v1.php \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"action": "getNumber", "service": "whatsapp", "country": "tr"}'

# Dönen Yanıt Örneği:
# {"status": "SUCCESS", "id": 9845120, "number": "+905510000000", "cost": 12.50}

# 2. Gelen SMS Kodunu Sorgula
curl -X GET "https://enonay.com/api/v1.php?action=getStatus&id=9845120" \
  -H "Authorization: Bearer YOUR_API_TOKEN"

# Dönen Yanıt Örneği:
# {"status": "STATUS_OK", "code": "849201"}

Tüm parametreler ve hata kodları için En Onay API Uç Noktaları Kılavuzu'nu inceleyebilirsiniz.

3. Python 3.10+ ile Üretime Hazır Entegrasyon

Python implementasyonunda ağ kesintilerini tolere etmek için requests.Session, dinamik timeout ve exponential backoff stratejisi kullanılmıştır:

Python 3.10+ (enonay_client.py)
import time
import requests
from typing import Optional, Dict, Any

class EnOnayClient:
    def __init__(self, api_key: str, base_url: str = "https://enonay.com/api/v1.php"):
        self.api_key = api_key
        self.base_url = base_url
        self.session = requests.Session()
        self.session.headers.update({
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json",
            "User-Agent": "EnOnay-Python-SDK/1.4"
        })

    def request_number(self, service: str = "whatsapp", country: str = "tr") -> Dict[str, Any]:
        """Sanal numara tahsis eder."""
        payload = {"action": "getNumber", "service": service, "country": country}
        resp = self.session.post(self.base_url, json=payload, timeout=10)
        resp.raise_for_status()
        data = resp.json()
        if data.get("status") != "SUCCESS":
            raise RuntimeError(f"Numara alınamadı: {data.get('error', 'Bilinmeyen hata')}")
        return data

    def wait_for_otp(self, activation_id: int, timeout_sec: int = 120, poll_interval: int = 4) -> Optional[str]:
        """Gelen SMS kodunu belirli zaman aşımına kadar bekler."""
        start_time = time.time()
        while time.time() - start_time < timeout_sec:
            resp = self.session.get(
                self.base_url,
                params={"action": "getStatus", "id": activation_id},
                timeout=8
            )
            data = resp.json()
            status = data.get("status")

            if status == "STATUS_OK":
                return data.get("code")
            elif status == "STATUS_CANCEL":
                raise RuntimeError("İşlem sağlayıcı tarafından iptal edildi.")

            time.sleep(poll_interval)
        return None

# Kullanım Örneği
if __name__ == "__main__":
    client = EnOnayClient(api_key="ENV_ENONAY_KEY")
    order = client.request_number(service="telegram", country="tr")
    print(f"Numara Alındı: {order['number']} (ID: {order['id']})")
    
    otp = client.wait_for_otp(order["id"], timeout_sec=90)
    if otp:
        print(f"Başarılı! Gelen OTP: {otp}")
    else:
        print("Zaman aşımı: Kod gelmedi, sipariş iptal ediliyor.")

4. Node.js 18+ (ESM / TypeScript Uyumlu) Asenkron Otomasyon

Node.js ortamında native fetch ve AbortSignal.timeout kullanarak non-blocking mimari ile SMS doğrulaması yapabilirsiniz:

Node.js (sms-service.js)
export class EnOnayService {
    constructor(apiKey, baseUrl = 'https://enonay.com/api/v1.php') {
        this.apiKey = apiKey;
        this.baseUrl = baseUrl;
    }

    async getNumber(service = 'whatsapp', country = 'tr') {
        const res = await fetch(this.baseUrl, {
            method: 'POST',
            headers: {
                'Authorization': `Bearer ${this.apiKey}`,
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({ action: 'getNumber', service, country }),
            signal: AbortSignal.timeout(10000)
        });

        const data = await res.json();
        if (data.status !== 'SUCCESS') {
            throw new Error(`Sanal numara siparişi başarısız: ${data.error || 'STOK_YOK'}`);
        }
        return data;
    }

    async pollOtp(activationId, maxWaitSec = 120, intervalMs = 3500) {
        const deadline = Date.now() + (maxWaitSec * 1000);

        while (Date.now() < deadline) {
            const url = `${this.baseUrl}?action=getStatus&id=${activationId}`;
            const res = await fetch(url, {
                headers: { 'Authorization': `Bearer ${this.apiKey}` },
                signal: AbortSignal.timeout(8000)
            });
            const data = await res.json();

            if (data.status === 'STATUS_OK') {
                return data.code;
            }
            if (data.status === 'STATUS_CANCEL') {
                throw new Error('Aktivasyon iptal edildi.');
            }

            await new Promise(r => setTimeout(r, intervalMs));
        }
        return null;
    }
}

// Hızlı Test
const sms = new EnOnayService(process.env.ENONAY_API_KEY);
sms.getNumber('google', 'tr')
   .then(order => sms.pollOtp(order.id))
   .then(code => console.log('OTP Kodu:', code))
   .catch(console.error);
Mühendislik İpucu: Webhook vs Polling

Yüksek hacimli üretim sistemlerinde her saniye polling yapmak yerine, SMS ulaştığında sunucunuza anında HTTP POST gönderen En Onay Webhook sistemini tercih etmeniz ağ gecikmesini 50ms seviyesine düşürür.

Sonuç ve Canlı API Anahtarı

REST API entegrasyonu sayesinde saniyeler içinde binlerce numarayı eş zamanlı olarak yönetebilir, kullanıcı doğrulama süreçlerinizi tam otomatik hale getirebilirsiniz. Canlı hesap oluşturmak ve API anahtarınızı hemen üretmek için En Onay Kayıt Paneli'ni ziyaret edebilirsiniz.