Konuyu Oyla:
  • Toplam: 4 Oy - Ortalama: 3
  • 1
  • 2
  • 3
  • 4
  • 5
   
Konu: PHP Bot Yapımı
#H4CK4L
*
avatar
#R00T
Durum: Çevrimdışı
Seviye Puanı: 43
Yaşam Puanı: 1,050 / 1,050
Deneyim: 3 / 100
Rep Sayısı: 1042
Mesaj Sayısı: 2999
Üyelik Tarihi: 04.05.2013
      
Yorum: #1
PHP Bot Yapımı
28.09.2013 11:24
Arkadaşlar bu konudaki anlatımları okuyarak siz de kendi PHP botunuzu yapabilirsiniz - yazabilirsiniz. PHP bot yazımı için gereken tek şey biraz PHP ve mySQL bilgisi.

PHP bot yapımı genelde localhostta yani local serverinınızda olur bu yüzden kendi bilgisayarızda WAMP kurulu olması ilk gereksinimimiz, daha sonra istediğiniz gibi PHP bot yazabilirsiniz.

Şimdi anlatıma geçelim:

Öncelike şunu belirtelim tüm ayrıntılar anlatılmayacaktır çünkü bu işten para kazanan arkadaşlarımız var. Ancak sadece bu anlatım ile çok güzel bir şekilde kendi PHP Bot'unuzu yazabilirsiniz. Örneğin, Ben bir fıkra sitesinden kendi siteme fıkraları eklemek istiyorum.

