Merhaba RC Ailesi.Malumunuz olduğu üzere kriptopara piyasası şu sıralar epey hareketli. Buna ithafen PHP ile Binance Api inceleyeceğiz. Örnek uygulama yapacağız.
Ana sayfada "Dünyanın Lider Kripto Borsası" olarak slogan yazmışlar. Binance kriptopara alıp satabileceğiniz(trading), borsaları, coinleri takip edebileceğiniz, vadeli işlemler(binance futures) yapabileceğiniz bir sistemdir. Mobil arayüzü çok kolay bir arayüze sahiptir. İlk kez coin piyasasına girenler için ise mobilde binance lite geliştirmişler. Daha birsürü güzel özelliği olan Binance‘ın Api‘sini inceleyeceğiz.
Api Ne Olaki?
Api, özetle farklı dillerde kodlanmış farklı yazılımların birbiriyle ortaklaşa çalışmalarını, veri alıp gönderebilen bir şeydir. Diğer bir tanımı ise yazılımdan kullanıcı arayüzünü (UI,UX) çıkarırsanız api kalır. Örneğin Binance, X diliyle kodlanmış olsun ben Y diliyle Binance‘dan koin piyasası hakkında bilgi almak istiyorsam api kullanarak JSON formatında veri alabilir ve gönderebilirim. Apiler genelde JSON formatında veri gönderir ya da alır.
Nasıl Olacak?
Bu örnekte PHP ve Symfony framework kullanarak Binance Api‘ye bağlanacağız. Bunu sağlamak için test ortamı olan Binance Testnet‘i kullanacağız ki testler sırasında gerçek koinlerimize bişey olmasın. Binance Api testnet aynı gerçek Binance gibi çalışır ve kurulum aşamasında size rastgele koinler verir. Siz de bu paralarda tıpkı gerçek piyasada işlem yapar gibi api kullanarak çeşitli işlemler yaparsınız.
Hadi Başlayalım!
Öncelikle Binance Api çok karmaşık bir yapıda olduğu için basite indirgemek için adım adım gideceğiz. PHP altyapımızı kuracağız, sonra binance apimizin entegrasyonunu yapacağız ve tokenlerimizi kullanacağız. En son ise Binance‘dan veri alıp veri göndereceğiz, güncel piyasa verilerini çekip al sat yapacağız.
Adım 1.) Yeni bir Symfony Projesi Oluşturalım
Komut satırına geliyoruz ve cd komutuyla projeyi oluşturmak istediğimiz dizine geliyoruz.
Ardından symfony new cw_koin --full yazıyoruz enter tuşuna tıklıyoruz. Burada komut satırına bizim için cw_koin adında bir proje açmasını ve --full koduyla ise tüm varsayılan geliştirme paketlerini(dependencies) yüklemesini sağlıyoruz. Bu komutu kullanmadığınızda annotation, doctrine gibi paketleri tek tek kurmakla uğraşırdık. İşlem bittiğinde diğer adıma geçeceğiz.
İşlem tamamlandığında şu klasörler oluşturulmuş olacak. [.htaccess hariç, onun için apache-pack yüklemeniz de gerekli]
Adım 2.) Config(ayar) Dosyası Oluşturmak
Symfony sizin için bir proje oluşturduğunda src, bin, var, vendor vb. birsürü klasör oluşturur. Biz config klasörüne gelip config.yaml adında bir dosya oluşturacağız. Bu dosya yazılımımızla ilgili çeşitli ayarları tutacak dosyamız olacak. Binance Api‘den aldığımız tokenleri, istek yapacağımız urlleri komple bu dosyada tutacağız. [Ek Bilgi: YAML kolayca yapılandırma dosyası oluşturacağınız ve aynı zamanda symfony framework tarafından tanınan bir veri stilidir. Okumak yazmak kolaydır. Windowstaki ini dosyaları gibi düşünebilirsiniz.]
Dosyanın içindeki adlar vs. tamamen keyfinize kalmış. Ben oluşturduğum config dosyasında binance api keylerimi ve api istekleri için kullanacağım çeşitli url formatlarını attım. Böylece PHP nin her yerinde bu url leri yazmak yerine merkezi bir config dosyasından yazacağım ki işim kolay olsun.
Adım 3.) Binance Api‘ye Bağlanmak
Öncelikle Binance Api‘de istek atabilmek için belli başlı şartlar var. User Auth yani kullanıcı parametresi diğer adıyla kullanıcı girişi isteyen istekler için token lara ihtiyacım olacak. (Bu token‘ları alabilmek için Binance üyeliğiniz olması gereklidir.)
Test sürüşü için öncelikle Binance Testnet adresine gidiyor ve Github kullanıcımızla oturum açıyoruz. Giriş yaptıktan sonra karşınıza Generate HMAC_SHA256 Key butonu çıkacak. Bu buton bizim için sha256 ile şifrelenmiş bir key ve secret kodu oluşturacak. Bu kodları olduğu gibi kopyalayıp az önce oluşturduğumuz config dosyasına yapıştırıyoruz. Api isteklerini atarken bu kodları header içinde göndereceğizki Binance kim olduğumuzu tanısın ve bize yetki versin.
Api için olmazsa olmaz keylerimizi de aldığımıza göre artık yavaştan yazılım kısmına odaklanabiliriz.
Adım 4.) Endpoint URL Bulmak ve Derlemek
Endpoint URL dediğimiz şey bizim http istekleri göndereceğimiz url adreslerini ifade eder. Ben config dosyamda bu bu adreslerden sadece birkaç tanesini ekleyerek uygulama geliştireceğim. Siz keyfinize göre hangi işlemi yapmak istiyorsanız binance api github adresine giderek buradan resmi api kullanımlarına bakabilirsiniz. Aradığınız tüm cevaplar aslında bu dokümanda var.
Örneğin biz Binance hesabınızda ne kadar bakiye ve hangi cinsten bakiyeler olduğunu sorgulamak istiyorsanız /api/v3/account endpoint kullanacaksınız. Buraya yukarıda aldığınız token‘larla istek atarsanız Binance Api size güncel bakiyenizi JSON formatında sunacaktır. Bu JSON yanıtını hangi dille kullanmak isterseniz hiç fark etmez o dille kullanırsınız.
Adım 5.) Sınıf(Class) Yapısını Oluşturalım
Uygulamamız şimdilik iki adet sınıftan oluşacak. Bu iki adet sınıfı oluşturmak için, proje dizinimize gelip ayrı ayrı;
php bin/console make:controller BaseController
php bin/console make:controller BinanceController
BaseController Sınıfı: Bu sınıf tüm sınıflarımızın en üstünde(parent) sınıfımız olacak. Biz bu sınıfta config dosyamızı yükleyeceğizki alt sınıfların tamamında burada yazdığımız public fonksiyonlarımızı kullanabilelim. Örneğin buradaki appConfig metodumuz ile az önce oluşturduğumuz config dosyasındaki verileri çekeceğiz ve bunu bir alt sınıf olan BinanceController sınıfında kullanacağız.
-- appConfig: Config dosyamızdaki ayarları döndüren fonksiyonumuz.
-- failSafe: Hata çıktığında yazılımdan çıkış yapan fonksiyonumuz. (burada loglama vs. bir şeyler yapılabilir, vakit kısıtlı olduğu için yazdım geçtim.)
BinanceController Sınıfı: BaseController sınıfımızın alt sınıfı olan bu sınıfta ise Binance Api ile ilgili yapmak istediğimiz işlemleri sağlayan metodlarımız(fonksiyonlarımız) olacak. Örneğin Binance‘a bir api isteği göndermek ve almak gibi. Ya da dinamik olarak config dosyamızdan gelen endpoint url adreslerimizi derlemek gibi. Derleme işlemini tek bir metotla yaparsak her yerde aynı şekilde çalışır. Ve bize geliştirme açısından kolaylık sağlar.
-- getRequestSignature : Bu fonksiyonumuz isteğin yapıldığı zamanı(timestamp) mikrosaniye cinsinden olacak şekilde sha256 algoritmasıyla HMAC yöntemini kullanarak şifreyecek. Bunun için PHP‘nin hazır fonksiyonunu kullanıyoruz. Buradan dönen şifrelenmiş veri Binance Api‘ye istek atarken işimize yarayacak.
-- getBinanceUrl: Bu fonksiyonumuz yine parent class yani üst sınıfından aldığı config verisine göre bizim için url hazırlayacak. Burada dikkatinizi çekmesi gereken nokta config dosyamızda kullandığımız süslü parantez içeren urllerimiz. Bu süslü parantezler metodumuz tarafından otomatik olarak değiştirilecek. Çünkü URL lerimiz dinamik yani isteğin atıldığı zamana ve parametrelere bağlı olarak değişebiliyor.
-- getBinanceMethod: Burada kodladığımız metot, verdiğimiz parametreye göre config dosyasına bakacak ve http isteğinin atılacağı yöntemi, GET ya da POST verecek. Dönen bu değer ile Symfony‘deki http-client kullanarak Apimize istek atacağız.
-- prepareRequestFor: Bu en önemli metodumuz ise bizim için bir Api Request‘i hazırlıyor yani bir http isteği gönderiyor ve dönen veriyi bize gösterecek. Binance Api‘nin resmi dokümantasyonunda görebileceğiniz gibi isteğimizin header‘larında X-MBX-APIKEY adından bir parametre daha göndermemiz gerekiyor. Bu da doğrulama, diğer adıyla user auth için. Fonksiyonumuz oluşturulan bu parametreye config dosyasında kaydettiğimiz api keyimizi değer olarak veriyor ve bizim için bir http isteği oluşturuyor.
Adım 6.) Api‘ye İstek Göndermek
Her şey hazır olduğuna göre artık Binance Api‘ye istek gönderebiliriz. Dönen veriyle ne yapacağınız size kalmış. Alım satım emri verebilirsiniz, alarm kurabilirsiniz, grafik verilerini sitenize ekleyebilirsiniz. Binance ile yapabildiğiniz hemen her şeyi api ile yapabilirsiniz. Bot mu yazarsınız ne yaparsınız orasını bilemem
)
Fazla uzatmadan hemen örnekleyelim. Örnekleri yazmak için HomeController adında bir sınıf daha oluşturuyorum ve annotation ekliyorum. Route yazmak yerine annotation kullanacağım. Bunun için proje dizininde yine komut satırına
php bin/console make:controller HomeController
yazıyorum ve enter lıyorum. Oluşturduğumuz sınıfa geliyoruz ve apimizi denemek için yeni bir istek atıyoruz. Örnekler ve dönen değerler karşınızda.
-- Örnekleri Yazdığımız HomeController Sınıfı [İlk iki örneği comment ledim. Onları da kendiniz deneyebilirsiniz.]
-- Sonuçlar
Adım 7.) Daha da Anlat!
* Cron Job oluşturup dakika başı piyasa takibi yapabilirsiniz. (Api limitleri dahilinde.)
* Api‘den aldığınız verileri işleyerek kendi trend eğrilerinizi yazılıma otomatik olarak buldurabilirsiniz.
* Kendi yorum tarzınızı tamamen yazılıma entegre edebilir ve karmaşık verileri otomatik olarak analiz edecek sistemi kurabilirsiniz.
* Kendi alarm sisteminizi kurabilir hatta bunu SMS ya da whatsapp hattına geçirebilirsiniz.
Özetle;
Kriptopara piyasasında eğer Binance kullanıyorsanız ve yazılımla uğraşıyorsanız Api ile yapamayacağınız işlem yok. Örneğin piyasadaki güncel kriptopara kurlarını alabilir ve artık azalışlara göre otomatik emirler verebilir alım satım yapabilirsiniz. Ya da alt koinleri takip etmek sizi zorluyorsa yine bunlar için otomatize bir sistem kurabilirsiniz. Gerisi tamamen hayal gücünüze kalmış. Ben sadece yüzeysel bilgi verdim gerisi sizde.
Dostça kalın...
Ana sayfada "Dünyanın Lider Kripto Borsası" olarak slogan yazmışlar. Binance kriptopara alıp satabileceğiniz(trading), borsaları, coinleri takip edebileceğiniz, vadeli işlemler(binance futures) yapabileceğiniz bir sistemdir. Mobil arayüzü çok kolay bir arayüze sahiptir. İlk kez coin piyasasına girenler için ise mobilde binance lite geliştirmişler. Daha birsürü güzel özelliği olan Binance‘ın Api‘sini inceleyeceğiz.
Api Ne Olaki?
Api, özetle farklı dillerde kodlanmış farklı yazılımların birbiriyle ortaklaşa çalışmalarını, veri alıp gönderebilen bir şeydir. Diğer bir tanımı ise yazılımdan kullanıcı arayüzünü (UI,UX) çıkarırsanız api kalır. Örneğin Binance, X diliyle kodlanmış olsun ben Y diliyle Binance‘dan koin piyasası hakkında bilgi almak istiyorsam api kullanarak JSON formatında veri alabilir ve gönderebilirim. Apiler genelde JSON formatında veri gönderir ya da alır.
Nasıl Olacak?
Bu örnekte PHP ve Symfony framework kullanarak Binance Api‘ye bağlanacağız. Bunu sağlamak için test ortamı olan Binance Testnet‘i kullanacağız ki testler sırasında gerçek koinlerimize bişey olmasın. Binance Api testnet aynı gerçek Binance gibi çalışır ve kurulum aşamasında size rastgele koinler verir. Siz de bu paralarda tıpkı gerçek piyasada işlem yapar gibi api kullanarak çeşitli işlemler yaparsınız.
Hadi Başlayalım!
Öncelikle Binance Api çok karmaşık bir yapıda olduğu için basite indirgemek için adım adım gideceğiz. PHP altyapımızı kuracağız, sonra binance apimizin entegrasyonunu yapacağız ve tokenlerimizi kullanacağız. En son ise Binance‘dan veri alıp veri göndereceğiz, güncel piyasa verilerini çekip al sat yapacağız.
Adım 1.) Yeni bir Symfony Projesi Oluşturalım
Komut satırına geliyoruz ve cd komutuyla projeyi oluşturmak istediğimiz dizine geliyoruz.
Ardından symfony new cw_koin --full yazıyoruz enter tuşuna tıklıyoruz. Burada komut satırına bizim için cw_koin adında bir proje açmasını ve --full koduyla ise tüm varsayılan geliştirme paketlerini(dependencies) yüklemesini sağlıyoruz. Bu komutu kullanmadığınızda annotation, doctrine gibi paketleri tek tek kurmakla uğraşırdık. İşlem bittiğinde diğer adıma geçeceğiz.
İşlem tamamlandığında şu klasörler oluşturulmuş olacak. [.htaccess hariç, onun için apache-pack yüklemeniz de gerekli]
Adım 2.) Config(ayar) Dosyası Oluşturmak
Symfony sizin için bir proje oluşturduğunda src, bin, var, vendor vb. birsürü klasör oluşturur. Biz config klasörüne gelip config.yaml adında bir dosya oluşturacağız. Bu dosya yazılımımızla ilgili çeşitli ayarları tutacak dosyamız olacak. Binance Api‘den aldığımız tokenleri, istek yapacağımız urlleri komple bu dosyada tutacağız. [Ek Bilgi: YAML kolayca yapılandırma dosyası oluşturacağınız ve aynı zamanda symfony framework tarafından tanınan bir veri stilidir. Okumak yazmak kolaydır. Windowstaki ini dosyaları gibi düşünebilirsiniz.]
Dosyanın içindeki adlar vs. tamamen keyfinize kalmış. Ben oluşturduğum config dosyasında binance api keylerimi ve api istekleri için kullanacağım çeşitli url formatlarını attım. Böylece PHP nin her yerinde bu url leri yazmak yerine merkezi bir config dosyasından yazacağım ki işim kolay olsun.
Adım 3.) Binance Api‘ye Bağlanmak
Öncelikle Binance Api‘de istek atabilmek için belli başlı şartlar var. User Auth yani kullanıcı parametresi diğer adıyla kullanıcı girişi isteyen istekler için token lara ihtiyacım olacak. (Bu token‘ları alabilmek için Binance üyeliğiniz olması gereklidir.)
Test sürüşü için öncelikle Binance Testnet adresine gidiyor ve Github kullanıcımızla oturum açıyoruz. Giriş yaptıktan sonra karşınıza Generate HMAC_SHA256 Key butonu çıkacak. Bu buton bizim için sha256 ile şifrelenmiş bir key ve secret kodu oluşturacak. Bu kodları olduğu gibi kopyalayıp az önce oluşturduğumuz config dosyasına yapıştırıyoruz. Api isteklerini atarken bu kodları header içinde göndereceğizki Binance kim olduğumuzu tanısın ve bize yetki versin.
Api için olmazsa olmaz keylerimizi de aldığımıza göre artık yavaştan yazılım kısmına odaklanabiliriz.
Adım 4.) Endpoint URL Bulmak ve Derlemek
Endpoint URL dediğimiz şey bizim http istekleri göndereceğimiz url adreslerini ifade eder. Ben config dosyamda bu bu adreslerden sadece birkaç tanesini ekleyerek uygulama geliştireceğim. Siz keyfinize göre hangi işlemi yapmak istiyorsanız binance api github adresine giderek buradan resmi api kullanımlarına bakabilirsiniz. Aradığınız tüm cevaplar aslında bu dokümanda var.
Örneğin biz Binance hesabınızda ne kadar bakiye ve hangi cinsten bakiyeler olduğunu sorgulamak istiyorsanız /api/v3/account endpoint kullanacaksınız. Buraya yukarıda aldığınız token‘larla istek atarsanız Binance Api size güncel bakiyenizi JSON formatında sunacaktır. Bu JSON yanıtını hangi dille kullanmak isterseniz hiç fark etmez o dille kullanırsınız.
Adım 5.) Sınıf(Class) Yapısını Oluşturalım
Uygulamamız şimdilik iki adet sınıftan oluşacak. Bu iki adet sınıfı oluşturmak için, proje dizinimize gelip ayrı ayrı;
php bin/console make:controller BaseController
php bin/console make:controller BinanceController
BaseController Sınıfı: Bu sınıf tüm sınıflarımızın en üstünde(parent) sınıfımız olacak. Biz bu sınıfta config dosyamızı yükleyeceğizki alt sınıfların tamamında burada yazdığımız public fonksiyonlarımızı kullanabilelim. Örneğin buradaki appConfig metodumuz ile az önce oluşturduğumuz config dosyasındaki verileri çekeceğiz ve bunu bir alt sınıf olan BinanceController sınıfında kullanacağız.
-- appConfig: Config dosyamızdaki ayarları döndüren fonksiyonumuz.
-- failSafe: Hata çıktığında yazılımdan çıkış yapan fonksiyonumuz. (burada loglama vs. bir şeyler yapılabilir, vakit kısıtlı olduğu için yazdım geçtim.)
BinanceController Sınıfı: BaseController sınıfımızın alt sınıfı olan bu sınıfta ise Binance Api ile ilgili yapmak istediğimiz işlemleri sağlayan metodlarımız(fonksiyonlarımız) olacak. Örneğin Binance‘a bir api isteği göndermek ve almak gibi. Ya da dinamik olarak config dosyamızdan gelen endpoint url adreslerimizi derlemek gibi. Derleme işlemini tek bir metotla yaparsak her yerde aynı şekilde çalışır. Ve bize geliştirme açısından kolaylık sağlar.
-- getRequestSignature : Bu fonksiyonumuz isteğin yapıldığı zamanı(timestamp) mikrosaniye cinsinden olacak şekilde sha256 algoritmasıyla HMAC yöntemini kullanarak şifreyecek. Bunun için PHP‘nin hazır fonksiyonunu kullanıyoruz. Buradan dönen şifrelenmiş veri Binance Api‘ye istek atarken işimize yarayacak.
-- getBinanceUrl: Bu fonksiyonumuz yine parent class yani üst sınıfından aldığı config verisine göre bizim için url hazırlayacak. Burada dikkatinizi çekmesi gereken nokta config dosyamızda kullandığımız süslü parantez içeren urllerimiz. Bu süslü parantezler metodumuz tarafından otomatik olarak değiştirilecek. Çünkü URL lerimiz dinamik yani isteğin atıldığı zamana ve parametrelere bağlı olarak değişebiliyor.
-- getBinanceMethod: Burada kodladığımız metot, verdiğimiz parametreye göre config dosyasına bakacak ve http isteğinin atılacağı yöntemi, GET ya da POST verecek. Dönen bu değer ile Symfony‘deki http-client kullanarak Apimize istek atacağız.
-- prepareRequestFor: Bu en önemli metodumuz ise bizim için bir Api Request‘i hazırlıyor yani bir http isteği gönderiyor ve dönen veriyi bize gösterecek. Binance Api‘nin resmi dokümantasyonunda görebileceğiniz gibi isteğimizin header‘larında X-MBX-APIKEY adından bir parametre daha göndermemiz gerekiyor. Bu da doğrulama, diğer adıyla user auth için. Fonksiyonumuz oluşturulan bu parametreye config dosyasında kaydettiğimiz api keyimizi değer olarak veriyor ve bizim için bir http isteği oluşturuyor.
Adım 6.) Api‘ye İstek Göndermek
Her şey hazır olduğuna göre artık Binance Api‘ye istek gönderebiliriz. Dönen veriyle ne yapacağınız size kalmış. Alım satım emri verebilirsiniz, alarm kurabilirsiniz, grafik verilerini sitenize ekleyebilirsiniz. Binance ile yapabildiğiniz hemen her şeyi api ile yapabilirsiniz. Bot mu yazarsınız ne yaparsınız orasını bilemem
Fazla uzatmadan hemen örnekleyelim. Örnekleri yazmak için HomeController adında bir sınıf daha oluşturuyorum ve annotation ekliyorum. Route yazmak yerine annotation kullanacağım. Bunun için proje dizininde yine komut satırına
php bin/console make:controller HomeController
yazıyorum ve enter lıyorum. Oluşturduğumuz sınıfa geliyoruz ve apimizi denemek için yeni bir istek atıyoruz. Örnekler ve dönen değerler karşınızda.
-- Örnekleri Yazdığımız HomeController Sınıfı [İlk iki örneği comment ledim. Onları da kendiniz deneyebilirsiniz.]
-- Sonuçlar
Adım 7.) Daha da Anlat!
* Cron Job oluşturup dakika başı piyasa takibi yapabilirsiniz. (Api limitleri dahilinde.)
* Api‘den aldığınız verileri işleyerek kendi trend eğrilerinizi yazılıma otomatik olarak buldurabilirsiniz.
* Kendi yorum tarzınızı tamamen yazılıma entegre edebilir ve karmaşık verileri otomatik olarak analiz edecek sistemi kurabilirsiniz.
* Kendi alarm sisteminizi kurabilir hatta bunu SMS ya da whatsapp hattına geçirebilirsiniz.
Özetle;
Kriptopara piyasasında eğer Binance kullanıyorsanız ve yazılımla uğraşıyorsanız Api ile yapamayacağınız işlem yok. Örneğin piyasadaki güncel kriptopara kurlarını alabilir ve artık azalışlara göre otomatik emirler verebilir alım satım yapabilirsiniz. Ya da alt koinleri takip etmek sizi zorluyorsa yine bunlar için otomatize bir sistem kurabilirsiniz. Gerisi tamamen hayal gücünüze kalmış. Ben sadece yüzeysel bilgi verdim gerisi sizde.
Dostça kalın...