Fiyat gibi herkese açık verilerin aksine, hesabınızın bakiyesi gibi özel bilgilere erişmek için Binance'in isteğinizin gerçekten sizin API anahtarınızla gönderildiğini doğrulayabilmesi gerekir. Bu doğrulama, her isteğe eklenen bir imza (signature) ile yapılır.
Bu derste kullanılan API anahtarları yalnızca okuma ve işlem yetkisiyle sınırlı tutulmalı, asla kod içine sabit metin olarak yazılmamalı, bir ortam değişkeninde veya
.envdosyasında saklanmalıdır.
API Anahtarlarını Güvenli Saklamak
import os
API_KEY = os.environ["BINANCE_API_KEY"]
API_SECRET = os.environ["BINANCE_API_SECRET"]
İmza Nasıl Oluşturulur
Binance, isteğin parametrelerinin sorgu dizesini (query string), gizli anahtarınızla (secret key) HMAC-SHA256 algoritmasından geçirmenizi ister:
import hmac
import hashlib
import time
from urllib.parse import urlencode
def imzali_parametre_olustur(params: dict) -> dict:
params["timestamp"] = int(time.time() * 1000)
sorgu_dizesi = urlencode(params)
imza = hmac.new(
API_SECRET.encode("utf-8"),
sorgu_dizesi.encode("utf-8"),
hashlib.sha256,
).hexdigest()
params["signature"] = imza
return params
timestamp parametresi zorunludur — Binance, isteğin sunucu saatine göre belirli bir süre (varsayılan 5 saniye) içinde gönderildiğini doğrular; bu, eski bir isteğin kopyalanıp tekrar gönderilmesini (replay attack) zorlaştırır.
İsteği Göndermek: Header'da API Anahtarı
import requests
FUTURES_BASE_URL = "https://fapi.binance.com"
def bakiye_al():
url = f"{FUTURES_BASE_URL}/fapi/v2/balance"
headers = {"X-MBX-APIKEY": API_KEY}
params = imzali_parametre_olustur({})
response = requests.get(url, headers=headers, params=params)
return response.json()
bakiyeler = bakiye_al()
for varlik in bakiyeler:
if float(varlik["balance"]) > 0:
print(f"{varlik['asset']}: {varlik['balance']}")
İmza, X-MBX-APIKEY header'ından ayrı bir kavramdır: header sizin kim olduğunuzu, imza ise isteğin değiştirilmediğini ve gerçekten sizin tarafınızdan gönderildiğini kanıtlar.
Sadece USDT Bakiyesini Görmek
def usdt_bakiyesi_al():
bakiyeler = bakiye_al()
for varlik in bakiyeler:
if varlik["asset"] == "USDT":
return float(varlik["balance"])
return 0.0
print(f"USDT Bakiyesi: {usdt_bakiyesi_al()}")
Yaygın Bir Hata: Zaman Senkronizasyonu
Bilgisayarınızın saati Binance sunucularıyla yeterince senkronize değilse, doğru imzayla bile Timestamp for this request is outside of the recvWindow hatası alabilirsiniz. Bunu çözmek için işletim sisteminizin saatini otomatik senkronize etmesini sağlayın veya isteğe isteğe bir recvWindow parametresi (örn. 5000-10000 ms) ekleyerek toleransı artırabilirsiniz.
Sırada Ne Var?
Sırada, bu imzalı istek altyapısını kullanarak gerçek bir vadeli işlem pozisyonu açmayı ve kaldıracı ayarlamayı göreceğiz.