RSS

PHP bot yapımı

75 19 Haziran 2010 ~ Musa Avcı — Orta

İnternette otomatik olarak programlandıkları amaç üzerine bir çok adrese ve içeriğe ulaşıp değerlendiren, kullanan, saklayan veya yayınlayan inter robotlarına bot denir.

PHP’de bot yapmak gayet basit ve eğlencelidir. Günümüzde en çok başka sitelerden içerik (ç)almak amacıyla kullanılan botlar bir çok işe yarar ve harika fonksiyonları vardır.

Örneğin meteoroloji sitesinden bir PHP botu yardımıyla hava durumu bilgilerini veya borsa sitelerinden döviz kurlarını çekip kendi sitenizde en güncel şekilde yayınlayabilirsiniz.

PHP ile site içeriklerine ulaşmak

Bu işi yapmak için en basitinden file_get_contents() fonksiyonuna sahibiz. İçerisine yazazacağımız ilk parametredeki adrese girip kaynağı bir değişkene yüklememizi ya da ekrana yazdırmamızı sağlar.

$site = "//www.phpr.org";
$icerik = file_get_contents($site);
echo $icerik;

Bu örneği çalıştırdığımızda file_get_contents() fonksiyonu sayesinde //www.phpr.org adresine girip sitenin kaynağına ulaşıp o kaynağı ekrana yazdırdık.

Sitelere ulaşmanın bir başka yolu yolu ise curl fonksiyonlarıdır. Curl fonksiyonları sayesinde bir adrese girmekle kalmayıp aynı zamanda girilen adrese form verileri gönderebiliriz ve kullanıcı girişi yapabiliriz. Yani PHP’de curl sayesinde sitelere aynı bir gerçek kullanıcıymış gibi, bir browserda gezer gibi girebiliriz.

Benim hazırlamış olduğum curl fonksiyonu ile istediğiniz adrese POST metodunda veri gönderebilirsiniz:

function curl($url, $post=false)
{
	$user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6';
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_POST, $post ? true : false);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $post ? $post : false);
	curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
	$icerik = curl_exec($ch);
	curl_close($ch);
	return $icerik;
}

Bu fonksiyonu aynı file_get_contents fonksiyonu gibi kullanabilirsiniz. Eğer bir post verisi gönderecekseniz 2. parametreyi “kullanici=musa&sifre=123456” şeklinde kullanmanız gerekecek.

echo curl("//www.phpr.org/wp-login.php", "user_login=kullanici&user_pass=sifre");

Bu örnek kullanımda kendi sitemizin paneline giriş yapmak için kullanıcı adı ve şifremizi postlamış olduk. Doğru bilgileri yazdığımızda curl fonksiyonu sayesinde PHP üzerinden panelimize de ulaşabiliriz.

PHP botu ile belirli içerikleri alma

Sitelerin içeriklerine direkt olarak ulaştıktan sonra istediğimiz kısımdaki değeri ve içeriği almak için öncelikle bir ara belirlemeliyiz. Sitenin kaynak kodunu inceleyip ayırt edici bir aralık bulmalıyız.

Ben örnek bir içerik sunacağım, ve bu örnek içerikten istediğimiz kısmı alacağız. Metereoloji sitesinin İstanbul için verdiği sonuçların bulunduğu kısmın kaynak kodu aşağıdaki gibi:

