Python için SMS Doğrulama API'si
Bu sayfa, SMSBulk SMS doğrulama API'si için Python entegrasyon rehberi: script'iniz size özel bir telefon numarası satın alır, doğrulama SMS'ini bekler ve kodu JSON olarak okur. Tek bir pip install (requests) tüm akışı karşılar; aşağıdaki production seviyesi script kopyala-yapıştır çalışır.
pip ile kurulum
Tek bağımlılık requests; API düz REST ve JSON olduğundan zorunlu bir SDK yok. Panelden bir anahtar oluşturun, ortam değişkeni olarak dışa aktarın ve script'i çalıştırın. Projeniz zaten httpx veya aiohttp kullanıyorsa her çağrı bire bir çevrilir.
python3 --version # 3.9 or newer
# One dependency, in a virtual environment:
python3 -m venv .venv && source .venv/bin/activate
pip install requests
# Keep the API key out of your source code:
export SMSBULK_API_KEY=smsbulk_your_key_here
python verify.pyTek başlıkla kimlik doğrulama
Kimlik doğrulamalı her istek anahtarı X-API-Key başlığıyla gönderir; requests.Session bunu tüm akış için bir kez ayarlar. Anahtarı ortam değişkeninde veya secret yöneticinizde tutun, asla kaynak koda koymayın. Anahtarlar panelde oluşturulur, döndürülür ve iptal edilir; anahtarın açtığı tüm endpoint listesi API dokümantasyonu içindedir.
Python'da production seviyesi OTP akışı
Döngü, platformun etrafına kurulduğu üç çağrının aynısı: aktivasyon oluştur, kod gelene kadar sorgula, onayla. Bu sürüm gerçek bir servisin ihtiyacı gibi sertleştirildi: temkinli urllib3 Retry politikalı bir session, her istekte timeout ve zaman aşımına uğrayan beklemenin otomatik iadeyle sonuçlanması için iptal yolu.
# verify.py (pip install requests)
import os
import time
import requests
from requests.adapters import HTTPAdapter, Retry
BASE = "https://smsbulk.net/api/v1"
# Retries are deliberately conservative: rate limits and 5xx are retried
# with backoff for GET and DELETE only. A failed POST is never retried
# blindly, so an ambiguous error can never buy two numbers.
session = requests.Session()
session.headers["X-API-Key"] = os.environ["SMSBULK_API_KEY"] # smsbulk_...
session.mount(
"https://",
HTTPAdapter(
max_retries=Retry(
total=3,
backoff_factor=1,
status_forcelist=(429, 500, 502, 503, 504),
allowed_methods=("GET", "DELETE"),
)
),
)
class SmsBulkError(RuntimeError):
pass
def api(method: str, path: str, timeout: float = 15, **kwargs):
r = session.request(method, BASE + path, timeout=timeout, **kwargs)
if r.status_code >= 400:
raise SmsBulkError(f"SMSBulk API {r.status_code}: {r.text}")
return r.json() if r.text else None
def receive_otp(
service_code: str,
country_iso: str,
poll_s: float = 5,
max_wait_s: float = 600,
) -> str:
# 1) Buy a dedicated number
activation = api(
"POST",
"/activations",
json={"serviceCode": service_code, "countryIso": country_iso},
)
print("Number:", activation["phoneNumber"])
# 2) Poll until the verification code arrives
deadline = time.monotonic() + max_wait_s
while time.monotonic() < deadline:
time.sleep(poll_s)
a = api("GET", f"/activations/{activation['id']}")
if a["status"] == "RECEIVED":
# 3) Confirm the code was used
api("POST", f"/activations/{activation['id']}/complete")
return a["smsCode"]
if a["status"] in ("CANCELLED", "EXPIRED", "REFUNDED"):
raise SmsBulkError("Ended without SMS: " + a["status"])
# 4) Give up: cancel so the charge returns to your balance
# automatically. Cancellation unlocks a couple of minutes after
# purchase, so keep max_wait_s comfortably above that window.
api("DELETE", f"/activations/{activation['id']}")
raise TimeoutError(f"No SMS within {max_wait_s:.0f}s, activation cancelled and refunded")
if __name__ == "__main__":
print("Verification code:", receive_otp("tg", "US"))İstek imzaları, üretim API'sine karşı uçtan uca doğrulanan imzaların birebir aynısı. Akılda tutulacak iki ayrıntı: Retry politikası POST'u bilinçli olarak dışarıda bırakır (belirsiz bir hata iki numara satın almamalı) ve iptal, satın almadan birkaç dakika sonra açılır; bekleme penceresini bunun üzerinde tutun. Tüm endpoint'ler ve yanıt alanları API dokümantasyonu içinde tanımlı.
Webhook değil, polling
v1 API polling tabanlıdır: status RECEIVED olana ve smsCode alanı dolana kadar aktivasyon durumunu sorgularsınız. Yapılandırılacak webhook yok; bu, dışarıya açılıp güvenceye alınacak bir callback URL'i de yok demektir. Beş saniyelik sleep iyi bir varsayılandır; kodların çoğu birkaç sorguda düşer.
Django veya Flask uygulamasında polling döngüsünü request döngüsünde değil, arka plan worker'ında çalıştırın (Celery task'i doğal olarak uyar) ve aktivasyon id'sini kalıcı saklayın ki tekrar denemeler yeniden satın almak yerine aynı aktivasyona devam etsin.
Python'da scraping olmadan SMS almak
"python receive sms" eğitimlerinin çoğu herkese açık SMS sitelerini scrape etmekle bitiyor. Bu yaklaşım sürekli kırılır (markup değişir, rate limit ve captcha gelir) ve o numaralar paylaşımlı gelen kutularıdır: size gelen kodu herkes okuyabilir ve çoğu platform o aralıkları çoktan kara listeye almıştır.
API aynı sonucu düzgün biçimde verir: yalnızca size ayrılmış özel bir numara, kodu taşıyan bir JSON alanı ve hiçbir şey gelmezse otomatik iade. HTML parse etmek yok, paylaşımlı kutu yok, hangi numaranın hâlâ çalıştığını tahmin etmek yok. Kendi kayıt akışınızı CI'da gerçek numaralarla doğrulamak istiyorsanız SMS doğrulama testi rehberi bunu uçtan uca anlatır.
Popüler servisler için canlı başlangıç fiyatları
Fiyatlar başarılı doğrulama başınadır ve ülkeye göre değişir. Bu başlangıç fiyatları canlı katalogdan gelir ve bu sayfada saatlik yenilenir:
Kodunuz aynı veriyi okuyabilir: katalog endpoint'leri herkese açıktır ve doğrulayabileceğiniz her şey servis kataloğu sayfasında listelidir.
Python SMS API SSS
requests mi, httpx mi kullanmalıyım?
Yukarıdaki script'teki gibi HTTPAdapter Retry politikalı requests, senkron taraf için kanıtlanmış tercihtir. Async veya HTTP/2 gerektiğinde httpx'i seçin; endpoint'ler, başlıklar ve JSON gövdeleri aynı olduğundan sonradan geçiş mekaniktir.
Resmi bir pip paketi veya SDK var mı?
SDK gerekmez: API düz REST ve JSON'dır; yukarıdaki akışın tek bağımlılığı requests. Klasik bir servis yerine AI ajanı kuruyorsanız, resmi MCP sunucusu dokümantasyonu aynı işlemleri yerel araçlar olarak sunar.
Bunu asyncio ile nasıl çalıştırırım?
requests yerine httpx.AsyncClient, time.sleep yerine asyncio.sleep koyun; polling döngüsü bire bir eşlenir. Alternatif olarak senkron akışı koruyup uygulamanızın yalnızca kenarlarında async gerekiyorsa bir thread veya process havuzunda çalıştırın.
Django, Flask veya Celery'ye nasıl oturur?
Doğrulamayı bir arka plan işi gibi ele alın: servis kodu ve ülkeyle bir task kuyruğa atın, aktivasyonu worker oluştursun ve sorgulasın, aktivasyon id'sini kalıcı saklayın ki tekrar denemeler yeniden satın almak yerine devam etsin. Polling'i web request döngüsünün dışında tutun.
Çok sayıda doğrulamayı paralel çalıştırabilir miyim?
Evet, aktivasyonlar bağımsızdır; akışın üzerinde bir thread havuzu veya asyncio gather çalışır. Ölçeklenirken belgelenmiş hız limitlerine uyun, aktivasyonları cursor sayfalamayla listeleyin ve maliyetleri cüzdan hareketlerinden aktivasyon bazında mutabık edin.
Kod hiç gelmezse ne olur?
Yukarıdaki akış bekleme penceresinden sonra aktivasyonu iptal eder ve tutar bakiyenize otomatik döner. Yalnızca kod teslim eden doğrulamalar için ödersiniz.
Keşfetmeye devam edin
Dilden bağımsız API'yi SMS doğrulama API'si sayfası derinlemesine anlatır; aynı akışın Node.js sürümü Node.js için SMS API adresinde. Hata kodlarından sayfalamaya geri kalan her şey API dokümantasyonu içinde.
