PHP bot yapımı
İ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.
Yazılanlar ilgini çektiyse, yenilerinden haberdar olmak için e-mail bültenine abone olabilirsin.
Şu smarty vb tema motorları nasıl kullanılıyor acaba ?
Çok işime yaradı teşekkürler
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. 🙂
çok güzel anlatım hocam. Çok teşekkürler. Emeğinize, yüreğinize sağlık..
Çok teşekkür ederim, tam aradığım bir makale.
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 🙂
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 :))
Güzül bir döküman tebrikler
Güzel anlatım olmuş teşekkürler.
Çok teşekkürelr aynısını yapamasakda bot hakkında bilgi edinmiş olduk mantıgını kavradık teşekkürler
Hava durumunu almak istediğimde hata verdi
( ! ) Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in
syntax error yazım hatası anlamına geliyor. bir yerlerde bir ifadeyi yanlış yazmış olabilirsin. ama sanırım hallettin.
Evet halledeli çok oldu 🙂 makale içinde ayrıca teşekkür ederim.
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’
bu yazıdaki ara fonksiyonunu kullanıp StreamTitle=’ ve ’&StreamUrl arasını alarak istediğiniz kısmı alabilirsin.
kod örneği vermek gerekirse de:
ekranda istediğiniz kısım yazar.
çok teşekkür ederim verdiğiniz bilgi için…
peki ben 7-8 satırlık bir alanı çekmek isterken neden boş gösteriyor
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.
bir örnak verebilir misiniz? n-r-t sildirince yine olmuyor.
örnek vereyim;
öyle de olmadı bn de explode fonksiyonuyla çözdüm teşekkürler
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
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?
[…] 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 […]
Güzel bir makale idi tebrik ederim.Kullandığınız ara fonksiyonunu kendi web sitemde bir makalemde kaynak vererek kullanıyorum.Bilginize…
Teşekkürler Musa Avcı
ç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 ?
spama hayır! 😀
Güzel bir makale yazmışsınız, çok teşekkürler.
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
Güzel anlatım teşekkür ederim..
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?
Emeginize saglik guzel yazi 😉
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
elinize sağlık.
hmm güzel
çok güzel paylaşım olmuş teşekkürler
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 🙂
faceden veri çekmek istiyorum ?
bunun için Facebook’un apileri var, şuradan inceleyebilirsin.
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…
paylaşım için teşekkürler gerekli bilgiler var makalede..
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?
Ellerinize sağlık, çok yararını gördüm…
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?
Daha gelişmiş bir örnek daha verebilirmisiniz ?
elinize sağlık.
Musa Üstadım, bot yapacağımız site flash tabanlı bir site ise nasıl yapcaz..
chrome geliştirici aracından network tabına gelip flashın arkaplanda hangi sayfalara istek yaptığını bulabilirsiniz
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 😀
Teşekkürler çok işime yaradı .
Eyvalah patron sağol.
yorum kısmını en son tarih başa gelecek şekilde sıralamanız bence daha doğru olurdu.
teşekkürler
hocam denedim ama çalıştıramöadım yaw
deniyorum hadi bakalım
Çok başarılı bir anlatım olmuş. Kolay gelsin.
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?
pingdom.com tam olarak bu işi yapıyor.
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…
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.
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ş.
mrb. konu da sayfalama ile ilgili bilgi yok. Rica etsem, ufak bir örnek ekleyebilirmisiniz?.
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
Mrb. sitede hava durumu kodunu modul olarak nasıl ekleyebiliriz
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
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!!! 😀
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!!! 😀
Şahane bir döküman. Ellerinize sağlık, gerçekten çok kaliteli bir paylaşım yapmışsınız..
İyi çalışmalar.
Ben aşağıdaki hatayı alıyorum çözümü nedir acaba ?
Fatal error: Call to undefined function ara() in
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
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
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?
Yapmak istediğim anlık değişen bir veriyi çekmek, onu güncel şekilde nasıl çekebilirim?
print "iyi anlatim."
Ne yazık ki veriler artık çekilemiyor… sanırım veriler korumalı hae getirilmiş…
Verileri çekmek için güzel bir anlatım. Teşekkürler