<tr>
	<th id="ctl00_mpBody_thmGun1" class="arkaTrh">20 Haziran Pazar</th>
	<td id="ctl00_mpBody_thmMin1" class="minS">21</td>
	<td id="ctl00_mpBody_thmMax1" class="maxS">30</td>
	<td><img id="ctl00_mpBody_imgHadise1" title="PARÇALI BULUTLU" src="../FILES/imgIcon/99/a1-25x25-gif/-25.gif" alt="PARÇALI BULUTLU" style="border-width:0px;" /></td>
	<td id="ctl00_mpBody_thmNemMin1" class="minN">59</td>
	<td id="ctl00_mpBody_thmNemMax1" class="maxN">93</td>
	<td id="ctl00_mpBody_thmRuzgarYon1"><img src="../FILES/imgIcon/ruzgar/1/1.gif" alt="Kuzeydoğudan" title="Kuzeydoğudan" /> </td>
	<td id="ctl00_mpBody_thmRuzgarHiz1">18</td>
	<td id="ctl00_mpBody_gcmMin1" class="arkaGcm minSgcm">11.4</td>
	<td id="ctl00_mpBody_gcmMax1" class="arkaGcm maxSgcm">32.2</td>
	<td id="ctl00_mpBody_gcmMinOrt1" class="arkaGcm minSgcm">16.7</td>
	<td id="ctl00_mpBody_gcmMaxOrt1" class="arkaGcm maxSgcm">25.5</td>
</tr>

Çok karışık bir kaynak kodu gibi görünüyor ama aslında tam bizim aradığımız gibi bir sonuç. Farkettiyseniz tüm değerler ayırt edilebilecek belli bazı elementlerin arasında. Örneğin tarih class=”arkaTrh”> ile </td> arasında.

Bir içerikte istediğimiz aralığı almak için yine curl gibi hazır bir fonksiyon kullanacağız. Bu fonksiyonu kopyala-yapıştır yaparak sizde kullanabilirsiniz.

function ara($bas, $son, $yazi)
{
	@preg_match_all('/' . preg_quote($bas, '/') .
	'(.*?)'. preg_quote($son, '/').'/i', $yazi, $m);
	return @$m[1];
}

Bu ara fonksiyonuda basit bir şekilde aralık içerisindeki değeri bize verir. Kullanımı için 3 parametre vardır. İlk parametre aralığın başı, ikinci parametre aralığın sonu, üçüncü parametre ise araştırılacak içerik.

$icerik = file_get_contents("//www.phpr.org");
$baslik = ara("<title>", "</title>", $icerik);
echo $baslik[0];

Bu örnekte sitemizin kaynak kodlarına ulaşıp <title>…</title> arasını yani sitemizin başlığını almış olduk ve ekrana yazdırdık. Değerin yüklendiği değişkene [0] dememizin sebebi ilk yakalanan aralığı almamız. Eğer benzer aralıklardan daha fazla var ise onlarıda dizinin diğer elemanları olarak ekleyecektir. Örneğin birden fazla title aralığı olsaydı diğer sonuçlarda [1], [2] şeklinde diğer dizilere sıralanacaktı.

Gelelim bu fonksiyonu bahsettiğimiz meteroloji sitesinde uygulamaya:

$site = "http://www.meteor.gov.tr/tahmin/il-ve-ilceler.aspx?m=ISTANBUL";
$icerik = file_get_contents($site);
$alt_sicaklik = ara('class="minS">', '</td>', $icerik);
$ust_sicaklik = ara('class="maxS">', '</td>', $icerik);
echo 'İstanbul hava durumu: ' . $ust_sicaklik[0] . '/' . $alt_sicaklik[0];

Sitede alt ve üst sıcaklıkların bulunduğu değerlerin aralığını bulup ara fonksiyonumuz sayesinde aralığı alıp ekrana yazdırdık. Sonuç olarak ekranda İstanbul hava durumu: 21/30 şeklinde bir çıktı alacağız.

Kısaca bot içerik alma mantığı sitelerdeki içeriklerin ayırt edici aralıklarını bulup o kısmı almaya dayanmaktadır. Bunların dışında hayal gücünüzü kullanarak daha bir çok mantık üretebilir ve her türlü içeriğe ulaşıp dilediğiniz botları kodlayabilirsiniz.

Bir başka PHP serüveninde görüşmek üzere hoşçakalın.

Etiketler:

Yazılanlar ilgini çektiyse, yenilerinden haberdar olmak için e-mail bültenine abone olabilirsin.

