Php ile hava durumu makelesi

Abdullah Şahin

Altın Üye
Altın Üye
Kayıt
3 Nisan 2008
Mesaj
2.630
Tepki
89
Emre Çevik adlı bir arkadaşın bu konu hakkında hazırladığı makeleyi aynen sizlerle paylaşıyorum. Umarım işinize yarar.

///////////////////////**************/////////////////////////////////


Bu dökümanda sizere, online hava durumunu diğer sitelerden (wunderground.com, weather.com vb.) nasıl alınacağını anlatacağım. İsterseniz aynı yöntemi kullanarak döviz,sayısal loto ve benzeri verileride alabilirsiniz. Biz verileri çekmek için wap.meteor.gov.tr yi kullanacağız. Uygulamamızı yapmaya başlayabiliriz. Aşağıdaki kodları havadurumu.php diye kayıt edelim.


<?php

function hava($sehir) {
$cikti=@file_get_contents("http://wap.meteor.gov.tr/simdi/".strtolower($sehir).".wml");


if ($cikti) {

$ayir=explode("<p align=\"center\">",$cikti);

// gün için sıkcaklığı alalım
$sic=explode("C",$ayir[4]);
$sic=$sic[0];

// gün için nemi alalım
$nem=explode("</p>:",$ayir[6]);
$nem=$nem[0];

// gün için rüzgarı alalım
$ruzgar=explode("</p>",$ayir[7]);
$ruzgar=$ruzgar[0];

// gün için basıncı alalım
$basinc=explode("</p>",$ayir[8]);
$basinc=$basinc[0];

}

$cikti="<table>
<tr><td colspan=
\"4\" align=\"center\">$sehir</td></tr>
<tr>
<td align=
\"center\">Şimdi</td>
<td align=
\"center\">Sıcaklık: ".$sic." </td>
<td align=
\"center\">".$basinc." </td>
<td align=
\"center\">Rüzgar: ".$ruzgar."</td>
</tr>
</table> ";
return $cikti;
}

echo hava("Ankara");

?>


Şimdi yukarıda kullandığımız kodların ne anlama geldiklerini inceleyelim.

function hava($sehir) { // function komutunu kullanarak hava diye bir fonksiyon oluşturduk. ( { ve } içindeki kodlar bu fonksiyona dahil edilir.)

$cikti=@file_get_contents("http://wap.meteor.gov.tr/simdi/".strtolower($sehir).".wml"); // $cikti diye bir değişken atadık. file_get_contents fonksiyonunu kullanarak http://wap.meteor.gov.tr sayfasının içeriğini $cikti değişkenine atıyoruz. strtolower fonksiyonu ise tüm büyük harfleri küçültmeye yarar.

if ($cikti) { // if() fonksiyonu koşul belirtmek için kullanılır. Eğer koşul sağlanıyorsa ($cikti değişkeni var ise) { ve } içindeki işlemler yapılır aksi taktirde es geçilir.

$ayir=explode("<p align=\"center\">",$cikti); // explode fonksiyonu ayıraç olarak kullanılır. Bu satırda $cikti değişkeninin içeriğini <p align="center"> verisine göre ayırma işlemi yapıyoruz.

$sic=explode("C",$ayir[4]); // burada $ayir[4] ün içeriğini C ile yeniden parçalara ayırıyoruz.

$sic=$sic[0]; // bu satırda ayırdığımız bölümün ilk kısmını $sic değişkenine atıyoruz.

explode fonksiyonunun daha iyi anlaşılması için aşağıdaki örneği inceleyebiliriz.

Örnek:


$cikti="<table><tr><td>Emre</td><td>Çevik</td></tr></table>";
$ayir=explode("<td>",$cikti);
$ayir[0] değişkeni ekrana <table><tr> basar.
$ayir[1] değişkeni ekrana Emre</td> basar.
$ayir[2] değişkeni ekrana Çevik</td></tr></table> basar


$nem, $basinc, $ruzgar için aynı explode fonksiyonu kullanıldığı için bu bölümleri açıklamadan geçiyorum.


$cikti="<table>
<tr><td colspan=
\"4\" align=\"center\">$sehir</td></tr>
<tr>
<td align=
\"center\">Şimdi</td>
<td align=
\"center\">Sıcaklık: ".$sic." </td>
<td align=
\"center\">".$basinc." </td>
<td align=
\"center\">Rüzgar: ".$ruzgar."</td>
</tr>
</table>";


Yukarıdaki bölümde fonksiyonumuzu bitirmeden önce $cikti değişkenine $nem,$basinc, $ruzgar değişkenlerinin içeriklerini basıyoruz.

echo hava("Ankara"); //bu satırda hava("Ankara"); ile hava fonksiyonunu çağırıyoruz ve echo komutu ile sayfaya basıyoruz.

Genel olarak hava durumunun nasıl alınacağını öğrenmiş olduk 2. sayfada bu kodumuzu biraz daha geliştirelim.

Bundan önceki uygulamamızda anlık hava durumu verilerini çekmiştik. Şimdi ona ek olarak 3 günlük tahmin verilerinide çekelim. Aşağıdaki kodları tahmin.php diye kayıt edelim.


<?php

function hava($sehir) {
$cikti=@file_get_contents("http://wap.meteor.gov.tr/simdi/".strtolower($sehir).".wml");
$cikti = str_replace("<b>", "", $cikti); // <b> leri yok edelim
$cikti = str_replace("</b>", "", $cikti); // </b> leri yok edelim
//$cikti = str_replace("Basinc", "Basınç", $cikti);
if ($cikti) {

$ayir=explode("<p align=\"center
\">",$cikti);

// gün için sıkcaklığı alalım
$sic=explode("C",$ayir[4]);
$sic=$sic[0];

// gün için nemi alalım
$nem=explode("</p>:",$ayir[6]);
$nem=$nem[0];

// gün için rüzgarı alalım
$ruzgar=explode("</p>",$ayir[7]);
$ruzgar=$ruzgar[0];

// gün için basıncı alalım
$basinc=explode("</p>",$ayir[8]);
$basinc=$basinc[0];

// tarih bilgisini alalım
for($i=0; $i < 4; $i++){

$tarih[$i]=explode("<p align=
\"center\">",$cikti);
$tarih[$i]=explode("</p>",$tarih[$i][$tar]);
$tarih[$i]=$tarih[$i][0];

switch($i) {

case "0":
$tar = 3;
break;

case "1":
$tar = 10;
break;

case "2":
$tar = 14;
break;

case "3":
$tar = 18;
break;

default:
$tar = 3;
}
}

// min sıcaklık
for($i=1; $i < 4; $i++){

$min[$i]=explode("Min:",$cikti);
$min[$i]=explode(" C",$min[$i][$i]);
$min[$i]=$min[$i][0];
}
// max sıcaklık
for($i=1; $i < 4; $i++){

$max[$i]=explode("Max:",$cikti);
$max[$i]=explode(" C",$max[$i][$i]);
$max[$i]=$max[$i][0];
}
// durum bilgisini alalım
for($i=0; $i < 4; $i++){

switch($i) {

case "0":
$a = 5;
break;

case "1":
$a = 11;
break;

case "2":
$a = 5;
break;

case "3":
$a = 19;
break;

default:
$a = 5;
}

$durum[$i]=explode("<p align=
\"center\">",$cikti);
$durum[$i]=explode("</p>",$durum[$i][$a]);
$durum[$i]=$durum[$i][0];
}
// durum bilgisini değiştirelim
for($i=0; $i < 4; $i++){
switch($durum[$i]) {
case "AzBulutlu":
$resim[$i]="azbulutlu.gif";
$durum[$i]="Az Bulutlu";
break;

case "ParcaliBulutlu":
$resim[$i]="parcalibulutlu.gif";
$durum[$i]="Parçalı Bulutlu";
break;

case "ÇokBulutlu":
$resim[$i]="cokbulutlu.gif";
$durum[$i]="Çok Bulutlu";
break;

case "CokBulutlu":
$resim[$i]="cokbulutlu.gif";
$durum[$i]="Çok Bulutlu";
break;

case "Gunes":
$resim[$i]="gunes.gif";
$durum[$i]="Güneşli";
break;

case "Gunesli":
$resim[$i]="gunes.gif";
$durum[$i]="Güneşli";
break;

case "Sis":
$resim[$i]="sisli.gif";
$durum[$i]="Sisli";
break;

case "Sisli":
$resim[$i]="sisli.gif";
$durum[$i]="Sisli";
break;

case "Pus":
$resim[$i]="puslu.gif";
$durum[$i]="Puslu";
break;

case "Puslu":
$resim[$i]="puslu.gif";
$durum[$i]="Puslu";
break;

case "Yagis":
$resim[$i]="yagmur.gif";
$durum[$i]="Yağmurlu";
break;

case "Yagisli":
$resim[$i]="yagmur.gif";
$durum[$i]="Yağmurlu";
break;

case "Yagmur":
$resim[$i]="yagmur.gif";
$durum[$i]="Yağışlı";
break;

case "Yagmurlu":
$resim[$i]="yagmur.gif";
$durum[$i]="Yağışlı";
break;

case "Kar":
$resim[$i]="kar.gif";
$durum[$i]="Karlı";
break;

case "Karli":
$resim[$i]="kar.gif";
$durum[$i]="Karlı";
break;

case "SaganakYagisli":
$resim[$i]="sagnakyagmur.gif";
$durum[$i]="Sağanak Yağışlı";
break;

case "KarlaKarisik Yagmur":
$resim[$i]="kar.gif";
$durum[$i]="Karla Karışık Yağmurlu";
break;

case "KarlaKarisik Yagmurlu":
$resim[$i]="kar.gif";
$durum[$i]="Karla Karışık Yağmurlu";
break;

case "Tipi":
$resim[$i]="tipi.gif";
$durum[$i]="Tipi";
break;

default:
$resim[$i]="bilinmiyor.gif";
}
}

$cikti="<table>
<tr><td colspan=
\"5\" align=\"center\">$sehir</td></tr>
<tr>
<td align=
\"center\">Şimdi</td>
<td align=
\"center\">Sıcaklık: ".$sic." </td>
<td align=
\"center\">".$basinc." </td>
<td align=
\"center\">".$durum[0]."</td>
<td align=
\"center\">Rüzgar: ".$ruzgar."</td>
</tr>
";


for($i=1; $i < 4; $i++){
$cikti.="<tr>
<td align=
\"center\">".$tarih[$i]."</td>
<td align=
\"center\">Min: ".$min[$i]." </td>
<td align=
\"center\">Max: ".$max[$i]." </td>
<td align=
\"center\">Durum: ".$durum[$i]."</td>
<td align=
\"center\"><img src=\"hava/".$resim[$i]."\"></td>
</tr>";
}



$cikti.="</table> ";
return $cikti;
}
}


echo hava("Ankara");

?>


Şimdi yukarıda kullandığımız yeni kodların ne anlama geldiklerini inceleyelim.

$cikti = str_replace("Basinc", "Basınç", $cikti); // str_replace ile $cikti nin icerisinde Basinc değerleri Basınç olarak değiştiriliyor.

for($i=0; $i < 4; $i++){ // for fonksiyonu ile değer döndürülür. Burada i değerini 0 dan başlatarak 1 er 1 er artırıyoruz.
switch($i) { // bu satırda $i değerini alıyor ve o değere göre işlem yapıyor.

case "0": // eğer $i 0 ise $tar 3 değerini alarak alıyor
$tar = 3;
break;

default: // $i değeri diğer sayılarla uyuşmuyorsa $tar 3 değerini alıyor.
$tar = 3;

switch($durum[$i]) { // bu satırda $durum[$i] değerini alıyor.
case "AzBulutlu": // eğer $durum[$i] değer AzBulutlu ise aşağıdakileri uyguluyor. değil ise es geçiyor.
$resim[$i]="azbulutlu.gif";
$durum[$i]="Az Bulutlu";
break;



for($i=1; $i < 4; $i++){
$cikti.="<tr>
<td align=
\"center\">".$tarih[$i]."</td>
<td align=
\"center\">Min: ".$min[$i]." </td>
<td align=
\"center\">Max: ".$max[$i]." </td>
<td align=
\"center\">Durum: ".$durum[$i]."</td>
<td align=
\"center\"><img src="hava/".$resim[$i].""></td>
</tr>";
}


Yukarıdaki kodda 1 den 3 e kadar for döngüsü dönüyor. yani bu döngü tamamlandığında $cikti nin içeriği aşağıdaki gibi oluşur.



<tr>
<td align="center">$tarih[1]</td>
<td align="center">Min: $min[1]</td>
<td align="center">Max: $max[1]</td>
<td align="center">Durum: $durum[1]</td>
<td align="center"><img src="hava/$resim[1]"></td>
</tr>
<tr>
<td align="center">$tarih[2]</td>
<td align="center">Min: $min[2]</td>
<td align="center">Max: $max[2]</td>
<td align="center">Durum: $durum[2]</td>
<td align="center"><img src="hava/$resim[2]"></td>
</tr>
<tr>
<td align="center">$tarih[3]</td>
<td align="center">Min: $min[3]</td>
<td align="center">Max: $max[3]</td>
<td align="center">Durum: $durum[3]</td>
<td align="center"><img src="hava/$resim[3]"></td>
</tr>

Burada;

$min[1] 1. gün için min sıcaklığı gösterir.
$max[2] 2. gün için max sıcaklığı gösterir.
$durum[3] 3. gün için hava durumunu gösterir.
$tarih[3] 3. gün için tarih gösterir.

echo hava("Ankara"); //bu satırda hava("Ankara"); ile hava fonksiyonunu çağırıyoruz ve echo komutu ile sayfaya basıyoruz.

Hava durumu uygulamamızı bitirmiş bulunuyoruz. Bu uygulama, sayfaya giren bütün kullanıcıların veri çekeceği için sunucumuzu yoracaktır ve sayfanın yavaş çalışmasını sağlayacaktır. Bu sorunun çözülmesi için 3. sayfadaki kesi uygulamasını kullanabilirsiniz.

Sayfa 3

<?php
function hava($sehir) {
$cikti=@file_get_contents("http://wap.meteor.gov.tr/simdi/".strtolower($sehir).".wml");
$cikti = str_replace("<b>", "", $cikti); // <b> leri yok edelim
$cikti = str_replace("</b>", "", $cikti); // </b> leri yok edelim
//$cikti = str_replace("Basinc", "Basınç", $cikti);

if ($cikti) {

$ayir=explode("<p align=
\"center\">",$cikti);

// gün için sıkcaklığı alalım
$sic=explode("C",$ayir[4]);
$sic=$sic[0];

// gün için nemi alalım
$nem=explode("</p>:",$ayir[6]);
$nem=$nem[0];

// gün için rüzgarı alalım
$ruzgar=explode("</p>",$ayir[7]);
$ruzgar=$ruzgar[0];

// gün için basıncı alalım
$basinc=explode("</p>",$ayir[8]);
$basinc=$basinc[0];

// tarih bilgisini alalım
for($i=0; $i < 4; $i++){

$tarih[$i]=explode("<p align=
\"center\">",$cikti);
$tarih[$i]=explode("</p>",$tarih[$i][$tar]);
$tarih[$i]=$tarih[$i][0];

switch($i) {

case "0":
$tar = 3;
break;

case "1":
$tar = 10;
break;

case "2":
$tar = 14;
break;

case "3":
$tar = 18;
break;

default:
$tar = 3;
}
}

// min sıcaklık
for($i=1; $i < 4; $i++){

$min[$i]=explode("Min:",$cikti);
$min[$i]=explode(" C",$min[$i][$i]);
$min[$i]=$min[$i][0];
}
// max sıcaklık
for($i=1; $i < 4; $i++){

$max[$i]=explode("Max:",$cikti);
$max[$i]=explode(" C",$max[$i][$i]);
$max[$i]=$max[$i][0];
}
// durum bilgisini alalım
for($i=0; $i < 4; $i++){

switch($i) {

case "0":
$a = 5;
break;

case "1":
$a = 11;
break;

case "2":
$a = 5;
break;

case "3":
$a = 19;
break;

default:
$a = 5;
}

$durum[$i]=explode("<p align=
\"center\">",$cikti);
$durum[$i]=explode("</p>",$durum[$i][$a]);
$durum[$i]=$durum[$i][0];
}
// durum bilgisini değiştirelim
for($i=0; $i < 4; $i++){
switch($durum[$i]) {
case "AzBulutlu":
$resim[$i]="azbulutlu.gif";
$durum[$i]="Az Bulutlu";
break;

case "ParcaliBulutlu":
$resim[$i]="parcalibulutlu.gif";
$durum[$i]="Parçalı Bulutlu";
break;

case "ÇokBulutlu":
$resim[$i]="cokbulutlu.gif";
$durum[$i]="Çok Bulutlu";
break;

case "CokBulutlu":
$resim[$i]="cokbulutlu.gif";
$durum[$i]="Çok Bulutlu";
break;

case "Gunes":
$resim[$i]="gunes.gif";
$durum[$i]="Güneşli";
break;

case "Gunesli":
$resim[$i]="gunes.gif";
$durum[$i]="Güneşli";
break;

case "Sis":
$resim[$i]="sisli.gif";
$durum[$i]="Sisli";
break;

case "Sisli":
$resim[$i]="sisli.gif";
$durum[$i]="Sisli";
break;

case "Pus":
$resim[$i]="puslu.gif";
$durum[$i]="Puslu";
break;

case "Puslu":
$resim[$i]="puslu.gif";
$durum[$i]="Puslu";
break;

case "Yagis":
$resim[$i]="yagmur.gif";
$durum[$i]="Yağmurlu";
break;

case "Yagisli":
$resim[$i]="yagmur.gif";
$durum[$i]="Yağmurlu";
break;

case "Yagmur":
$resim[$i]="yagmur.gif";
$durum[$i]="Yağışlı";
break;

case "Yagmurlu":
$resim[$i]="yagmur.gif";
$durum[$i]="Yağışlı";
break;

case "Kar":
$resim[$i]="kar.gif";
$durum[$i]="Karlı";
break;

case "Karli":
$resim[$i]="kar.gif";
$durum[$i]="Karlı";
break;

case "SaganakYagisli":
$resim[$i]="sagnakyagmur.gif";
$durum[$i]="Sağanak Yağışlı";
break;

case "KarlaKarisik Yagmur":
$resim[$i]="kar.gif";
$durum[$i]="Karla Karışık Yağmurlu";
break;

case "KarlaKarisik Yagmurlu":
$resim[$i]="kar.gif";
$durum[$i]="Karla Karışık Yağmurlu";
break;

case "Tipi":
$resim[$i]="tipi.gif";
$durum[$i]="Tipi";
break;

default:
$resim[$i]="bilinmiyor.gif";
}
}
$cikti="<table>
<tr><td colspan=
\"5\" align=\"center\">$sehir</td></tr>
<tr>
<td align=
\"center\">Şimdi</td>
<td align=
\"center\">Sıcaklık: ".$sic." </td>
<td align=
\"center\">".$basinc." </td>
<td align=
\"center\">".$durum[0]."</td>
<td align=
\"center\">Rüzgar: ".$ruzgar."</td>
</tr>
";


for($i=1; $i < 4; $i++){
$cikti.="<tr>
<td align=
\"center\">".$tarih[$i]."</td>
<td align=
\"center\">Min: ".$min[$i]." </td>
<td align=
\"center\">Max: ".$max[$i]." </td>
<td align=
\"center\">Durum: ".$durum[$i]."</td>
<td align=
\"center\"><img src=
\"hava/".$resim[$i]."\"></td>
</tr>";
}

$cikti.="</table> ";
return $cikti;
}
}

$dosyaadi = "hava.txt"; // Kes dosyasının adı ne olsun?
$bekle = 3600; // Kesı yenılemek ıcın kac sanıye beklesın?

# Kes dosyası yoksa olustur
if(!is_file($dosyaadi)){
$dosya = fopen($dosyaadi,"w");
fclose($dosya);
}

# Son guncelleme anından bu yana
# $bekle kadar sure gectıyse kesı yenıle
if((time() - filemtime($dosyaadi)) >= $bekle){
$cikti=hava("Ankara");

# Cıktıyı kes dosyasına aktar
$dosya = fopen($dosyaadi,"w");
fwrite($dosya,$cikti);
fclose($dosya);
}
# Degılse cıktıyı kesten oku
else
$cikti = file_get_contents($dosyaadi);

echo $cikti;
?>


hava("Ankara"); hava("Istanbul"); hava("Izmir"); diye istediğiniz şehir için hava durumunu alabilirsiniz


KAYNAK
Emre ÇEVİK
 

hakan.ak

Üye
Kayıt
1 Ağustos 2009
Mesaj
2
Tepki
0
öncelikle teşekkür ederim paylaşım için. Fakat
bu örnek bir çok yerde mevcut ama demo su yokmu?
 
Yukarı Alt