21 Nisan 2021 Çarşamba

PHP ile Binance Telegram Botu Yapımı


Binance'ta takip ettiğim kripto paraların güncel değerlerini Telegram'dan bana belirli aralıklarla gönderecek pratik bir bot yazmak istedim. Bunu da düzenli olarak çağrılacak bir PHP koduyla yapmak oldukça basit.


Telegram'da kendinize özgü bir bot yaratmanın en kolay yolu, BotFather isimli botu kullanmak. Bunun için BotFather'a /start komutunu gönderdikten sonra /newbot komutunu kullanarak ilk adımı atabilirsiniz.


Kullanıcı adı tanımlanmış yeni botunuza bir de isim vermenizi isteyecektir BotFather. İsim girişi yaptıktan sonra aldığınız "Done!..." mesajıyla birlikte BotFather yeni botunuza özel <token> stringini sizinle paylaşacaktır. Daha sonra botlarınız üzerinde bir konfigürasyon değişikliği yapmak ya da botunuza bazı otomatize komutlar tanımlamak isterseniz /mybots komutunu BotFather'a dilediğiniz zaman gönderebilirsiniz.


Bundan sonraki aşamada bir telegram grubu oluşturup botunuzu yeni oluşturduğunuz gruba eklemeniz gerekiyor. Yeni gruba aldığınız bota herhangi bir dummy komut göndermeyi deneyin.(Ör: /start)

Hemen ardından Telegram API'si yardımıyla gruebun chat id'sini almamız gerekiyor. https://api.telegram.org/botXXX:YYYY/getUpdates adresine XXX:YYY yerine daha önce öğrendiğimiz <token>  stringini yapıştırarak sorguyu API'ye gönderelim.

"chat":{"id":-zzzzzzzzzz

"-zzzzzzzzzz" değeri aradığımız chat id'si olacaktır. Sıra geldi PHP ile Binance'tan veri çekmeye. Yapmak istediğim bot basitçe fiyat datasını çekip göndereceği için herhangi bir API ya da dolaylı başka fonksiyonlarla almak yerine doğrudan kur sayfasından çekmek istedim. Bu yüzden bu gibi adresleri satır satır listelediğim bir "list.txt" dosyasının yanısıra, <token> ve <chatid> parametrelerinin bulunduğu config.txt olarak iki dosya yaratarak scripti parametrize ettim. Öncelikle bu dosyaları değişkenlerime tanımlıyorum ve list.txt'in satır sayısını saydırıyorum.

<?php
$list = "list.txt";
$config = "config.txt";
$lines = file($list);
$no_of_lines = count(file($list));

Bundan sonraki adımda list.txt'den okuduğumuz satırları parse ederek pariteleri bir diziye atama işlemini bir döngüde gerçekleştiriyoruz.

for ($l=0;$l<$no_of_lines;$l++)
{
$site[$l] = $lines[$l] ;
$site[$l] = preg_replace('/\s+/', '', $site[$l]);
$txt[$l] = substr($site[$l], strrpos($site[$l], '/') + 1);
}

Bir sonraki döngüde ise, her bir parite için hedef sayfayı çağırıp, sayfadaki güncel fiyat bilgisini sayfaya gömülü JSON formatındaki datadan çekiyoruz. Bunun için close:"...."  datası uygun. Her datayı bir başka döngüyle beraber satır satır alırken aynı zamanda gönderilecek mesajı $txt değişkeni içinde oluşturuyor, <token> ve <chatid> parametrelerini config dosyasından satır satır çekiyor ve sendMessage() fonksiyonunu çağırıyoruz. Döngü bittikten sonra da bir kapanış satırı gönderebiliriz.

for ($i=0;$i<$no_of_lines;$i++)
{
$content[$i] = file_get_contents((($site[$i])));
$price[$i] = search('close":"', '"', $content[$i]);
$txt[$i] = $txt[$i] . ": ".$price[$i][0];
$params = file($config);
$token = $params[0];
$token = preg_replace('/\s+/', '', $token);
$chatid = $params[1];
$chatid = preg_replace('/\s+/', '', $chatid);

sendMessage($chatid, $txt[$i], $token);
}
sendMessage($chatid, "------------------------", $token);

Az önceki döngümüzde çağırdığımız sendMessage fonksiyonumuzda ise Telegram API tarafından tanımlanan sendMessage fonksiyonuna uygun bir URL yaratmamız gerekiyor. Bu URL curl yordamıyla çağırılacak.

function sendMessage($uid, $txt, $tok) 
{
$url = 'https://api.telegram.org/bot' . $tok . '/sendMessage?chat_id=' . $uid . '&text=' . $txt;
echo "$url";

$api_url = $url;
$ch = curl_init( );
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_TIMEOUT, 5 );
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 5 );                                 
$response_string = curl_exec( $ch );

echo $response_string;
}

Son olarak da güncel fiyat bilgisini sayfadan çekerken kullandığımız arama fonksiyonunu kodumuza ekleyerek, botumuzu çalışmaya hazır hale getirebiliriz. Kodun güncel halini Github profilimden de inceleyebilirsiniz.

function search($bas, $son, $yazi){ 
    preg_match_all('/' . preg_quote($bas, '/') .'(.*?)'. preg_quote($son, '/').'/si', $yazi, $m); 
    return $m[1]; 
    }  

?>



1 yorum: