PHP Bot Yapımı - PHP Bot Yazımı Anlatım

Mesut

Eski üye
Katılım
19 May 2021
Mesajlar
119
Tepki
13
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.

1625306707685.png


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 :

Alıntı:
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 :

Alıntı:
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 :

Alıntı:
<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 :

Alıntı:
<!-- 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 :

Alıntı:
$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 :

Alıntı:
$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ı ?

Alıntı:
$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 :

Alıntı:
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 :

Alıntı:
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 )

Alıntı:
// 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 :

Alıntı:
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
smile.gif

$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
smile.gif


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 :

Alıntı:
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 :

Alıntı:
$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 :

Alıntı:
$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 :

Alıntı:
$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 :

Alıntı:
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 :

Alıntı:
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ç
Alıntı:
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
Alıntı:
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 :

Alıntı:
<?
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
smile.gif

$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?
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

Alıntı:
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.
 
Son düzenleme:
Üst Alt