"PHP bot yapımı" yazısı için 75 yorum yapılmış.

  1. Yücel dedi ki:

    Şu smarty vb tema motorları nasıl kullanılıyor acaba ?

  2. BuLL MeRT dedi ki:

    Çok işime yaradı teşekkürler

  3. BuLL MeRT dedi ki:

    Sayın Musa madem anlatmamızı istediğiniz konu varsa diye sordunuz 🙂 mesela çektiğimiz konuyu sitemizdeki herhangi bir kategoriye nasıl gönderebiliriz ya da dbase e nasıl aktarırız küçük bir örnekle pekiştirebilirseniz çok yararlı olur ama bunu siz kendiniz bulmalısınız böyle daha sağlıklı olur diyedebilirsiniz tabbiki. 🙂

  4. BuKiDesign dedi ki:

    çok güzel anlatım hocam. Çok teşekkürler. Emeğinize, yüreğinize sağlık..

  5. Halil SAĞLAM dedi ki:

    Çok teşekkür ederim, tam aradığım bir makale.

  6. Mehmet Çağatay dedi ki:

    Bot yapmaktan anlamam, yapılışı zevkli midir bilmem ama yazı hoşuma gitti, Okurken zevk aldım. Deneyeceğim..

    Ayrıca takipçinizim, WordPress için gelişmiş bir bot yapımını da anlatırsanız sevinir, uygulmak lazım 🙂

  7. Bir Dost dedi ki:

    Php ile xml çözümlemek için uğraşıyordum sonra olmadı, hata verip durdu sürekli. Canım sıkıldı internette dolanıyordum yazınızı okuyunca bot mantığı ile xmlyi çözümlemek aklıma geldi, olayı hallettim şu anda bitirmek üzereyim. Teşekkürler :))

  8. Nurettin dedi ki:

    Güzül bir döküman tebrikler

  9. Hüseyin Babuç dedi ki:

    Güzel anlatım olmuş teşekkürler.

  10. frekans dedi ki:

    Çok teşekkürelr aynısını yapamasakda bot hakkında bilgi edinmiş olduk mantıgını kavradık teşekkürler

  11. Phpci dedi ki:

    Hava durumunu almak istediğimde hata verdi

    ( ! ) Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in

  12. Phpci dedi ki:

    Evet halledeli çok oldu 🙂 makale içinde ayrıca teşekkür ederim.

  13. mehmet dedi ki:

    peki şöyle bir içerikten nasıl veri alabiliriz

    StreamTitle=’ŞARKICI – ŞARKI’&StreamUrl=’http://www.xxxxxx.com’

    ben sadece ŞARKICI – ŞARKI kısmını almak istiyorum ve belli bir html tag ı yok… sayfadaki tek veri StreamTitle=’ŞARKICI – ŞARKI’&StreamUrl=’http://www.xxxxxx.com’

    • Musa Avcı dedi ki:

      bu yazıdaki ara fonksiyonunu kullanıp StreamTitle=’ ve ’&StreamUrl arasını alarak istediğiniz kısmı alabilirsin.
      kod örneği vermek gerekirse de:

      $baslik = ara(&quot;StreamTitle='&quot;, &quot;'&amp;StreamUrl&quot;, $icerik);
      echo $baslik[0];
      

      ekranda istediğiniz kısım yazar.

  14. mehmet dedi ki:

    çok teşekkür ederim verdiğiniz bilgi için…

  15. ozan şelte dedi ki:

    peki ben 7-8 satırlık bir alanı çekmek isterken neden boş gösteriyor

    • Musa Avcı dedi ki:

      evet, örnekteki ara fonksiyonu bazen yeni satırlarda sıkıntı çıkartabiliyor. bu sorunu gidermek için arama yapılacak içeriği önce str_replace fonksiyonu ile “n” “r” “t” karakterlerini sildirin, daha sonra ara fonksiyonu ile istediğiniz aralığı almayı tekrar deneyin.

    • Musa Avcı dedi ki:

      örnek vereyim;

      $icerik = file_get_contents('http : //w ww.site.com/sayfa');
      $icerik = str_replace(array(&quot;n&quot;, &quot;r&quot;, &quot;t&quot;), '', $icerik);
      $bol = ara('başlangıç', 'kapanış', $icerik);
      // ...
      
  16. İrfan dedi ki:

    Merhabalar. ben şu kodda yazılı bulunan 2. gömme fritözü almak istiyorum. Normalde title=”, – en ucuz ile de alabileceğimin farkındayım ancak bu sadece bir örnek olduğundan sorumun bir cevabı varsa bunu öğrenmek istiyorum.
    Kodda örneğin title=”Gömme fritöz – en ucuz fiyatlar”> koyu kısım değişken diyelim, sürekli değişiyor. Bense kodda
    title= kısmını belirttikten sonra “Gömme fritöz – en ucuz fiyatlar kadar olan kısmı atlatıp “> şu koddan itibaren devam etmesini ve kodu ile de bitirmesini, yani 2. Gömme Fritöz yazısını çekmesini istiyorum. Bunu nasıl yapabileceğim konusunda bilginiz var mı?


    title="Gömme fritöz - en ucuz fiyatlar">Gömme fritöz

  17. kamil dedi ki:

    merhaba benim bir sorum olacak internette 2 gündür arıyorum ama bir türlü gerekli kodlar hakkında bilgi bulamadım sorum şu bir link ekleme botu yapmak istiyorum açmak istediğim sitenin içindeki bütün “http://” ile “/” arasındaki domainleri alacak ve oluşturduğum veritabanına kayıt edecek verdiğiniz kodları denedim ama sadece w3.org sitesini yani head takısı içindeki w3.org adresini gösteriyor benim istediğim body içerisindeki bütün http://www.bilmemnesitesi.com,net,org gibi adresleri ekleyecek eğer mevcut ise o site bir sonraki linki arayıp ekleyecek acaba böyle örnek bir kod paylaşma şansınız varmı arkadaşlar?

  18. […] daha iyi kavramak için muhakkak gerekliydiler.Anlattığım için pişman değilim ama http://www.phpr.org/php-bot-yapimi/ adresinde okuduğum makale çok beğenimi aldı.Onun için @preg_match_all ve hazır bir fonksiyon […]

  19. Mahmut AYDIN dedi ki:

    Güzel bir makale idi tebrik ederim.Kullandığınız ara fonksiyonunu kendi web sitemde bir makalemde kaynak vererek kullanıyorum.Bilginize…

  20. Melih dedi ki:

    Teşekkürler Musa Avcı

  21. fatih dedi ki:

    çok güzel anlatım olmuş teşekkür ediyorum.
    fakat benimde şöyle bir sorum olacak size ben mesela bir sitenin sitemap’ini çekip, atıyorum 10 saniyede bir sırayla konulara yorum yazmak istiorum.
    bu dediğimi curl ile nasıl yapabilirim. yada böyle birşey yapılabilirmi php’de onu öğrenebilirmiyim ?

  22. Çağrı dedi ki:

    Güzel bir makale yazmışsınız, çok teşekkürler.

  23. SEO dedi ki:

    Botlar içerik üretmek ya da paylaşmak için güzel bir yöntem ancak art niyetli webmasterlar içinde adeta bir maden değerli bilgiler için çok teşekkürler

  24. Biyoloji dedi ki:

    Güzel anlatım teşekkür ederim..

  25. Kerim Kaan dedi ki:

    Merhaba,
    Mesela Vikipedi’de ki bir başlığın sadece yazılarını almak istiyoruz,kod yapısına baktım fakat anlattıklarınıza göre bir şablonu bulamadım kodların arasında,nasıl yapabiliriz bunu?

  26. ersin yilmaz dedi ki:

    Emeginize saglik guzel yazi 😉

  27. CEO dedi ki:

    Ben bir site için bot yapmak istiyorum.Yapacağım bot şu şekilde olacak.Ana sayfadaki tüm linkleri alacak.Kullanıcıya bir kelime girdirip o linklerin içinde olan kelimeyle uyuşuyorsa sitenin adresine o linki de ekleyecek.ve son olarak son bulunan linkte işlem yapılacak.Zor değil ama içinden çıkamadım.Yardımcı olursanız sevinirim

  28. ebuyusuf dedi ki:

    elinize sağlık.

  29. webmaster forumu dedi ki:

    çok güzel paylaşım olmuş teşekkürler

  30. R dedi ki:

    Session olayını göremedim oturum açma işlemi nasıl oluyor ? Bir siteden veri çekip başka bir siteye eklerken sıkıntılı olmaz mı ? Güzel bir döküman teşekkürler 🙂

  31. gökhan dedi ki:

    faceden veri çekmek istiyorum ?

  32. aydin dedi ki:

    curl ile ilgili daha detaylı bir anlatım bekliyorum. her parametrenin ne işe yaradığını detaylıca anlatacak bir konu olsa süper olur. tabi dezavantajları ile birlikte. teşekkürler iyi çalışmalar…

  33. google sıra bulucu dedi ki:

    paylaşım için teşekkürler gerekli bilgiler var makalede..

  34. Merhaba,

    Çok güzel bir konu anlatımı olmuş elinize sağlık. Sormak istediğim bir soru var cevaplarsanız sevinirim;

    Bu anlatımınız ile bir sitenin form verilerine ulaşabilirmiyiz?

  35. seda dedi ki:

    Ellerinize sağlık, çok yararını gördüm…

  36. Hocam verileri cektim herşeyi hallettim veritabanınada kaydettim. Yalnız şöyle bir sıkıntı var Benim verilerim 2tabloda birinci tabloda kelimeler var 2tabloda ise o kelimelere yüklediğim anlamlar. Benim mantık şöyle 1tabloda kelimeyi aratıyorum 2tabloya bağlayip bulduğum kelimenin ıd si ile eşlenen sorguları çektiriyorum. Bu botta iki ayrı tabloya eklerimde sorun çektiğim sorguları nasıl eşleştirecem aynı ıd ile kayıt ettirecem bi yardımcı olabilirmisin?

  37. gökhan dedi ki:

    Daha gelişmiş bir örnek daha verebilirmisiniz ?

  38. ibrahim dedi ki:

    elinize sağlık.

  39. Fatih dedi ki:

    Musa Üstadım, bot yapacağımız site flash tabanlı bir site ise nasıl yapcaz..

  40. mert dedi ki:

    bazı siteler veri çekmesin site bazı önlemler alıyor onları nasıl geçicez peki hotlink koruması ilk başta geliyor refererde bile aşamıyorum adamların embed kodları bile calısmıyor sadece kendi sitelerine dagıtmıslar embed kodlarını alamıyorum sadece sitenin üzerinden girebiliyorum embed koduna ama bu sefer o sitenin url’siyle referer gönderdimi yine acılmıyor 😀

  41. Selçuk dedi ki:

    Teşekkürler çok işime yaradı .

  42. Yiğit dedi ki:

    Eyvalah patron sağol.

  43. kemal dedi ki:

    yorum kısmını en son tarih başa gelecek şekilde sıralamanız bence daha doğru olurdu.
    teşekkürler

  44. fermayil dedi ki:

    hocam denedim ama çalıştıramöadım yaw

  45. deniyorum dedi ki:

    deniyorum hadi bakalım

  46. Gökhan dedi ki:

    Çok başarılı bir anlatım olmuş. Kolay gelsin.

  47. Gökhan Azar dedi ki:

    Musa bey yazınız için teşekkür ederim. benim şöyle bir sorum olacak.
    İnternet sitemi belirli aralıklarla kontrol edecek ve çalışıp çalışmadığını bana mail atacak. böyle bir bot hazır var mıdır acaba?

  48. Musa Can dedi ki:

    Merhaba hocam benim bir sorum var 3 gündür aralıksız uğraştım fakat çözemedim sorum tam olarak şöyle sizin verdiğiniz post metodlu curl ile örneğin bir siteye giriş yapıp sonuçları listeleyecek ama bir türlü verdiğiniz ikinci kod ile uyuşturamadım yardımcı olursanız sevinirim. Arayıştayım… İyi çalışmalar…

  49. Alperen Özdemir dedi ki:

    Merhaba hocam , orneksite.com/fonksiyon.php?=https://www.youtube.com/watch?v=BcL—4xQYA şeklinde bir sayfa oluşturup soru işaretinden sonra olan kısmı http://www.youtube-mp3.org adresine postlayıp çıkan mp3 linkini yazdırmak isitiyorum çok kafa patlattım fakat yapamadım boş vaktinizde bakarsanız sevinirim mail adresimi sürekli kontrol ediyorum , teşekkürler.

  50. PHP Dersleri dedi ki:

    Bu makalenin bir benzerini sizden etkilenerek ben de yazdım.PHP bot yapma ancak ben örnek üzerinden gittim.Bu arada çok güzel yazmışsınız elinize sağlık.Parçalama mantığını anlatmanız çok iyi olmuş.

  51. barış dedi ki:

    mrb. konu da sayfalama ile ilgili bilgi yok. Rica etsem, ufak bir örnek ekleyebilirmisiniz?.

  52. night dedi ki:

    Merhaba, içerik almak istediğimiz alan javascript tagları arasında listelendiğinden yani tarayıcı javascripti görünce veri listeleniyor bunu bota nasıl uyarlayabiliriz

  53. Temizlik dedi ki:

    Mrb. sitede hava durumu kodunu modul olarak nasıl ekleyebiliriz

  54. Talhacan dedi ki:

    Anlatım için teşekkürler
    Bir sorum olacak bu file_get_contents() fonksiyonunu kullanırken sitedeki tüm veriyi değişkene atayıp istediğimiz veriyi bölerek alabiliyoruz ancak bu şekilde çalışması biraz yavaş oluyor daha hızlı bir şekilde veri alma yöntemi var mı yada sadece istediğimiz veriyi çekecek başka bir fonksiyon var mı şimdiden teşekkürler

  55. Abdullah KÜÇÜK(MSRoyal) dedi ki:

    Tek tek her konunuz için teşekkürler staj görüyorum ve sizin konularınızla çalışıyorum php yi sevmemin sebeplerinden birisiniz.
    Başarılar!!! 😀

  56. Edit:Tek tek her konunuz için teşekkürler staj görüyorum ve sizin konularınızla çalışıyorum php yi sevmemin sebeplerinden birisiniz.
    Başarılar!!! 😀

  57. sohbet dedi ki:

    Şahane bir döküman. Ellerinize sağlık, gerçekten çok kaliteli bir paylaşım yapmışsınız..

    İyi çalışmalar.

  58. Uğur dedi ki:

    Ben aşağıdaki hatayı alıyorum çözümü nedir acaba ?
    Fatal error: Call to undefined function ara() in

  59. TeknolojikBlog dedi ki:

    hmm bu işi sevdim, ama çalmak yerine değil dediğiniz gibi hava durumu ya da döviz kurları gibi bilgiler için denemeye başlıyorum hemen, teşekkürler bilgi aktarımızınız için

  60. Şakir Koç dedi ki:

    asp bir sayfaya login olmam gerekiyor php bot ile asp sayfasınada giriş yapabilirmiyim? 2. soru olarak ben dosyaları indirmek istediğim siteye kendi browseremdan login oluyorum (yani bir session açıyorum) ama dosyaları bu siteden indiremiyorum mutlaka sizin gösterdiğiniz şekilde mi login olmam gerekiyor. şimdiden teşekkürler

  61. ömer faruk dedi ki:

    Merhaba hocam öncellikle emeğiniz için çok teşekkür ederim. Ufak bir sıkıntım varda. Ben o ara fonksiyonu anlayamadım. o kadar sembol kullandınız ki kafam allak bullak oldu. Basit bir şekilde anlatabilir misiniz?

  62. Bnymn dedi ki:

    Yapmak istediğim anlık değişen bir veriyi çekmek, onu güncel şekilde nasıl çekebilirim?

  63. izleyici dedi ki:

    print "iyi anlatim."

  64. volkan dedi ki:

    Ne yazık ki veriler artık çekilemiyor… sanırım veriler korumalı hae getirilmiş…

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir