Merhaba arkadaşlar

Size php ile bot yazmayı basit bir dille anlatmaya çalışacağım.. Hala kavramakta zorlanan arkadaşlar için en basite indirgeyeceğim hatta size direkt hazır dosyasını vereceğimi makaleyle birlikte deneme yanılma yoluyla hemen kavrayabileceğinizi düşünüyorum..

Şimdi bot nedir genel yapısını anlatalım ne işe yarar yenilir mi içilir mi napılır bu meret?

Bot bir insanın taklidini yapar, bu insan siz oluyorsunuz yani botu kim yazdıysa bot onun taklidini yapar. Kısaca basit bir yapay zekadır. ancak sizin verdiğiniz zeka kadar çalışabilir..
Şimdi biz nasıl veriyi alırız, bir makaleyi nasıl alıp kullanırız mesela diyelim ki kod ara sitemizdeki php ile lisanslama konusunu sitemize alacağız diyelim şimdi gittiğimiz işlemleri sıralayalım..

Adım 1: Kod Ara adresine giriyoruz.
Adım 2: Alacağımız makaleyi seçiyoruz örnek olarak php ile lisanslama
Adım 3: Başlığını sitemizin başlığı kısmına, açıklaması açıklama kısmına, içeriğini içerik kısmına giriyoruz resim varsa resmide içeriğe ekliyoruz yada ilgili bölüme..
Adım 4: Kaydet butonuna basıyoruz makaleyi almış oluyoruz..

Bizim işlemlerimiz bu kadar basit değil mi ? İşte bizim yaptığımız işlemlerin aynısını bota öğretiyoruz. Ancak şöle bir sorun var.. Botun gözü ve iradesi yok ! O halde ne yapacağız ona bir göz, birde neyi nerden alacağına görede ufak basit bir irade veriyoruz. Hatta seçim şansı bile tanıyabiliriz, 10 tane php kategorisinden al, 5 tane asp kategorisinden al diye.. Hatta şunuda diyebiliriz toplam 15 tane makale alma hakkın var kac tane alacağına sen karar ver.. Eh böle bi karar yapısı olmadiği için şöyle yaparız random sayı üretiriz 1,15 arasinda bi sayı atar kafadan.. Sonra 6 çıktı diyelim 15-6 yaparız 6 tane php, kalanını asp den çek deriz, alın size mantıksal bir karar yapısı, bu tarz düşünceler devamlı yazılım yaza yaza gelişir, kısaca buna biz algoritma zekası deriz, yavaş yavaş gelişir, problemlere daha kolay çözüm bulmaya başlarsınız.. Herneyse şimdi işlemlerimizi botun üstünde anlatacağım bota göre insanın algoritmasını bota nasıl dönüştürürüz ?

Adım 1; Kod Ara sitesine sokmamıza gerek yok öncelikle botu çünkü karar yapısı yok karar yapısını biz vereceğiz ne çekeceğimizi hedeflememiz lazım önce, ben mesela bi yazılım forumum olsa kod ara sitesi de yazılım sitesi olduğu için direk olarak kod aranın tüm makalelerini forumun programlama bölümüne ekletirdim, tek kategoriyse sorun yokda eğer çok kategoriyse her kategoriye ayrı ayrı yazmam gerekebilir.. Yani şu php kategorisini çeker gider forumunuzda php bölümüne ekler, neyseki nasıl olsa benden alacaklar RSS bölümüne kategorilerin id değerlerini yazdım bari fazla yorulmasınlar dedim rss'deki id kısmına göre kategorilerin hangi kategoriden anlayabilirsiniz orta düzeydeki kullanıcılar direk çözeceklerdir durumu.. Neyse biz basite indirgeyelim RSS'den gelen tüm konuları alacağız, foruma, sitemize yada nereye eklemek istiyorsak oraya ekleyeceğiz..

Adım 2; Botun nerden konulara alacağına karar verdiğimize göre botun RSS linkini bulalım siteden.. http://www.kodara.com/rss.xml Kod Ara sitesinin RSS linki bu şimdi rss nin içine girip kaynağını inceleyelim RSS'den hangi verileri alabileceğimize bakalım ve hangi taglar arasındalar.. Hmm derken.. Başlık, konu önizleme resmi, açıklama ve konu linki.. aslına bakarsak bize linki verse yeterli fazlasıda göze batmaz heralde..

Adım 3; İlk önce bot RSS linkine girecek, RSS'nın kaynak kodunu alacak, sonra RSS'nin kaynak kodundan konuların URL'lerini alacak, daha sonra bunları döngüye sokup sırayla tekrar konu linklerine girip, içeriği, konu başlığını, resmi vb. gibi bilgilerini alacak.. Bilgileri almada aynı rss mantığı gibi o url ye girip kaynak kodunu alıp kaynak kodunu ayıracağız.. Bu işlemlere tabi tutup ham veriyi, bilgiye dönüştürüp veritabanımıza ham veri diye yeniden kaydedeceğiz..

