Php Üzerinde Curl, Stream_get_contents, file_get_contents metodları ile dosya okuma ve post işlemi

File get contents`in asıl amacı sunucu üzerinde bulunan her hangi bir dosyayı okumaktır. Bu çoğu zaman bir web sitesi olabildiği gibi bazen yazı dosyası yada okunabilir farklı bir nesne olabilir . Ancak bazı durumlarda bu yönetimi bir form nesnesine post atmak içinde kullanabiliriz. 

 Genel kullanımı;

$icerik = file_get_contents('http://www.tahribat.com/');



 

Şeklindedir. Yukarıdaki kod sisteme echo ile yazdırıldığında tahribat.com sitesi üzerindeki verileri (kaynak kodu görüntüleyebilir.)

 

Uzak bir sunucudan veri okunabileceği gibi kendi local serverınız üzerindede  (include_path) veri okuma imkanınız mevcuttur.

 

 PHP 5 versiyonundan önceki kullanımı

$dosya  = file_get_contents('./icerik.txt', true);




PHP 5 versiyonundan sonraki kullanımı

$dosya= file_get_contents('./icerik.txt', FILE_USE_INCLUDE_PATH);



 

Peki karakterler arası okuma yapmak istersek nasıl yapacağız...

 

$dosya = file_get_contents('./icerik.txt', NULL, NULL, 20, 10); //21. karakterden itibaren 10 karakter okuması gerektiğini söyledik....  Arada bulunan NULL,NULL olarak isimlendirilen alanların ne olduğunu dökümanı okumaya devam ettikçe örnekler üzerinde kendiniz çok daha iyi anlayacaksınız ancak biraz açmak gerekirse ilk NULL değişkeni  (php 5 den once true yada false değerini alırken, php 5 den sonra FILE_USE_INCLUDE_PATH gibi bir değişken almaya başladı).  İkinci NULL değişkeni ise stream_context_create ile header bilgisi oluşturup gönderebileceğinizi ifade etmektedir ki post ve get işlemlerinde bunu kullanmak zorundayız.



 

 

 

Bazı durumlarda uzak bir domain adresinin içeriğine ulaşmak istediğinizde karşılık alamayabilirsiniz. İçeriğin çekileceği domain adresinde bir takım korumalar olabilir. Bunun için karşıdaki siteyi Mozilla tarayıcısının bir eklentisi olan tamper data eklentisi ile inceleyip, hangi header bilgilerini sizden istediğini teyit etmelisiniz. Bu bilgileri öğrendikten sonra alta taraftaki gibi bir sorgu ile karşı sitenin içeriğine ulaşabilirsiniz. Örnek Kodlama alt taraftadır.

 

 

 

 

 

 

/

/http request için array yapısını oluşturalım

 

$arrayolustur = array(
  'http'=>array(
    'header'=>"Accept-language: en\r\n" . "Cookie: foo=bar\r\n",

    'method'=>"GET", // Get methodu almak istediğimiz söyledik
  )
);

$httprequestarrayi = stream_context_create($arrayolustur ); //file_get_contents üzerinden kullanmak için yapıyı hazırladık

$icerikbilgisi = file_get_contents('http://www.tahribat.com/', false, $httprequestarrayi ,NULL,NULL);

 

 

$icerikbilgisi değişkenini ekrana bastırdığınızda sitenin içeriğini çektiğini görebileceksiniz.

 

File_get_contents ile POST işlemi yapmak için alt taraftaki kodları görüntüleyiniz.

 

$postatilacakbilgi=  http_build_query(   

 array(        

    'username' => ‘kullanıcı adınız',       

    'password' => 'şifreniz'  

 )

                         );

 

 $headerarrayolustur= array(

'http' =>     array(      

  'method'  => 'POST',      

  'header'  => 'Content-type: application/x-www-form-urlencoded',     

   'content' => $postatilacakbilgi     

)

 ); 

 

$postatilacakarray  = stream_context_create($headerarrayolustur); 

 

$sonuc=file_get_contents('http://www.tahribat.com', false, $ postatilacakarray );



 

Çeklinde her hangi bir siteye login olma işlemini de sağlayabilirsiniz.

 Stream_get_contents İle Post İşlemi…

Bazen kendi sunucunuda file_get_contents yerine stream_get_contents kullanmanız gerekibilir.  

$postatilacakbilgi=  http_build_query(   

 array(        

    'username' => ‘kullanıcı adınız',       

    'password' => 'şifreniz'  

 )

                         );

 

 $headerarrayolustur= array(

'http' =>     array(      

  'method'  => 'POST',      

  'header'  => 'Content-type: application/x-www-form-urlencoded',     

   'content' => $postatilacakbilgi      

)

 ); 

 

 

 

 $postatilacakarray  = stream_context_create($headerarrayolustur);   

 

 $fp = @fopen("http://www.tahribat.com", 'rb', false, $postatilacakarray);

 

if (!$fp) {   

 throw new Exception("http://www.tahribat.com Adresi Açılamıyor, $hata");

}

 

$cevapal = @stream_get_contents($fp);

 

 if ($cevapal === false)  {   

 throw new Exception("http://www.tahribat.com adresinden data okunamıyor, $hata");

}



 

throw = Fırlatmak demektedir. Eğer bir hata alırsa $hata değişkeninin içeriğine istediğiniz hatayı bastırmanızı sağlar.  Google üzerinden catch ve throw u aratarak daha ayrıntılı bilgiye ulaşabilirsiniz.

Curl İle POST İşlemi,Cookie İşlemleri ve Dosya okuma

Curl başlı başına sayfalarca döküman oluşturulabilecek bir php kütüphanesidir desem yanlış söylemiş olmam. Bundan dolayı alt seviyede CURL bilen arkadaşların  http://www.tahribat.com/Dokuman-Php-Curl-Ile-Veri-Cekme-383/  dökümanı üzerinde biraz daha durmasını tavsiye ederim.

İlk olarak Cookie Bilgisini bildiğiniz bir web sitesi üzerinde veri okuma

$uri = “http://www.tahribat.com”;

 $cookiem=”__utma=***;__utmb=***;";  

 $header[]="User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5";

$header[]="Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";

$header[]="Accept-Encoding: gzip,deflate,sdch";

$header[]="Accept-Language: tr-TR,tr;q=0.8,en US;q=0.6,en;q=0.4";

$header[]="Accept-Charset: ISO-8859-9,utf-8;q=0.7,*;q=0.3";

$header[]="Cookie: $ cookiem ";    

$tuCurl = curl_init();  // Curl oturumunu başlatıyoruz

curl_setopt($tuCurl, CURLOPT_HEADER, false);  //Çıktıda header bilgilerinin görüntülenip görüntülenmiyeceğidir.false görüntülemez true görüntüler

 

curl_setopt($tuCurl, CURLOPT_SSL_VERIFYPEER, 0);  //https:// li bir site ise ona destek vereceğini söylüyoruz.

curl_setopt($tuCurl, CURLOPT_NOBODY, FALSE); //Buda çıktıda html kodlarının görüntülenip görüntülenmiyceğidir.true görüntülemez false görüntüler




curl_setopt($curl, CURLOPT_REFERER,"http://tahribat.com/member"); // Sahte referer bilgisi gönderebilirsiniz. Bazı siteler bunu bunu takip ederler. Eğer referer boş olarak atanmışsa siteden banlanabilirsiniz. Bu bilgiyi burda gönderebileceğiniz gibi $header[] dizi içerisindede gönderebilirdiniz (Mesela ben tarayıcı bilgilerimi $header[] içerisinde göndermişim. İsteseydim curl_setopt($tuCurl,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']); şeklinde burdan da gönderebilirdim. Encoding i gönderdiğim gibi). Head bilginlerinin kapsadığı her bilgiyi bu dizi içerinde gönderebilirsiniz. Tamper DATA eklentisi (mozilla) ile kendinizi çok daha fazla geliştirebilirsiniz.

curl_setopt($tuCurl, CURLOPT_RETURNTRANSFER, 1); //bu değişken true ve false değeri almaktadır özelliğide şudur bağlantı kurulan sayfa headerla yada başka şekilde başka bir sayfaya yönleniyorsa o sayfanın içeriğine devam edip etmiyceğidir.

 

curl_setopt($tuCurl, CURLOPT_HTTPHEADER, $header);   // header bilgilerini gönderiyoruz .

 

curl_setopt($tuCurl, CURLOPT_ENCODING , "gzip"); // endocoding işleminin gzip olacağını söylüyoruz. Dilerseniz bu satırı silebilirsinizde. Ancak okunacak olansayfa gzip destekliyse kalmasını öneririm. Ayırca bu satısı silip $header[] dizi içerinde de gönderebilirsiniz.

 

curl_setopt($tuCurl, CURLOPT_URL, $uri); //Curl ile bağlanmak istediğimiz adresi yazıyoruz

 

 $sonuc = curl_exec($tuCurl); // İşlemi yukarıdaki bilgiler ile başlatıyoruz ve çıktıya ulaşıyoruz.

 

$sonuç üzerinde ne yapmak istiyorsanız yapabilirsiniz.

 

Curl_close($tuCurl); //  Curl işlemini durdurduğumuzu söylüyoruz. Eğer iç içe for ,foreach vb bir işlemde curl çalıştıracaksanız curl işlemini durdurmayı unutmayınız. Aksi taktirde ram iniz aşırı derecede şişebilir. Curl php üzerindeki en fazla ram tüketimi yapan kütüphanelerden bir tanesidir.

 

Yukarıda $header[]=" olarak tanımladığım alanları siz kendiniz bir array alıp daha düzenli bir şekilde de gönderebilirsiniz.

 

Ben yukarıdaki örnekte üyelik girişi vb. Bir işlem sonucunda alınan cookie bilgisi ile web sitesi üzerinden içerik okumayı gösterdim. 

 Login olduğum bir web sitesinde cookie bilgimi nasıl öğrenirim

Chrome tarayıcısı için geliştirilen  EditThisCookie eklentisini tarayıcınıza kurarak cookie bilgilerinizi alabilirsiniz. İşlem basamakları şu şekildedir.

·      Eklenti Chrome tarayıcısına indirilir.

·      İçerik okuyacağımız web sitesine kullanıcı adı ve şifre ile manüel bir şekilde giriş yapılır.

·      Mevcut web sitesi açıkken eklentinin sağ üst tarafta bulunan iconuna basarak cookie ayrıntılarını görüntüleyebilirsiniz.

·      Görüntülediğiniz cookie başlıklarını ve içeriklerini $cookiem formatındaki gibi tanımlayınız.

 Peki Curl ile POST atıp oluşacak cookie bilgisi ile bir web sitesi içerisinde dolaşmak istediğinizde nasıl yapacaksınız onu görelim.

Yukarıdaki örnek varken buna ne gerek var diyebilirsiniz ancak ufkunuzu biraz daha açalım. Diyelim ki 50 tane web siteniz var misal (wordpress) hepsine tek tek cookie mi oluşturup ayrı ayrı yazılım yapacaksınız gerek yok. Geçelim kodlamaya….

$headers[] = 'User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)';  $headers[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";

$headers[] = "Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3";     $headers[] = "Referer: http://www.tahribat.com/";     // Yukarıda bahsetmiştim referrer bilgisini header olarakda gönderebilirsiniz.

$headers[] = "Content-type: application/x-www-form-urlencoded";

$headers[] = "Connection: keep-alive"; 



 

Bu header bilgilerinde dikkat etmeniz gereken bir şey var, eğer login olacağınız site connection:keep-alive şeklinde post alıyorsa sizde o şekilde göndermelisiniz. (BKNZ: Mozilla tamper data) Yani bunları boşuna yazmadım. Profesyonel siteler bunları daima control eder. Misal Accept Encoding, referrer,tarayıcı bilgileri vs.

 

 

 

$tuCurl = curl_init();         

curl_setopt($tuCurl, CURLOPT_HEADER,false);    

curl_setopt($tuCurl, CURLOPT_HTTPHEADER,$headers);          

curl_setopt($tuCurl, CURLOPT_RETURNTRANSFER,true);        

curl_setopt($tuCurl, CURLOPT_SSL_VERIFYPEER,false);      // ssl li siteler için şart

curl_setopt($tuCurl, CURLOPT_SSL_VERIFYHOST,false);        // ssl li siteler için şart

curl_setopt($tuCurl, CURLOPT_FOLLOWLOCATION,true);      

curl_setopt($tuCurl, CURLOPT_TIMEOUT, 30); // kaç sanitede ulaşamazsa dursun   


 
Şimdi yukarıya kadar olan yerleri biliyorsunuz burdan sonrasını açıklayalım…

 

curl_setopt($tuCurl, CURLOPT_COOKIESESSION,true);         // cookie ile session bilgisini tutması gerektiğini söyliyoruz.

 

curl_setopt($tuCurl,CURLOPT_COOKIEFILE,dirname(__FILE__)."/googleamcam.txt");

curl_setopt($tuCurl,CURLOPT_COOKIEJAR,dirname(__FILE__)."/ googleamcam.txt");

 

// Bu üstteki 2 satırdada post işleminde oluşacak olacak cookie bilgilerini dosyanın dizininde yeni oluşturulacak olacak googleamcam dosyamda tutacağımı ve cookie bilgilerini oraya yazması gerektiğini söyliyorum. Bu oturum süresince o site üzerindeki tüm sayfalara girişte bu cookie bilgisi otomatik olarak gönderilecektir.

 

$bunuyollax = "username=kullanciadim&sifre=sifrem"; 

 

curl_setopt($ch, CURLOPT_URL,"http://www.tahribat.com/login.aspx/");       // Nereye post atılacağını söyledim

 

curl_setopt($ch, CURLOPT_POST, 1);          // Post olarak gönderileceğini söyledim 

 

curl_setopt($ch, CURLOPT_POSTFIELDS, $bunuyollax); // Post bilgisi olarak bunu göndereceğini söyledim.

 

$sonuc = curl_exec($tuCurl); // İşlemi yukarıdaki bilgiler ile başlatıyoruz ve çıktıya ulaşıyoruz.

 



 

 

 

 

 

 

Artık bu noktada sisteme giriş yapıldı. Cookie oluşturuldu...

 

Foreach() ve for() gibi fonksiyonları burda çalıştırırsanız istediğiniz her sayfaya ulaşabilirsiniz.

 

Örnek :

 

for ( $say=1 ; $say <= 10 ; $say++ ) {

 

curl_setopt($tuCurl, CURLOPT_URL, “http://www.tahribat.com/pmkutusu?id=$say”);  

$pmkutusuiceri = curl_exec($tuCurl);

 

// Burda isterseniz mail attırın,isterseniz yazı dosyasına kaydedin, isterseniz db ye ekletin

}

 

 

Curl_close($tuCurl); //   Fonksiyonu ile curl i kapatın



 

Erdem UZUN – www.erdemuzun.com.tr - http://www.tahribat.com/Murit-erdem/

Tarih:
Hit: 2397
Yazar: Erdem



Yorumlar


Yorum yapabilmek için üye girişi yapmalısınız.

Yorumlar

Erdem tarafından yazıldı. Tarih: 24/Ağu/16 23:51
Giriş seviyesine hitap ederken, ileri seviyeyide kapsıyor hocam. @nereodi
Aslında keşke proxy ile kullanımıda ekleseydim
seyhzade tarafından yazıldı. Tarih: 07/Ağu/16 11:57
emeğinize sağlık.
snnyk tarafından yazıldı. Tarih: 04/Ağu/16 16:16
tbt editör arızalı elleham
nereodi tarafından yazıldı. Tarih: 04/Ağu/16 01:07
Giriş seviyesi için açıklayıcı olmuş güzel.