Bunu nasıl yapacağım? Önce şunlara bakalım:


  1. Fıkraların birikeceği veritabanımı oluşturuyorum, ve ona id,baslik,metin,tarih olmak üzere 4 sütun ekliyorum.
  2. Fıkraları seçeceğim siteye giriyorum ve bir fıkra açıyorum. Linke bakıyorum ;
    • Örneğin linkimiz şöyle olsun : ornekfikrasitesi.com/fikra.php?id=13
      veyahut link şöyle olabilir ornekfikrasitesi.com/fikra-basligi-13.html

      Burada dikkat etmeniz gereken husus ;

      Linkte gördüğüm 13 sayısını (veya oradaki sayı her ne ise) tarayıcıdan değiştirip 14 veya 15 yapıp enter'a basınca, karşıma yeni bir fıkra geliyor ise, sistem fıkraları linkte gördüğümüz o numaraya göre çekiyor demektir.

      Wordpress botları bu mantıkla çalışır, siteadi.com/p?=1 linkindeki 1'i silip yerine 5 yazar enter'a basarsanız 5. içeriğe ulaşırsınız.

      Sistemin bilgileri çektiği sayıyı da tespit ettiğimize göre devam ediyoruz.

      Sitedeki bilgiler çekilmeye müsait mi?

      Bazı sunucular dosyaları dışarıdan almaya izin vermezler. Bunu deniyoruz
      Aşağıdaki php kodumuz, bir sitedeki bilgileri çekmeye yarar :

      PHP Kod:
      $site=file_get_contents("http://www.ornekfikrasitesi.com/fikra.php?id=13"); 

      Yukarıda görmüş olduğunuz kod ile 13 numaralı fıkranın bulunduğu sayfanın kaynak kodlarını çektim. Şimdi bunları yazdırma kodunu ekliyorum :

      PHP Kod:
      echo"$site"

      Tabii ki başına ve sonuna <? ?> eklemeyi unutmadığım php sayfamı kaydedip gerek lokalhostta gerekse hostuma atıp çalıştırıyorum. 2 ihtimal var :
      • Çektiğim adresteki tüm veriler ekrana gelecek.
      • Ya da ekrana fonksiyonun sağlıklı çalışmadığı ile ilgili hata alacağım.
        • Eğer ilk seçenekteki gibi ekrana bilgileri bastırmayı başardıysanız, diğer adıma geçiyoruz.

          Yok karşıdaki site bilgileri vermiyor, ekrana hata geliyorsa, o siteden veri alamıyoruz

          Diğer adım :
          Kaynak kodlarından bana gerekli olan yerleri bulma

          Fıkraları çekmek istediğim sayfaya sağ tıkladım ve kaynak kodlarını görüntüle dedim. Bana gerekli olan yerleri arıyorum. Buralar nereler mi? Fıkra başlığı ve fıkra metnini çekmek istiyorum.

          HTML kodlarında şöyle bir ibare gördüm :

          PHP Kod:
          <title>Örnek Fıkra Başlığı</title

          Sitenin title kodları arasında fıkranın başlığı işlenmiş. Demek ki buradan fıkra başlığını çekebilirim. Çünkü hangi fıkrayı açarsam açayım <title> ile </title> kodları arasında fıkra başlığı olacak.

          Fıkra metnini ise farzedelim ki şöyle biryerde buluyorum :

          PHP Kod:
          <!-- fikra -->Fıkra Metni<!-- / fikra --> 

          Fıkra metnini de buradan çekebilirim diyorum ve diğer adıma geçiyorum :
          Bulduğum verileri nasıl çekerim ?

          Bu aşamada, php kodumuz devreye giriyor :

          PHP Kod:
          $baslikalan='#<title>(.*?)<\/title>#si'
          preg_match($baslikalan,$site,$baslikfonksiyon); 

          $baslikalan = verileri çekeceğim yeri seçiyorum
          $site = verileri çektiğim siteyi tanımladığım değişken
          $baslikfonksiyon = başlığı benim için çeken fonksiyonun son adı

          Yukarıdaki kodlarda <title> ve <\/title> yazan yerlere, almak istediğim veri hangi kodlar arasında ise onu yazıyorum. Yukarıda başlığı çekmek için title kodlarını yazdım. aradaki (.*?) karakterleri, çekilecek olan verinin bulunacağı yeri gösterir.

          Başlığı böyle çektim, fıkra metnini de aynı yöntemle çekiyorum :

          PHP Kod:
          $fikraalan='#<!-- fikra -->(.*?)!-- \/ fikra -->#si'
          preg_match($fikraalan,$site,$fikrafonksiyon); 

          Yukarıda da başlığı çektiğim aynı mantıkla fıkra metnini çektim.

          Neden / yerine \/ yazdım ?

          PHP'de kodların karışmaması için bazı karakterlerin önüne \ koymanız gerekebilir. Yukarıda anlattığım kodlarda kaynak kodundan bölümler yerleştirdiğiniz alanda bulunan çift tırnaklara ( " ) ve bölme işaretlerinin önüne ( / ) bahsettiğim karakteri ( \ ) koymazsanız, kodlar size hata verecektir. Bu konuya dikkat edilmelidir.

          İki alanı da çektim, şimdi onları bir değişkene atıyorum, nasıl mı ?

          PHP Kod:
          $fikra=$fikrafonksiyon[1];
          $baslik=$baslikfonksiyon[1]; 

          Yukarıdaki cümlelerde, verilen kodlar arasında bulunan ilk değişkenleri $fikra ve $baslik değişkenlerine atadım. Artık fıkram ve başlığım bir değişken olarak elimde.

          Hadi deneyelim :

          Fıkramı ve başlığımı ekrana yazdırıyorum :

          PHP Kod:
          echo"$baslik<br>$fikra"

          Php dosyamı kaydedip çalıştırıyorum, ekrana fıkram ve başlığım sorunsuz gelirse, "oh bu bot da bitti" diyorum, gelmediyse; kaynak kodları ve php sayfamı açıp nerede hata yaptım diye bakıyorum.

          Ekrana fıkra ve başlık bastırıldı mı? Diğer adım :

          Bulduğum verileri veritabanıma nasıl kaydederim ?

          Şimdi yapacağımız şey, 2 değişkeni veritabanına kaydetmek. Bunu yapmak için bot yazmayı bilmeye gerek yok, php ve mysql bilsem yeter.
          Veritabanı bilgilerimi içeren sayfayı include ediyorum :

          PHP Kod:
          if($baslik=="" || $fikra==""){
          echo
          " Böyle bir fıkra yoktur.";
          }else{ 

          Dikkat : yukarıdaki if döngüsünün sonundaki ELSE'i kapatmadık, else if kullanamıyorum çünkü veritabanına bir soru sormam lazım. O döngüyü nerede kapatacağımız (sonuna } ekleyeceğimiz) aşağıda yazmaktadır.

          Bu soruyu önce sorarak else if de kullanabilirsiniz ama ben öğretim amaçlı çalıştığım için böyle yapmayı uygun buldum.

          Veritabanına soracağım soru :
          Bu fıkranın aynısını kaydettik mi?
          - Ya o fıkra önceden eklendiyse? Bu fıkrayı tekrar çekmemeliysem?
          Hemen engelliyoruz :
          (Yukarıdaki kodun hemen arkasından devam ediyoruz )

          PHP Kod:
          // Başlığı şimdiki fıkrayla aynı fıkraların sayısı :
          $fikrasayi=mysql_num_rows(mysql_query("SELECT * FROM fikra WHERE baslik='$baslik'"); 

          Evet, artık $fikrasayi değişkenimde şu an çektiğim fıkradan veritabanımda kaç tane var, o sayıyı görüyorum.
          Eğer bu sayı 1 ise, yani fıkranın veritabanında 1 kopyası daha varsa :

          PHP Kod:
          if($fikrasayi==1){
          echo
          "Bu fıkra önceden eklenmiştir.";
          }else{
          // Artık fıkrayı yükleyebilirim, bir engel kalmadı
          $tarih=date('d/m/y'); // Tarihi de alayım 
          $fikrayukle=mysql_query("INSERT INTO fikra (baslik,metin,tarih)VALUES('$baslik','$fikra','$ta rih')");
          if(
          $fikrayukle){ //Fıkram başarı ile yüklendiyse eğer :
          echo"Fıkra başarıyla kaydedildi";


          Son olarak yukarıda bahsettiğim if döngüsünün sonundaki else'yi kapatmak için bir tanecik } koyuyoruz. Ve tamamdır.

          Artık bot.php'i tarayıcımda açtığım zaman, fıkrayı çektiğim sitedeki 13 numaralı fıkrayı veritabanıma kaydettim demektir. Tabi eğer koşullarıma uyuyorsa :heart:

          Süzgecimden geçebildiyse

          Peki Ama Ya Otomatik Olarak Çeksin İstiyorsam? Ya Elle Çekmeyeceksem?

          Evet, profesyonel botlar otomatik çalışmak zorundadır. Bir bot birkaç saatte 100bin kayıt girebilir, ama bunu elle yapamayız.

          Peki bot nasıl otomatik çalışacak ?

          İşe, çektiğimiz fıkrayı tanımladığımız sayfada bulunan sayıyı bir değişken yaparak başlayalım.

          İlk başta kodumu şöyle yazmıştım :

          PHP Kod:
          $site=file_get_contents("http://www.ornekfikrasitesi.com/fikra.php?id=13"); 

          Ama bu kod böyle kalırsa paso 13. fıkrayı çeker? Hatta çekemez çünkü aynı fıkraları kabul etmiyor. E bunu değişken kılmak lazım :

          PHP Kod:
          $id=$_GET['id'];
          $site=file_get_contents("http://www.ornekfikrasitesi.com/fikra.php?id=$id"); 

          Şimdi ne mi yaptım? $id değişkenini çektiğim site linkinin sonuna ekledim, artık botum şöyle çalışacak :

          bot.php?id=5 dersem 5 nolu fıkrayı çekecek.
          bot.php?id=26 dersem 26 nolu fıkrayı çekecek.

          Ama nasıl otomatik şekilde fıkradan fıkraya atlayacak?

          Kodum böyle idi :

          PHP Kod:
          $id=$_GET['id'];
          $site=file_get_contents("http://www.ornekfikrasitesi.com/fikra.php?id=$id"); 

          25 numaralı fıkrayı çekiyorum, hangi fıkraya gitmem lazım? 26 numaralıya. Yani $id değişkenimden 1 fazla olan sayıyı bulmam lazım. Hadi bulalım :

          PHP Kod:
          $yeniid=$id++; 

          $yeniid değişkenime, $id değerimin 1 fazlasını atadım.
          bot.php?id=5 açarsam $yeniid=6 olacaktır.
          bot.php?id=26 açarsam $yeniid=27 olacaktır.
          Şimdi html refresh (sayfa yenileme) kodumu kullanarak diğer fıkrayı çekecek olan bot.php'ye gitmek istiyorum. Nasıl mı?
          Sayfama gerekli kodu yazıyorum :

          PHP Kod:
          echo"<meta http-equiv=\"refresh\" content=\"0.1;URL=http://www.siteminadi.com/fbot.php?id=$yeniid\">"

          Bu kod ne demek?

          0.1 saniye sonra bot.php?id=X'ten bot.php?id=X+1'e geç demek.
          Yani bot.php?id=5'i açarsam 0.1 saniye sonra bot.php?id=6'ya şutla demek.

          Tabii bu kodu öyle orta yere koymuyoruz

          -Eğer Fıkra Boş Çıktıysa, beni diğer fıkraya şutla
          -Eğer bu fıkra önceden kaydedilmiş ise, beni diğer fıkraya şutla
          - Eğer bu fıkrayı kaydetme işlemin başarıyla bittiyse, beni diğer fıkraya şutla
          Yani kodu ekleyeceğimiz yerler :

          PHP Kod:
          echo"Bu fıkra önceden eklenmiştir."
          echo
          "<meta http-equiv=\"refresh\" content=\"0.1;URL=http://www.siteminadi.com/bot.php?id=$yeniid\">"// Bu satıra ekliyorum, madem fıkra önceden eklenmiş diğer sayfaya geç 

          PHP Kod:
          echo" Böyle bir fıkra yoktur."); 
          echo
          "<meta http-equiv=\"refresh\" content=\"0.1;URL=http://www.siteminadi.com/bot.php?id=$yeniid\">"// Bu satıra ekliyorum ; Madem böyle bir fıkra yok beni diğer fıkraya yolla 

          PHP Kod:
          echo"Fıkra başarıyla kaydedildi";
          echo
          "<meta http-equiv=\"refresh\" content=\"0.1;URL=http://www.siteminadi.com/bot.php?id=$yeniid\">"// Bu satıra da ekliyorum, fıkra başarı ile kaydedildiyse beni diğer fıkraya yolla 

          Arkadaşlar php bilenlerin mantığı anlayacağını düşünüyorum, yine de yazayım.

          Echo komutu ile sonucu yazdırdığım satırların altına, beni bir sonraki fıkrayı çeken bot sayfasına yollaması için gereken kodu ekliyorum. Bu sayede sayfamın işi bittikten sonra diğer fıkrayı çekmek için kendisini yeniliyor. Bunu otomatik olarak ve 0.1 saniyede yapıyor.

          Botumun Son Hali :

          PHP Kod:
          <? 
          include('ayar.php'); //veritabanıma bağlandım
          $id=$_GET['id']; //$id değişkenini get fonksiyonu ile aldım
          $site=file_get_contents("http://www.ornekfikrasitesi.com/fikra.php?id=$id"); // Fıkrayı alacağım sayfayı $id değişkeni ile çektim
          $yeniid=$id++; // $yeniid'yi $id'nin 1 fazlası yaptım
          // Başlık ve fıkramı çekiyorum :
          $baslikalan='#<title>(.*?)<\/title>#si'
          preg_match($baslikalan,$site,$baslikfonksiyon); 
          $fikraalan='#<!-- fikra -->(.*?)!-- \/ fikra -->#si'
          preg_match($fikraalan,$site,$fikrafonksiyon); 
          $fikra=$fikrafonksiyon[1]; 
          $baslik=$baslikfonksiyon[1]; 
          // Kayıt için gerekli şartları if döngüsü ile sorguluyorum
          // Bunu yaparken işlemden sonra beni diğer fıkrayı çekecek sayfaya atması için refresh kodumu ekliyorum.
          if($baslik=="" || $fikra==""){ 
          echo
          " Böyle bir fıkra yoktur."); 
          echo
          "<meta http-equiv=\"refresh\" content=\"0.1;URL=http://www.siteminadi.com/bot.php?id=$yeniid\">";
          }else{ 
          $fikrasayi=mysql_num_rows(mysql_query("SELECT * FROM fikra WHERE baslik='$baslik'"); 
          if(
          $fikrasayi==1){ 
          echo
          "Bu fıkra önceden eklenmiştir."
          echo
          "<meta http-equiv=\"refresh\" content=\"0.1;URL=http://www.siteminadi.com/bot.php?id=$yeniid\">"
          }else{ 
          // Artık fıkrayı yükleyebilirim, bir engel kalmadı 
          $tarih=date('d/m/y'); // Tarihi de alayım  
          $fikrayukle=mysql_query("INSERT INTO fikra (baslik,metin,tarih)VALUES('$baslik','$fikra','$ta rih')"); 
          if(
          $fikrayukle){ //Fıkram başarı ile yüklendiyse eğer : 
          echo"Fıkra başarıyla kaydedildi"
          echo
          "<meta http-equiv=\"refresh\" content=\"0.1;URL=http://www.siteminadi.com/bot.php?id=$yeniid\">"

          // taa yukarıda açtığım else'i burada kapattım
          ?>

          Bu sayfayı çalıştırdığımda ne mi olacak?

          PHP Kod:
          www.siteminadi.com/bot.php?id=1'i çalıştırdığınız an : 

          Bot çektiğiniz sitenin hızıyla orantılı bir hızla fıkraları tek tek sizin veritabanınıza yüklemeye, fıkradan fıkraya otomatik atlamaya başlıyor. Siz dur diyene kadar da devam ediyor.
          Gidip kapatmazsanız bot.php?id=1000000'a kadar devam edebilir.
          Bunu engellemek için $id'yi tanıttığımız kod'un altına

          PHP Kod:
          if($id!=10000){ 

          yazıp en alt satıra } ekleyerek kapayarak botun 10bin'e gelince otomatik durmasını da sağlayabilirsiniz.
          Öğretim amaçlı hazırladığım için ince bazı bilgileri paylaşmayı bot yazan diğer arkadaşların düşüneceklerini gözeterek açıklamadım.
          Bu basit mantığı ilerleterek istediğiniz bütün verileri birkaç saatte toplayabilirsiniz.

          Saygılarımla İyi Çalışmalar.
(Bu konu en son: 28.09.2013 Tarihinde, Saat: 11:25 düzenlenmiştir. Düzenleyen: H4CK4L.)

Çocukken her akşam yatmadan önce Tanrı'ya bana bir bisiklet vermesi için dua ederdim. Bir gün Tanrı'nın çalışma tarzının bu olmadığını anladım. Ertesi gün gittim kendime yeni bir bisiklet çaldım ve her akşam yatmadan önce Tanrı'ya günahlarımı affetmesi için dua ettim.
Alinti
Rep Verenler: NEO34
DaRKNeSS
*
avatar
Binbaşı
Durum: Çevrimdışı
Seviye Puanı: 53
Yaşam Puanı: 1,315 / 1,315
Deneyim: 60 / 100
Rep Sayısı: 121
Mesaj Sayısı: 5584
Üyelik Tarihi: 11.08.2013
     
Yorum: #2
RE: PHP Bot Yapımı
01.10.2013 01:32
Super anlatmisin eline saglik cok gerekli bilgi en favori konum bu oldu Smile


Alinti
#H4CK4L
*
avatar
#R00T
Durum: Çevrimdışı
Seviye Puanı: 43
Yaşam Puanı: 1,050 / 1,050
Deneyim: 3 / 100
Rep Sayısı:
Mesaj Sayısı: 2999
Üyelik Tarihi: 04.05.2013
      
Yorum: #3
Cvp: PHP Bot Yapımı
01.10.2013 19:53
(01.10.2013 01:32)DaRKNeSS Nickli Kullanıcıdan Alıntı:  Super anlatmisin eline saglik cok gerekli bilgi en favori konum bu oldu Smile

eyw. umarım işine yaramıştır :heart:

Çocukken her akşam yatmadan önce Tanrı'ya bana bir bisiklet vermesi için dua ederdim. Bir gün Tanrı'nın çalışma tarzının bu olmadığını anladım. Ertesi gün gittim kendime yeni bir bisiklet çaldım ve her akşam yatmadan önce Tanrı'ya günahlarımı affetmesi için dua ettim.
Alinti
Asil_Mehmet
*
avatar
Teğmen
Durum: Çevrimdışı
Seviye Puanı: 15
Yaşam Puanı: 54 / 366
Deneyim: 65 / 100
Rep Sayısı: 2
Mesaj Sayısı: 280
Üyelik Tarihi: 23.09.2013
     
Yorum: #4
Cvp: PHP Bot Yapımı
22.10.2013 13:53
Eline Sağlık Exciting
Alinti
NEO34
*
avatar
Teğmen
Durum: Çevrimdışı
Seviye Puanı: 4
Yaşam Puanı: 1 / 85
Deneyim: 40 / 100
Rep Sayısı: 2
Mesaj Sayısı: 32
Üyelik Tarihi: 25.06.2014
     
Yorum: #5
RE: PHP Bot Yapımı
30.07.2014 01:58
Elinize saplık gerçekten öok güzel anlatmışsınız arşive aldım lazım olur bir ikikez basit botlar yazmıştım biraz geliştirmek lazım Smile
Alinti



1 Ziyaretçi