Php ile bot yapma kodlamasına başlıyoruz arkadaşlar.

ilk önce php ile bot yapmak için size hazır bir kaç fonksiyon vereceğim bunu her yerde her zaman kullanabilirsiniz. botu siteye sokmak için CURL kütüphanesini kullanacağız..

function cek($ursa){
$useragent = 'Mozilla/5.0 (compatible; Googlebot/2.1; +[url]http://www.google.com/bot.html)';[/url]
$referer = 'http://www.google.com/';
$ch = curl_init();
$zaman = 0;
curl_setopt ($ch, CURLOPT_URL, $ursa);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $zaman);
curl_setopt ($ch, CURLOPT_REFERER, $referer);
curl_setopt ($ch, CURLOPT_USERAGENT, $useragent);
$rmx = curl_exec($ch);
curl_close($ch);
return $rmx;
}

function arayi_al($zkaynak, $ref_bas, $ref_son){
$cikti_bas=explode($ref_bas,$zkaynak);

for($a=1;$a<count($cikti_bas);$a++){
$cikti_son[] = explode($ref_son,$cikti_bas[$a]);
}

for($b=0;$b<count($cikti_bas);$b++){
$sonuc[$b] = @$cikti_son[$b][0];
}

if(empty($sonuc)){
die("Ara Alinamadi");
}else{
return $sonuc;
}
}
şimdi bu iki fonksiyonu tanıtayım cek(); fonksiyonu CURL kütüphanesinin kodlarından oluşuyor arada bir değer belirtiyorsunuz o değerde bir web sayfası adresi oluyor gidip o adresden veriyi çekip tanımladığınız değişkene kaynak kodunu bastırıyor, kullanımını aşağıda göreceksiniz. bunu sayfanızın en üstünde bi kere kullansanız yeterli 2. kez kullanırsanız hata verecektir zaten. arayi_al(); fonksiyonu ise benim sık kullandığım bir fonksiyon, bununla gelen kaynak kodlarını ayrıştıracağız farklı yollar varda ben kendime olduğunca basitleştirdim mevzuyu, kullanımı şu şekilde 3 değer alıyor, birinci değeri websayfasından gelen kaynak kodlarının değişkeni yani içinde işlem yapılacak değişken, ikinci değer başlangıç değeri, üçüncü değer bitiş değeri, yani kısaca XML mantığında çalışıyor, iki tag arasına alıyor ve bunları değişkene basıyor eğer aynı tagdan bir çok varsa bunları array'a listeleyip gene değişkene basıyor. örnek kullanımı şu şekilde <? $yenidegisken=arayi_al($kaynakkod,'<title>','</title>'); ?> bu kod ne işe yarıyor şimdi kaynakkod değişkenine gelen html kodları içinde sitenin head taglarının arasındaki sayfanın başlığını alıyor yani title tagları arasnda ne varsa onu alıyor getirip yenidegisken içerisine basıyor.

Fonksiyonları anladığımıza göre adım adım botumuzu kodlamaya başlayalım..

$kaynak=cek('http://www.kodara.com/rss.xml');
daha önce açıkladığımız fonksiyonu kaynak kodlarını çekmek için kullandım $kaynak değişkenine eğer curl kütüphanesi kuruluysa sorunsuz olarak değişkene aktaracaktır.

$ara=arayi_al($kaynak,'<item>','</item>');
daha önce yine açıkladığımız arayi_al fonksiyonu çektiğimiz fonksiyonun kaynak kodlarının içinde item taglarını alıyorum, item taglarını incelediğimde içerisinde konu URL leri ve önizlemelere kadar bir çok bilgi içeriyor şimdi parçaları daha kısıtlamış olduk daha kolay kullanabileceğiz.

echo print_r($ara); komutunu kullanırsak ekrana gelen array değerini görmüş oluruz mesela $ara[1] yaparsak hangi verilerin geleceği hangi formatta geleceği hakkında bilgi edinmiş oluruz. raporlama ile adım adım gidersek neyin neden olmadığını daha kolay anlayabiliriz.

