Colendi Menkul API icin HMAC imzali REST istemcisi, Rich tabanli terminal uygulamasi ve WebSocket yardimci sinifi.
Bu repo iki ana kullanim sunar:
terminal_app.py: OTP login, portfoy, hisse, VIOP, fon ve WebSocket islemleri icin menu tabanli CLI.api_client.py: Python kodundan dogrudan kullanilabilenAPIveWebSocketsiniflari.
| Dosya | Aciklama |
|---|---|
api_client.py |
HMAC imzali REST istemcisi, token saklama, throttle, session refresher ve WebSocket sinifi |
terminal_app.py |
Rich tabanli interaktif terminal uygulamasi |
config.py |
API URL, client key/secret, kullanici bilgileri ve CLI enum haritalari |
ws_logger.py |
WebSocket mesajlarini ayri pencerede izlemek icin yardimci logger |
api_settings.json |
Login sonrasi olusan JWT token cache dosyasi |
Not: config.py ve api_settings.json icinde hassas bilgi bulunabilir. Bu dosyalari paylasmadan once kontrol edin.
- Python 3.10+
requestswebsocketsrich
Kurulum:
pip install -r requirements.txtconfig.py icindeki alanlari doldurun:
API_HOST = "https://api-client.colendimenkul.com/"
API_URL = API_HOST
CLIENT_KEY = "mail ile paylasilan client key"
CLIENT_SECRET = "mail ile paylasilan client secret"
USERNAME = "Colendi musteri numaraniz"
PASSWORD = "Colendi hesap sifreniz"CLI menulerinde kullanilan enum degerleri de ayni dosyada tutulur:
DIRECTION_MAP = {
1: "Alis",
2: "Satis",
3: "AcigaSatis",
}
ORDER_METHOD_MAP = {
1: "LMT",
2: "PYS",
3: "PKP",
4: "MLM",
5: "MPY",
}
ORDER_METHOD_DESCRIPTION_MAP = {
"LMT": "Limitli",
"PYS": "Piyasa",
"PKP": "Piyasa En Iyi Fiyatli",
"MLM": "MidPoint Limit Emir",
"MPY": "MidPoint Piyasa Fiyatli emir (Gonderilmez ise LMT kabul edilir)",
}
ORDER_DURATION_MAP = {
1: "Gunluk",
2: "KalaniIptalEt",
3: "IptalEdileneKadarGecerli",
4: "TarihliEmir",
5: "GerceklesmezseIptalEt",
6: "DengeleyiciEmir",
7: "KapanisSeansi",
}
ORDER_DURATION_DESCRIPTION_MAP = {
"Gunluk": "GUN - Gunluk",
"KalaniIptalEt": "KIE - Kalani Iptal Et",
"IptalEdileneKadarGecerli": "IKG - Iptal Edilene Kadar Gecerli",
"TarihliEmir": "TAR - Tarihli Emir",
"GerceklesmezseIptalEt": "GIE - Gerceklesmezse Iptal Et",
"DengeleyiciEmir": "IMB - Dengeleyici Emir",
"KapanisSeansi": "KSN - Kapanis Seansi",
}python terminal_app.pyUygulama acilista API bilgilerini gosterir. Kayitli token varsa once onu dener; token gecersizse SMS OTP akisina gecer.
Ana menu:
1) Hesap Bilgisi Menusu
2) Pay Emir Menusu
3) Vadeli Emir Menusu
4) Fon Emir Menusu
5) WebSocket Abonelik Menusu
*) Cikis
| Metot | Endpoint |
|---|---|
send_otp(internet_user, password) |
/Login/LoginSendOtp |
login(otp_code, user_name=..., password=...) |
/Login/LoginVerifyOtp |
| Metot | Endpoint |
|---|---|
get_portfolio_stock() |
/Portfolio/PortfolioStock |
get_portfolio_future() |
/Portfolio/PortfolioFuture |
get_portfolio_fund() |
/Portfolio/PortfolioFund |
| Metot | Endpoint |
|---|---|
new_stock_order(...) |
/Stock/NewStockOrder |
update_stock_order(order_no, price) |
/Stock/UpdateStockOrder |
cancel_stock_order(order_no) |
/Stock/CancelStockOrder |
get_stock_orders(start_date=None) |
/Stock/StockOrders |
get_stock_order_detail(order_no) |
/Stock/StockOrderDetail |
get_stock_orders icin tarih parametresi Python tarafinda datetime olarak verilir:
from datetime import datetime, timedelta
yesterday = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) - timedelta(days=1)
orders = api.get_stock_orders(start_date=yesterday)API bu tarihi request body icinde degil query string olarak bekler:
POST /Stock/StockOrders?startDate=2026-06-24T00%3A00%3A00
body: {}
HMAC imzasi ise query string olmadan /Stock/StockOrders path'i uzerinden uretilir. Bu davranis api_client.py icindeki _post metodunda merkezi olarak ele alinir.
Geriye uyumluluk icin eski startDate= parametre adi da desteklenir:
api.get_stock_orders(startDate=yesterday)Yeni kodda start_date= kullanilmasi onerilir.
Hisse senedi emirleri icin durum kodlari:
| Durum Kodu | Karsiligi |
|---|---|
Y |
BIST'de |
Z |
Sistemde |
X |
Sistemde tahta kapali |
G |
Gerceklesen |
H |
Gun Iptal |
T |
Iptal |
R |
Red |
| Metot | Endpoint |
|---|---|
new_future_order(...) |
/Future/NewFutureOrder |
update_future_order(order_no, price) |
/Future/UpdateFutureOrder |
cancel_future_order(order_no) |
/Future/CancelFutureOrder |
get_future_orders() |
/Future/FutureOrders |
get_future_order_detail(order_no) |
/Future/FutureOrderDetail |
VIOP emirleri icin durum kodlari:
| Durum Kodu | Karsiligi |
|---|---|
Y |
BIST'de |
Z |
Sistemde |
G |
Gerceklesen |
H |
Gun Iptal |
T |
Iptal |
R |
Red |
S |
Askida |
K |
Risk Kontrolu |
| Metot | Endpoint |
|---|---|
get_available_fund_list() |
/Fund/AvaiableFundList |
get_fund_orders() |
/Fund/FundOrders |
new_fund_order(fund_id, buy_sell, quantity, price) |
/Fund/NewFundOrder |
cancel_fund_order(order_no) |
/Fund/CancelFundOrder |
Fon emirleri icin durum kodlari:
| Durum Kodu | Karsiligi |
|---|---|
ES |
Gerceklesmeyi Bekliyor |
MK |
MKK Sisteminde |
IP |
Iptal Edildi |
OK |
Gerceklesti |
from datetime import datetime, timedelta
from api_client import API
from config import API_URL, CLIENT_KEY, CLIENT_SECRET, USERNAME, PASSWORD
api = API.get_api(
api_url=API_URL,
api_key=CLIENT_KEY,
secret_key=CLIENT_SECRET,
verbose=True,
)
otp_response = api.send_otp(USERNAME, PASSWORD)
otp_code = input("SMS kodu: ")
login_response = api.login(otp_code, user_name=USERNAME, password=PASSWORD)
portfolio = api.get_portfolio_stock()
yesterday = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) - timedelta(days=1)
stock_orders = api.get_stock_orders(start_date=yesterday)Login basarili oldugunda access token api_settings.json dosyasina kaydedilir. Sonraki calistirmalarda istemci bu token'i yukler ve gecerliyse tekrar OTP istemeden devam eder.
Terminal uygulamasinda WebSocket menusu AddT, AddY, AddD ve karsilik gelen RemoveT, RemoveY, RemoveD islemlerini config.py icindeki haritalardan okur.
Dogrudan kullanim ornegi:
from api_client import WebSocket
from config import API_URL, CLIENT_KEY, CLIENT_SECRET
ws = WebSocket(
api_url=API_URL,
api_key=CLIENT_KEY,
secret_key=CLIENT_SECRET,
jwt_token="access token",
heartbeat_interval=30,
verbose=True,
)
ws.start()WebSocket sinifi /ws path'i icin HMAC imzasi uretir, TLS ile baglanir, heartbeat gonderir ve baglanti kapanirsa yeniden baglanmayi dener.
- REST ve WebSocket olaylari
logs.logdosyasina yazilir. API.intervalvarsayilan olarak1saniyedir ve istekler arasinda throttle uygular.- Arka planda session refresher thread'i calisir ve yaklasik 270 saniyede bir
PortfolioStockcagrisi yaparak oturumu canli tutar. api_settings.jsontoken cache dosyasidir. Token gecersizse temizlenir ve yeniden OTP akisi gerekir.
- Wrapper tarafinda dis API alanlari camelCase olsa da Python public parametrelerinde snake_case tercih edilir.
- Geriye uyumluluk gereken yerlerde eski camelCase parametre adlari alias olarak tutulabilir.
- Query string kullanan endpointlerde HMAC imzasinin API'nin bekledigi canonical path ile hesaplandigindan emin olun.
- Degisikliklerden sonra en azindan su kontrolu calistirin:
python -m py_compile api_client.py terminal_app.pyBu proje MIT lisansi ile dagitilir. Ayrinti icin LICENSE dosyasina bakin.