8 Mayıs 2008Tcmb Döviz Kurları
Geçenlerde bir web sitesi için döviz kurlarını çekmem gerekti. Sağdan soldan aranmak yerine oturup kendim bir php sınıf yazdım. Yazdığım php sınıfı çok basit bir şekilde çalışmaktadır. Kendi cache özelliği mevcut yani doviz bilgilerini bu betik sizin belirttiğiniz dakika içinde yeniden çeker. Böylece oluşabilecek ( tcmb sitesine erişememe gibi ) sorunları da ortadan kaldırmış bulunmaktayım.
Ufak bir hatırlatma yapmam gerekiyor. Kendi makinemdeki denemelerimde doviz.xml adlı cache dosyamızı betik kendisi oluşturmakta. Ama bu değil ki her sunucu da kendisi oluşturacaktır. Eğer oluşturamazsanız kendiniz el ile doviz.xml dosyasını oluşturup betik ile aynı dizine atın ve Chmod ( Yazma İzinleri ) ayarlarını 777 olarak ayarlayınız…
Dosyamız aşağıdadır…
< ?php /* TCMB Döviz Kurları. Author: Yusuf KOÇ ( Raiden ) < yusufkoc [at] ayva.net > Bu Betik TCMB Sitesi Baz Alınarak Kodlanmıştır. Kullanım: < ?php $doviz = new TCMB(); $doviz->cacheTime = 5; $doviz->tcmbStart(); $doviz->getALIS('usd'); echo '<br />'; $doviz->getSATIS('usd'); ?> Diğer Döviz Kur Bilgileri İse Aşağıdadır. * USD 1 ABD DOLARI * AUD 1 AVUSTRALYA DOLARI * DKK 1 DANİMARKA KRONU * EUR 1 EURO * GBP 1 İNGİLİZ STERLİNİ * CHF 1 İSVİÇRE FRANGI * SEK 1 İSVEÇ KRONU * CAD 1 KANADA DOLARI * KWD 1 KUVEYT DİNARI * NOK 1 NORVEÇ KRONU * SAR 1 SUUD� ARABİSTAN RİYALİ * JPY 100 JAPON YENİ Yukarıdaki Bilgiler Doğrultusunda EURO yu Çekmek İstersek Aşağıdaki Şekilde Yazmamız Gerekir. $doviz->getALIS('eur'); */ class TCMB { # Class İçin Gerekli Değişkenlerimizi Oluşturduk # --------------------------------------------------- private $adres = 'http://www.tcmb.gov.tr/kurlar/today.html'; private $sonuc = array(); private $cacheDosya = 'doviz.xml'; public $cacheTime; private $cacheCalc; private $ac; private $say; private $dizin = '/home/yusuf/www/'; # Kur Bilgilerini Çekip Cache Dosyasımıza XML Formatında Yazdıracağız. # ------------------------------------------------------------------------ private function getKUR() { return file_get_contents($this->adres); } # Çekilen Bilgiler İçinde Sadece Bizim Regex Pattern imize Uyan Bölümleri Parseledik # Yani bu Pattern'e göre 1,123456789 gibi olan bilgiler gelcek. Daha Sonra Bunları da # Yeniden Düzenleyeceğiz. # --------------------------------------------------------------------------------------- private function parseKUR() { preg_match_all("#[0-9]\\.[0-9]{1,9}#is",$this->getKUR(),$this->sonuc); return $this->sonuc; } # Parselediğimiz Bilgilerden Sadece Almak İstediğimiz Kısımları Alıp Cache Dosyamıza # Yazdıracağız. Böylece TCMB nin sitesine Ulaşılamadığı Durumlarda cache Dosyamızdan # Okuyacaktır. # --------------------------------------------------------------------------------------- private function cacheDOSYA() { $this->sonuc = $this->parseKUR(); $this->cacheCalc = (time() + ($this->cacheTime*60)); // cache zamanımızı ayarladık. $this->ac = fopen($this->dizin."/".$this->cacheDosya,"w"); if ($this->ac !== false) { fwrite($this->ac,"< ?xml version='1.0' encoding='ISO-8859-9'?>\r\n<tcmb>\r\n<time>".$this->cacheCalc."</time>\r\n"); $this->say = count($this->sonuc[0]); for ($i=$j=0; $i< $this->say; $i += 4) { $j++; switch ($j) { case "1": fwrite($this->ac,"<usd>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</usd>\r\n"); break; case "2": fwrite($this->ac,"<aud>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</aud>\r\n"); break; case "3": fwrite($this->ac,"<dkk>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</dkk>\r\n"); break; case "4": fwrite($this->ac,"<eur>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</eur>\r\n"); break; case "5": fwrite($this->ac,"<gbp>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</gbp>\r\n"); break; case "6": fwrite($this->ac,"<chf>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</chf>\r\n"); break; case "7": fwrite($this->ac,"<sek>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</sek>\r\n"); break; case "8": fwrite($this->ac,"<cad>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</cad>\r\n"); break; case "9": fwrite($this->ac,"<kwd>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</kwd>\r\n"); break; case "10": fwrite($this->ac,"<nok>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</nok>\r\n");break; case "11": fwrite($this->ac,"<sar>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</sar>\r\n"); break; case "12": fwrite($this->ac,"<jpy>\r\n\t<alis>".$this->sonuc[0][$i]."</alis>\r\n\t<satis>".$this->sonuc[0][($i+1)]."</satis>\r\n</jpy>\r\n"); break; } if ($j == 12 ) break; // Döngüyü Durdurduk Çünkü Bize Gerekli Olan Bilgiler 12. de Son Buluyor. } fwrite($this->ac,"</tcmb>"); fclose($this->ac); } else { exit('Cache Dosyasına Yazılamıyor. Yazma Yetkisinin Olup Olmadığını Kontrol Ediniz.'); } } # Oluşturduğumuz XML Dosyasındaki Beyaz Karakterleri Silmek İçin Gerekli Fonksiyon # ----------------------------------------------------------------------------------- private function beyazCharsil() { return @preg_replace("/\s/","",file_get_contents($this->cacheDosya)); } # XML Dosyasına Yazdırdığımız Bilgilerden Döviz Cinslerinin ALIŞ Fiyatını Çekeceğiz. # -------------------------------------------------------------------------------------- public function getALIS($tip) { preg_match("#< ".$tip."><alis>(.*?)< \\/alis>.+< \\/".$tip.">#i",$this->beyazCharsil(),$this->sonuc); echo $this->sonuc[1]; } # XML Dosyasına Yazdırdığımız Bilgilerden Döviz Cinslerinin SATIŞ Fiyatını Çekeceğiz. # -------------------------------------------------------------------------------------- public function getSATIS($tip) { preg_match("#< ".$tip.">.+<satis>(.*?)< \\/satis>< \\/".$tip.">#i",$this->beyazCharsil(),$this->sonuc); echo $this->sonuc[1]; } # Artık Tüm Sınıfımızı Tetikleyecek Start Fonksiyonumuzu Yazıyoruz # --------------------------------------------------------------------- public function tcmbStart() { preg_match("#<time>(.*?)< \\/time>#i",$this->beyazCharsil(),$this->sonuc); // Cache Dosyamızdan Cache Zamanını Aldık. if ($this->sonuc[1] < time()) { $this->cacheDOSYA(); } else { echo 'Döviz Bilgileri Cache\'den Okunuyor...<br />'; } } } ?> </time></satis></alis>
Kullanmak için örnek bir a.php içeriği aşağıdadır.
< ?php include ('doviz.php'); $tcmb = new TCMB; $tcmb->cacheTime=5; // Kaç dakikada bir yeni bilgileri çeksin $tcmb->tcmbStart(); // Kur bilgileri Çekilip doviz.xml e yazdırıldır. ?> < !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"> <title></title> </meta></head> <body> <table style="text-align: left; width: 302px; height: 85px;" border="1" cellpadding="2" cellspacing="2"> <tbody> <tr> <td></td> <td>ALIŞ</td> <td>SATIŞ</td> </tr> <tr> <td>USD</td> <td>< ?php $tcmb->getALIS('usd'); ?></td> <td>< ?php $tcmb->getSATIS('usd'); ?></td> </tr> <tr> <td>EURO</td> <td>< ?php $tcmb->getALIS('eur'); ?></td> <td>< ?php $tcmb->getSATIS('eur'); ?></td> </tr> </tbody> </table> <br /> </body> </html>
Gibi Kullanabilirsiniz…
Örneği buradan indirebilirsiniz

Teşekürler…
Eline sağlık , güzel bir class olmuş
Fakat Xml dosyasınında okumasında bir sorun war sanırım indirdiğim örnekde , doviz.xml ‘le dosya yazılabiliyor fakat okumuyor.
@Arıkan Aydın
Örneği şimdi indirdim ve test ettim çalışıyor acaba doviz.xml in okuma izni var mı ? Çünkü aklıma başka bir cevap gelmiyor şuan. Ayrıca bir hata alıyor iseniz hata mesajınıda buraya yazarsanız yardımcı olmaya çalışırım
çalışdı dostum saolasın cache dosyasını kendim tekrar oluşturunca çalışdı,
Birde Bursa da imişsin
Bu arada pythondaki betiğin ge çok güzel olmuş eline sağlık,
Benimde ne zamandır aklımda Pythonla masaüstü programlamaya giriş yapmak sanırım senin program benide bu yöne itecek eline sağlık.
Çok başını ağırtırım o zmn
Tekrar elinize sağlık.
@Arıkan Aydın
sevindim çalışmasına. Evet Bursa da ikamet etmekteyim.
Yusuf gerçekten güzel bir iş çıkartmışsın ama ben de bütün izinleri vermeme rağmen her defasında tcmb sitesinden veri çekiyor yani cache’e yazıyor okumuyor çok garip geldi
doviz.xml i silip yeniden kendin boş bir xml oluşturup dene sercan olmassa bakarız yine.