Python ile E-posta Onay Kodu Alma: Gmail OTP API Örneği
Bir Python betiğinde e-postaya gelen doğrulama kodunu (onay kodunu) okumak üç HTTP çağrısına iner: gelen kutusunu kiralamak, kod gelene kadar sorgulamak ve vazgeçerseniz siparişi iptal etmek. Bu rehber, OTPGmail'in REST API'si üzerinden bu akışı yalnızca requests ve standart kütüphaneyle kurar. Açıklamalar Türkçe, kod İngilizcedir.
Bu örnek, kendi kayıt akışlarınızı test eden geliştiriciler ve QA ekipleri için yazıldı. Üçüncü taraf bir platformda kayıt yapıyorsanız o platformun kullanım şartlarına uymak sizin sorumluluğunuzdadır.
Başlamadan önce
- API anahtarı: her OTPGmail hesabının
og_ile başlayan kişisel bir API anahtarı vardır; hesap sayfasında görünür ve gerektiğinde yeniden oluşturulabilir. AnahtarıAuthorization: Bearer <anahtar>başlığıyla gönderin. - Bakiye: kiralama ücreti bakiyeden düşülür; ücret yalnızca gelen kutusu verildiğinde kesilir.
- Belgeler: tüm uç noktalar ve alanlar API belgelerinde.
- Hizmet kodları:
GET /v1/servicesher hizmetin kodunu, fiyatını, stokunu ve iCloud bilgisini döndürür. Örneğin GitHub'ın kodugit, ChatGPT'ninki isedr.
Akış: üç çağrı
POST /v1/ordersile seçtiğiniz hizmet için bir adres kiralayın.GET /v1/orders/{orderId}ile her 3–5 saniyede bir sorgulayın;otpdizisi dolunca kod gelmiştir.- Beklemekten vazgeçerseniz
POST /v1/orders/{orderId}/cancelçağırın; ilk kod gelmediyse tutarın %100'ü iade edilir.
Siz hiçbir şey yapmasanız da kod gelmeyen sipariş, bekleme süresi (en fazla 25 dakika) dolunca kendiliğinden iptal olur ve iade edilir. Yani üçüncü adım bir zorunluluk değil, bakiyenizi daha erken geri almanın yoludur.
Gelen kutusu kiralama
import time
import uuid
import requests
HOST = "otpgmail.net"
BASE = f"https://{HOST}/v1"
HEADERS = {"Authorization": "Bearer og_YOUR_API_KEY"}
def rent(service, domain="gmail.com"):
resp = requests.post(
f"{BASE}/orders",
json={"service": service, "domain": domain},
headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())},
timeout=15,
)
body = resp.json()
if not body.get("success"):
raise RuntimeError(body["error"]["code"])
return body["data"][0] # data bir dizidir: her gelen kutusu için bir sipariş
domain isteğe bağlıdır; göndermezseniz gmail.com kullanılır, hizmet destekliyorsa icloud.com gönderebilirsiniz. Idempotency-Key başlığı önemlidir: her yeni sipariş için yeni bir UUID üretin, zaman aşımından sonra aynı siparişi yeniden denerken aynı anahtarı kullanın; böylece ikinci bir gelen kutusu için ücret ödemezsiniz. Sipariş çağrısı yoğun anlarda birkaç saniye sürebileceği için istemci zaman aşımını yaklaşık 15 saniye tutun.
Standart kütüphanedeki urllib yerine requests kullanın: urllib'in varsayılan kullanıcı aracısı API'nin önündeki CDN tarafından reddedilebilir.
Kodu bekleme ve iptal
def wait_for_code(order_id, max_wait=600, interval=4):
deadline = time.time() + max_wait
while time.time() < deadline:
resp = requests.get(f"{BASE}/orders/{order_id}", headers=HEADERS, timeout=15)
order = resp.json()["data"]
if order["otp"]:
return order["otp"][-1]["code"] # en yeni kod dizinin sonundadır
if order["status"] == "cancelled":
return None # bekleme süresi doldu, ücret iade edildi
time.sleep(interval)
# Kendi sınırınız doldu: ilk koddan önce iptal edip iade alın
requests.post(f"{BASE}/orders/{order_id}/cancel", headers=HEADERS, timeout=15)
return None
3–5 saniyelik aralık hem kodu hızlı yakalar hem de hız sınırının çok altında kalır. otp dizisi en eskiden en yeniye sıralıdır, bu yüzden otp[-1] her zaman son kodu verir. Bazı hizmetler kod yerine doğrulama bağlantısı gönderir; bu durumda bağlantı da code alanında gelir. Hizmet birden fazla kod gönderiyorsa sonraki kodlar sipariş süresi içinde dizinin sonuna kendiliğinden eklenir; birçok hizmet ise yalnızca tek kod gönderir.
Hepsini birleştirmek
try:
order = rent("git", domain="icloud.com")
except RuntimeError as e:
if str(e) in ("DOMAIN_UNAVAILABLE", "NO_MAILS_AVAILABLE", "OUT_OF_STOCK"):
order = rent("git", domain="gmail.com") # Gmail ile yeniden dene
else:
raise
print("Adres:", order["email"])
# Bu adresi kayıt formuna yazıp gönderin, sonra beklemeye başlayın
code = wait_for_code(order["orderId"])
print("Kod:", code or "gelmedi")
Adresi hedef sitenin formuna yazıp kodu istedikten sonra beklemeye başlayın; form gönderilmeden kod oluşmaz. Gmail ile iCloud arasındaki farklar için iCloud mail kiralama mı, Gmail mi rehberine, GitHub'a özel notlar için GitHub için Gmail kiralama sayfasına bakın.
curl ile aynı akış
HOST=otpgmail.net
KEY=og_YOUR_API_KEY
# Sipariş aç
curl -s -X POST "https://$HOST/v1/orders" \
-H "Authorization: Bearer $KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"service":"git","domain":"gmail.com"}'
# Siparişi sorgula (3-5 saniyede bir)
curl -s "https://$HOST/v1/orders/ORDER_ID" -H "Authorization: Bearer $KEY"
# İlk koddan önce iptal et
curl -s -X POST "https://$HOST/v1/orders/ORDER_ID/cancel" -H "Authorization: Bearer $KEY"
Hata kodları
NO_MAILS_AVAILABLE,OUT_OF_STOCK: o hizmet için şu an gelen kutusu yok. Ücret kesilmez; kısa bir beklemeden sonra yeniden deneyin ya dadomaindeğiştirin.DOMAIN_UNAVAILABLE: hizmette iCloud yok veya geçici olarak kapalı;gmail.comile deneyin.INSUFFICIENT_BALANCE: bakiye yetersiz; önce bakiye yükleyin.VALIDATION_ERROR: istek alanlarından biri hatalı; hizmet kodunuGET /v1/servicesile karşılaştırın.ORDER_NOT_CANCELLABLE: ilk kod gelmiş ya da hizmetin kendi kuralı iptale izin vermiyor.RATE_LIMITED(HTTP 429): anahtar başına istek sınırı (varsayılan olarak saniyede 20, dakikada 900 istek) aşıldı;Retry-Afterbaşlığındaki süre kadar bekleyin.
İsteğe bağlı warehouse alanıyla kaynak seçebilirsiniz: 0 stokta olan en ucuz kaynağı, 99 ise biri tükendiğinde sıradakine geçen otomatik seçimi kullanır. 99 ile tüm kaynaklar denenip gelen kutusu bulunamazsa ALL_WAREHOUSES_EXHAUSTED döner ve ücret kesilmez.
Test otomasyonu için ipuçları
- Her test için bir sipariş: sipariş kimliğini test günlüğüne yazın; hata ayıklarken hangi adresin kullanıldığını görürsünüz.
- Temizlik adımında iptal: test, kod gelmeden biterse siparişi iptal edin; ilk koddan önce iptal edilen sipariş %100 iade edilir.
- Gerçekçi bekleme süresi:
max_waitdeğerini bekleme süresinden uzun tutmanın anlamı yoktur, sistem siparişi o noktada zaten kapatır. - Paralel testler: tek istekte
quantityalanıyla en fazla 200 gelen kutusu kiralanabilir; paralel sorgularda hız sınırını gözetin. - Toplu ihtiyaç: çok sayıda adresi web'deki toplu kiralamayla da alabilirsiniz; Gmail toplu siparişlerinde her adresin API anahtarı gerektirmeyen bir kod bağlantısı olur.
Python, Node.js, PHP, C# ve curl için hazır istemciler herkese açık otpgmail-email-otp-api deposunda. İade kurallarının tamamı iade ve garanti politikası sayfasında; API anahtarınızı almak için uygulamaya giriş yapın.
Sıkça sorulan sorular
Neden Idempotency-Key başlığı gerekiyor?
Bağlantı koptuğunda yeniden gönderilen isteğin ikinci bir gelen kutusu kiralamaması için. Aynı anahtarı yalnızca aynı siparişi yeniden denerken kullanın, her yeni sipariş için yeni bir UUID üretin.
max_wait değerini ne kadar tutmalıyım?
Hizmete bağlıdır: GitHub gibi bazı hizmetler kodu genellikle bir dakikadan kısa sürede gönderir, bazıları birkaç dakika sürer. Bekleme süresinden uzun bir değer vermenin etkisi yoktur; sistem kod gelmeyen siparişi o noktada iptal edip iade eder.
Tek çağrıda birden fazla gelen kutusu kiralayabilir miyim?
Evet, istek gövdesine quantity alanı ekleyin (en fazla 200). Bu durumda data dizisi her gelen kutusu için bir sipariş içerir.
Kod gelmeden önce otp[-1] ne döndürür?
otp ilk kod gelene kadar boş bir dizidir, bu yüzden otp[-1] hata verir. Örnekteki if order["otp"]: kontrolü tam olarak bunu önler.