şimdi baktığımızda site yeni açıldığı için rss de 4 konu gözüküyor mesela site benim olduğu için biliyorum ancak normalde adamın kaç tane item bastırdığı belli olmaz o yuzden esnek yapacağız, döngü kuracağız. normalde foreach döngüsü yaparım ancak bunu for ile yapacağım ki farklı sorunlara farklı çözüm üretmenin nasıl olduğunu anlayabilelim.. mesela şuanda baktığımda count ile fazladan bir veri geliyor RSS'den kaynaklanan bir sorundan dolayı o yuzden for da bitiş değerine -1 atayacağım birde.. gelen verileri 0 dan başlatacağım ancak 1 den baslaması gerek normalde for ancak biz 0 dan başlatacağımız için count'a saydırdığımda bir sayı fazla cıkacak çünkü count 0'ı saymaz. o yuzden -2 ile bitireceğim durumu. bu arada count fonksiyonunu bilmeyenler için kısaca açıklayım array yada list gibi değerleri sayan bir fonksiyon yani count($ara); komutunu kullandığımızda bize $ara değişkeninin içinde kaç tane item olduğunu söyleyecek bize. for ile birleştirdiğimizde esneklik sağlayacak eğer kişi rss ye 100 tane koyarsa 100 kere işlem yapacak, buda botumuzda bir çakışma yaratmayacak hepsini çekecek..

for ($anasayac = 0; $anasayac <= count($ara)-2; $anasayac++ ) {
}
şimdi $anasayac değişkeni ile döngüyü kordum count ile $ara değişkenini saydırdım fazladan gelen boşluk verileri içinde toplam gitmesi gereken durumdan 2 çıkarttım.

şimdi kafanız karışmaması için şimdilik veriyi işleyip ekrana bastıracağım diğer makalede ise botu diğer konulara sokup, içerisindeki veriyi aldırmayı göstereceğim adım adım gidelim ki göre göre gidip kafamız karışmasın.. zaten diğer sayfada iç döngüde olacak yine çakıştırmadan diğer sayfalardan o verileri alıp bastırıp veritabanına kaydetmeyi göstereceğim.

şimdi döngümüzün için sırayla veriyi işleyeceğiz açıklaya açıklaya gideceğim..

for ($anasayac = 0; $anasayac <= count($ara)-2; $anasayac++ ) { // değişkenimizi kurduk
$baslik=arayi_al($ara[$anasayac],'<title><![CDATA[',']]></title>'); // $ara dan sayac hangi değerdeyse yani hangi konunun verisini çekiyorsa onun başlığını çekiyor
$url=arayi_al($ara[$anasayac],'<link>','</link>'); // $ara dan sayac hangi değerdeyse yani hangi konunun verisini çekiyorsa onun urlsini çekiyor
$resim=arayi_al($ara[$anasayac],'<img src="','"'); // $ara dan sayac hangi değerdeyse yani hangi konunun verisini çekiyorsa onun resmini çekiyor
$aciklama=arayi_al($ara[$anasayac],'<td width="100%">','</td>'); // $ara dan sayac hangi değerdeyse yani hangi konunun verisini çekiyorsa onun açıklamasını çekiyor

// şimdi çektiğimiz verileri görelim bakalım ne gelmiş ne gitmiş..
echo $baslik[0].'<br>';
echo '<img src="'.$resim[0].'" alt="" /><br>';
echo $url[0].'<br>';
echo $aciklama[0].'<br><hr>';
}
for döngümüz bu hali aldı açıklamaları da gerekli yerlere yazdım şimdi bu echo ile bastıracağımıza veritabanınada bastırabilirdik yada aldığımız url verisini tekrar CURL işlemine tabi tutup bu sayfanın kaynağını alıp konunun tam postunu da alabilirdik. Şimdi php ile bot yapımı hakkındaki ilk makalemiz olduğu için ufak bir veri işlemi ve çekimi hakkında bilgi sahibi olduk. Diğer makalemde bu kısımdan devam edip makaleyi de çektirip, veritabanına kayıt ettirmeyi anlatacağım..

Şimdi bu makale ile ne yapabilirsiniz ?

Bu mantıkla php bilginiz varsa aldığınız verileri diğer veritabanına bastırabilirsiniz, mesela wordpress'in veritabanı mantığı hakkında bilginiz varsa, bilgiyi nasıl kayıt ettiğini biliyorsanız gidip, başlığı veritabanın başlık kısmına içeriği içerik kısmına girdiğinizde otomatik olarak wordpress'e atanmış olur.

Diğer makalelerimizde bahsedeceğim konular, botu otomatikleştirme, rssden veri geldiği anda siteye ekleme. Çektiği bir makaleyi tekrar çekmemesi için ne gerekli nasıl bi mantık gerekli ve kodlarıyla diğer makalemizde görüşmek üzre!

Botun çalışır direk hazır armut piş azıma düş olayı için burdan indirebilirsiniz çalışır halinede burdan ulaşabilirsiniz..

Hakan Bulut
http://www.kodara.com/php-ile-bot-yapmak.html

editöründen kaynaklanan problemden dolayı r10 da linkleri veremedim linklere gitmek icin kod araya gidin ordan bakın dosyayı indirin.

Kaynak belirterek paylaşım yaparsanız sevinirim, paylaşın yayılalım dağılalım.. KodAra