Php’de çoğu arkadaşımızın curl konusunda oldukça meraklı olduğunu görüyorum. Bu derslerle size dilim döndüğünce curl fonksiyonunu anlatmaya çalışacağım :)
Öncelikle curl ne işe yarar ona değinelim. Curl fonksiyonu ile file_get_contents gibi diğer sitelerin kaynak kodunu çekebilir, diğer sitelerden hostunuza dosya download edebilirsiniz. file_get_contents den farklı olarak istediğiniz siteye login olabilirsiniz, referrer, cookie ve useragent gibi bilgilerinizi değiştirebilirsiniz, yada isterseniz proxy ile bağlanabilirsiniz. Ayrıca file_get_contents e göre sunucuyu daha az yorar ve daha performanslıdır.
Kullanımında temel olarak birkaç fonksiyon ile uygulanır. Onları öğrenelim önce
curl_init() : curl oturumunu açar
curl_setopt(): referrer, url, useragent, postdata gibi ayarların yapıldığı fonksiyon
curl_exec(): bu fonksiyon yazılana kadar olan curl fonksiyonlarını işleme sokar ve gelen veriyi alır
curl_close(): curl oturumunu kapatır
Temel yapı ve kullanım sırası bu şekildedir.
curl_init() oturumunu açtığımızda diğer fonksiyonlarda o oturum ile çalıştığımızı belirtmeliyiz. Yani;
$ch = curl_init();
Burada $ch değişkenimize bir oturum açtık, bundan sonraki işlemlerimizde bu oturum ile işlem yapacağız. Örneğin ref5 sitesine bağlanacaksak
curl_setopt($ch, CURLOPT_URL,"http://ref5.net");
Şeklinde olacak. Burada curl_setopt fonksiyonu ile curl de yapacağımız işlemleri belirtiyoruz. Kullanımı şu formattadır;
curl_setopt(curl_oturumu,yapılacak_işlem,işlem_değişkeni);
Üstte yazdığımız CURLOPT_URL işlemi, gidilecek url adresini belirtir. Diğer işlemleri ileriki derslerimde göstereceğim.
En önemli kısım, curl_exec fonksiyonudur. Kullanımı şu şekilde;
curl_exec($ch);
Yani içine işlemler tanımladığımız oturumumuzu işleme sokar, ve işlem sonundaki verileri gösterir. Bu şekilde kullandığımızda aldığı verileri direk ekrana yazdırır. Bunu önlemek için gelen verileri bir değişkene almamız gerekir.
$veri = curl_exec($ch);
Bu şekilde gelen verileri $veri değişkenine aktardık. Daha sonra bu değişkende işimize yarayan kısımları ayıklayarak istediğimiz yerde kullanabiliriz.
Son olarak geldik curl oturumumuzu kapatmaya.
curl_close($ch);
Şeklinde kodlamamızı bitiriyoruz.
Toparlarsak, genel kullanıma örnek bir kodla özetleyelim;
$ch = curl_init(); // oturumumuzu açtık
curl_setopt( $ch , CURLOPT_URL , "http://ref5.net" ); // ref5 url sine bağlanma işlemi tanımladık
$veri = curl_exec($ch); // oturumu işleme soktuk ve gelen veriyi $veri değişkenine aldık
curl_close($ch); // oturumu kapattık
echo $veri; // oturumdan gelen $veri değişkenini ekrana yazdırdık
--------------------------------------------------------------------------------------
cURL Dersleri - Bölüm 2 - useragent ve referrer
Bir siteden veri çekmek her zaman kolay olmayabilir, önlemler alınmış olabilir. Örneğin browser bilgisi var mı yok mu diye kontrol edip bazı acemi botları engelleyebilir. Peki bunu nasıl aşarız ? Önceki dersimizde bahsettiğimiz curl_setopt fonksiyonuna CURLOPT_USERAGENT değişkenini ekleyerek. Şöyle ki;
curl_setopt ($ch,CURLOPT_USERAGENT,"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19");
Şeklinde yazarız. Burada benim vermiş olduğum useragent dizisi chrome a aittir. Şu adrese girerek browserınızın useragent bilgisini kısa yoldan alabilirsiniz. Ayrıca php deki $_SERVER['HTTP_USER_AGENT'] değişkeni ile de elde edebilirsiniz. Bu arada dilerseniz useragent i sabit yapmayabilirsiniz, şu şekilde ayarlayarak dosyayı açan kullanıcının useragent bilgisini botta kullanmış olursunuz.
curl_setopt ($ch,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);
Useragent engelini aştık, şimdi sıra referer engelinde. Referer nedir ? O dosyaya hangi adres aracılığıyla girildiği bilgisidir. Örneğin, benim www.abc.com/index.php de kullanıcı giriş formum var diyelim, formum /giris.php ye gönderiyor olsun bilgileri. Ben giris.php dosyasında $_SERVER['HTTP_REFERER'] ile sadece www.abc.com/index.php den gelenlerin giriş yapmasına izin veririm, diğer yerlerden girişi engellerim, böylece botlara karşı engel yaratırım. Ama tabiki bunu curl ile kolayca aşabiliriz. Çünkü referer bilgisi browser üzerinde oluşan bir bilgidir ve curl de istediğimizi ayarlayabildiğimiz bir browser gibidir :) Bu referer bilgisi hotlink korumasını aşmamıza da yardımcı olur. Örneğin bir site resimlerinin sadece o sitede gösterilmesini sağlıyorsa, diğer sitelere koyunca hata resmi gösteriyorsa, referer bilgisinde kendi sitesinin adresini gönderdiğimizde bize hata göstermeyecektir.
Bunu CURLOPT_REFERER değişkeni ile tanımlarız.
curl_setopt($ch,CURLOPT_REFERER,'http://www.abc.com/index.php');
Şeklinde kullanılır.
--------------------------------------------------------------------------------------
cURL Dersleri - Bölüm 3 - returntransfer , header ve followlocation
İlk dersimizde demiştik ki eğer curl_exec($ch) fonksiyonunu bir değişkene atamazsak yani şöyle $veri = curl_exec($ch); değil de curl_exec($ch); yazarsak direk ekrana yazar gelen verileri. Bunu istersek kapatabiliriz. Onun için;
curl_setopt( $ch , CURLOPT_RETURNTRANSFER , 1 );
İşlemini tanımlarız. 1 veya true yazarsak ekrana basmaz, 0 veya false yazarsak ekrana basar.
Header ise girdiğimiz url den bize dönen header bilgilerini gelen veriye eklememizi sağlar.
curl_setopt( $ch , CURLOPT_HEADER , 1 );
Yine 1 ve true yazılırsa açılır, 0 ve false yazılırsa kapanır. Header nedir ? Browsera giden komutlardır, yönlendirme, cookie vs gibi. Genelde http kodu için kullanılır 200 ok mi 403 forbidden mi 404 not found mı 301 moved mi ona bakmak için. Örnek:
$ch = curl_init();
curl_setopt( $ch , CURLOPT_URL , "http://t.co/UyEQQtTz" );
curl_setopt( $ch , CURLOPT_HEADER , 1 );
$veri = curl_exec($ch);
curl_close($ch);
echo $veri;
Çıktısı:
HTTP/1.1 301 Moved Permanently
Date: Wed, 09 May 2012 21:48:30 GMT
Server: hi
Location: http://ref5.net
Cache-Control: private,max-age=300
Expires: Wed, 09 May 2012 21:53:30 GMT
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8
Followlocation ise header da gelen yönlendirmeleri takip etme seçeneğidir. Üstteki örnekte gördüğünüz gibi girdiğim linki location ile ref5.net e yönlendirmiş. Ben tekrar CURLOPT_URL tanımlayıp oraya girebilirim ama bunu otomatik yapmak varken neden uğraşalım. Şu şekilde ayarladığımızda;
$ch = curl_init();
curl_setopt( $ch , CURLOPT_URL , "http://t.co/UyEQQtTz" );
curl_setopt( $ch , CURLOPT_FOLLOWLOCATION , 1 );
$veri = curl_exec($ch);
curl_close($ch);
echo $veri;
Kısaltılmış linkimizi açıp bizi otomatik ref5.net’e yönlendirecek, ardından ref5 in kaynak kodunu bize getirecektir :) Bu sadece kısa linklerde değil form girişlerinde de çok işimize yarayacak. Çünkü diyelim login formu dolduruyorsunuz, size sadece hesap.php ye yönlendirme kodu veriyorsa kaynak kodunuz boş görünecek, followlocation tanımladığınızda hesap.php ye de ulaşıp onun kodlarını döndürecek size ;)
--------------------------------------------------------------------------------------
cURL Dersleri - Bölüm 4 - timeout ve proxy
Timeout, zaman aşımı anlamına gelir. Yani curl fonksiyonumuz belli bir süre içinde tamamlanmazsa, siteden cevap gelmezse yani, oturumumuzu otomatik kapatır ve dosyamızda gereksiz bekleme yaratmamış olur. Bu kesinlikle dosyanın tamamını etkileyen bir timeout değildir, sadece o oturum içindeki süreyi kapsar, yani dosyanın geri kalan kodları çalışmaya aynen devam eder, die() komutu gibi değildir.
curl_setopt($ch,CURLOPT_TIMEOUT,5);
Şeklinde tanımlanır. Burada belirtilen 5 değeri saniye cinsindendir. Yani 5sn içinde cevap gelmez ise karşıdan, curl oturumu kapatılacaktır. Özellikle birazdan göstereceğim proxy ile birlikte kullanmanızda yarar var, çünkü çalışmayan proxylerde fonksiyon uzun beklemelere girebilir, bunları timeout ile otomatik kapatabilirsiniz.
Proxy bağlandığımız sitede ip adresimizin gizlenmesine (farklı görünmesine) yardımcı olur. Proxy kullanmak için ise 2 değişkenimiz var, biri proxy ip sini yazdığımız CURLOPT_PROXY değişkeni, diğeri de proxynin portunu yazdığımız CURLOPT_PROXYPORT değişkeni. Önce güncel bir proxy bulmamız lazım, örnek olarak şu adresten edinebilirsiniz anlık olarak. Proxymizi aldıktan sonra şu şekilde uyguluyoruz;
curl_setopt( $ch , CURLOPT_PROXY , "177.103.139.64" );
curl_setopt( $ch , CURLOPT_PROXYPORT , "3128" );
Sanıldığının aksine kullanılması son derece kolaydır yani :)
Örnek olarak ip adresimizi gösteren bir siteye bağlanıp test edebiliriz bunu ;
$ch = curl_init();
curl_setopt( $ch , CURLOPT_URL , "http://www.geoiptool.com/" );
curl_setopt( $ch, CURLOPT_TIMEOUT, 5);
curl_setopt( $ch , CURLOPT_PROXY , "177.103.139.64" );
curl_setopt( $ch , CURLOPT_PROXYPORT , "3128" );
$veri = curl_exec($ch);
curl_close($ch);
echo $veri;
Burada timeout 5 verdim ki 5sn den geç tepki veren ip adresini otomatik kapatsın diye. Bu proxy işlemlerini değişken ile uygularsak, döngüye sokup timeout ile sağlam olanlarını da ayıklayabiliriz. Sizin yaratıcılığınıza kalmış artık gerisi :)
--------------------------------------------------------------------------------------
cURL Dersleri - Bölüm 5 - post ve get metoduyla form gönderme
Önceki derslerimizde hep karşıdan veri çekmeyi gördük, bu dersimizde ise siteye veri göndereceğiz.
Gönderilecek veri için iki metodumuz var, biri GET diğeri ise POST dur. GET kısaca url özerinden açık bir şekilde gönderilir (örneğin; site.com/index.php?id=123 gibi), POST ise genellikle form doldurmada (üyelik giriş formu, mesaj gönderme formu vb.) uygulanan gizli veri gönderimidir.
İlk önce GET veri gönderimine bir örnek verelim, gayet basittir kullanımı;
$get_verileri = "id=123&sayfa=2";
$ch = curl_init();
curl_setopt( $ch , CURLOPT_URL , "http://www.abc.com/index.php?".$get_verileri );
$veri = curl_exec($ch);
curl_close($ch);
Gördüğünüz gibi URL işlemininde sitenin sonuna “?” den sonra uyguluyoruz ve her değişkenin arasına & işaretini koyuyoruz. Şu şekilde de yazılabilir;
curl_setopt( $ch , CURLOPT_URL , "http://www.abc.com/index.php?id=".$id_degiskeni."&sayfa=".$sayfa_degiskeni );
Tamamen size kalmış, uzatmıyorum.
POST metodunu kullanabilmek bu kadar basit değildir, işin içine gizli değişkenler de girebiliyor çoğu zaman. Örnek formlar ile açıklayacağım bunu.
İlk formumuz;
Formun bulunduğu adres: www.abc.com/index.php olsun
Bize ilk lazım olan şey, formun nereye gönderildiği. Bunu action dan öğreniyoruz, yani giris.php imiş. O zaman curlopt_url değişkeni giris.php ye gidecek. Daha sonra inputlara bakıyoruz. 3 tane input var. Bunların name değerlerini alacağız. user, pass ve giris değişkenleriymiş. giris değişkeninin değeri (value) “Tamam” olarak verilmiş dikkat edin. Şimdi curl ile nasıl göndereceğimize bakalım;
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,"http://www.abc.com/giris.php");
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,"user=caqlayan&pass=123456&giris=Tamam");
$veri = curl_exec($ch);
curl_close($ch);
Şeklinde olur. Yani CURLOPT_POST ile post tipinde veri göndereceğimizi belirtiyoruz, ardından CURLOPT_POSTFIELDS ile değişkenlerimizi yazıyoruz aralarına & koyarak.
Post değişkenlerini isterseniz dizi olarak da gönderebilirsiniz.
$post_dizisi = array(
"user" =>"caqlayan",
"pass"=>"123456",
"giris"=>"Tamam"
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_dizisi);
Şeklinde kullanabilirsiniz. Dizi ile göndermenin daha kullanışlı olduğunu söyleyebilirim.
Bir başka form örneği;
Burada action ile get verisi de tanımlanmış. Onu ne yapıyoruz ? Hemen url kısmına ekliyoruz. Ardından inputlara bakıyoruz. Type hiç önemli değil, eğer name değeri atandıysa o değişken gidiyor demektir. Bu formda bir guvenlik adında gizli değişken var. Onu da göndereceğiz.
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,"http://www.abc.com/index.php?do=login");
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,"guvenlik=a1b2c3&user=caqlayan&pass=123456&giris=Tamam");
$veri = curl_exec($ch);
curl_close($ch);
Bu kadar basit. Yalnız dikkat edilmesi gereken birşey var, botları engellemek için koyulan bu gizli guvenlik değişkenleri sadece o oturumda geçerli olacaktır. Bunun için curl oturumunu kapatmadan önce siteye bağlanıp veriyi çekmeli, ardından guvenlik değişkenini bulup almalı, ondan sonra formun verilerini göndermeliyiz. Örnek kullanım;
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,"http://www.abc.com/index.php");
$veri1 = curl_exec($ch); // formun kaynak kodunu aldım
preg_match('/name=\"guvenlik\" value=\"(.*?)\"/', $veri1, $guvenlik);
// guvenlik değişkenimin değerini kaynaktan çektim
curl_setopt($ch,CURLOPT_URL,"http://www.abc.com/index.php?do=login");
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,"guvenlik=".$guvenlik[1]."&user=caqlayan&pass=123456&giris=Tamam");
$veri2 = curl_exec($ch);
// formu guvenlik değişkeni ile birlikte gönderdim
curl_close($ch);
Bir oturum içinde istediğimiz kadar curl_exec fonksiyonu kullanabiliriz.
Bu arada sadece input değil form içindeki textarea lar da form ile gider, özellikle mesaj bölümleri textarea ile verilir. Örnek;
Gibi bir textarea varsa name de yazan mesaj değişkenini de post ile göndermemiz gerekir.
--------------------------------------------------------------------------------------
cURL Dersleri - Bölüm 6 - cookies ve ssl
Curl ile https yani ssl sertifikalı sayfalara bağlanmak için en kestirme yol aşağıdaki gibidir.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Bu ayarı yapınca ssl doğrulamasını kapatmış oluyoruz ve önümüzdeki engel kalkmış oluyor, CURLOPT_URL kısmına https:// şeklinde url mizi yazıp işlemlerimize devam ediyoruz.
Gelelim cookie olayına. Bazı botlarda sitelere login olmamız gerekiyor. Ve bildiğiniz gibi giriş yaparken “beni hatırla” kutucukları vardır. Onları seçince size bir cookie verir, o cookie sizin browserınızda olduğu sürece siteye girdiğinizde login olmuş kabul eder sizi, tekrar tekrar login olmazsınız. Curl ile de aynı şeyi yapacağız. Bunun için biz cookie dosyamız olacak, cookie bilgilerimiz içine kaydedilecek, gerektiğinde oradan okunacak. O dosyamız cookie.txt olsun.
curl_setopt($ch,CURLOPT_COOKIEJAR,"cookies.txt");
curl_setopt($ch,CURLOPT_COOKIEFILE,"cookies.txt");
Şeklinde kullanılır. Buradaki CURLOPT_COOKIEJAR bize curl oturumumuz kapatıldığında bize gelen cookie değerlerinin kaydedileceği dosyayı belirtir, CURLOPT_COOKIEFILE ise oturumda göndereceğimiz cookie değerlerinin olduğu dosyayı belirtir. İkisini de aynı dosyaya tanımlamak en kullanışlı olan ayardır. Bu cookie dosyası sayesinde siteye bir kere login olduğumuzda, tekrar login olmaya gerek kalmadan site içinde dolaşabileceğiz.
Sadece dosya ile değil, istersek cookie değerlerini elle de girebiliriz.
curl_setopt($ch,CURLOPT_COOKIE,"userid=1;giris=ok");
Gördüğünüz gibi CURLOPT_COOKIE işlemine cookie_ismi=cookie_degeri şeklinde cookie değişkenlerimizi araya ; koyarak yazıyoruz. Bu kadar basit :)
--------------------------------------------------------------------------------------
cURL Dersleri - Bölüm 7 - Dosya upload ve kaynağı dosyaya kaydetmek
Temel curl ayarlarını göstermiştik. Şimdi biraz daha detaya inelim.
Curl ile bir dosyayı nasıl upload ederiz onu görelim önce. Örneğin bir resim upload etme formumuz olsun;
Buraya php ile aynı klasörde bulunan resim.png dosyamızı upload edeceğimizi farzedelim. Bunun için öncelikle resim.png dosyamızın gerçek yoluna ihtiyacımız var, yani serverda tam olarak hangi konumda bulunuyor. Örneğin; /home/caqlayan/public_html/upload/resim.png gibi. Bunu kolay yoldan elde etmek için realpath fonksiyonundan yararlanacağız ve formda post edilen değişkenin başına @ eklerek yazacağız.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://site.com/upload.php" );
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "resim=@".realpath("resim.png"));
$gelen = curl_exec($ch);
curl_close($ch);
Şeklinde göndereceğiz. Bu şekilde başına @ koyarak verdiğimiz değişken ile curl kütüphanemiz dosya içeriğini okuyarak post methodu ile uygun bir şekilde gönderecektir.
Diğer bir özelliğimiz ise, curl ile işlem yaptıktan sonra gelen kaynak kodunu dosyaya kaydetmek olacak. Mesela bunu otomatiğe bağladığınız bir botta hata mesajı alındığında dosyaya kaydedip log tutması için ayarlayabilirsiniz isterseniz. Kullanımı CURLOPT_FILE değişkeni ve fopen fonksiyonu yardımı ile oluyor.
$dosya = fopen('gelen.html', 'w');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://ref5.net" );
curl_setopt($ch, CURLOPT_FILE, $dosya );
curl_exec($ch);
curl_close($ch);
Şeklinde ref5 sitesine girdiğimizde dönen kaynak kodunu gelen.html doyasının içeriğine kaydettik. Burada dosyanın var olması gerekmiyor, yoksa kendisi oluşturuyor.
Genel anlamda işimize yarayacak curl kodları bu şekilde.
İşinize yarayanı seçip kullanmak size kalıyor :)