Tam Sürümünü Görmek İçin : IRC bot ve web sitesinden, IRC kanalindakileri gosterme
Perl ile bir IRC bot yazmaktayim. Botun su an tek yaptigi, IRC kanalina girip oyle bos bos oturmak ve kanalda kimlerin oldugunu, gerekli zamanlarda (kanala biri girdiginde, ciktiginda vs) web sitesine bildirmek.
IRC bot isi ile ilgilenenlere faydali olmasi icin botu cok sade tuttum ve kodlara gerekli butun aciklamalari Turkce olarak yazdim.
Yani bot, su an alip kendi isinize gore degistirmenize cok musait durumda. Veya bir web siteniz ve IRC kanaliniz varsa, herhangi bir ekleme yapmadan IRC kanalinizda kimlerin oldugunu, web sitenizden gosterebilirsiniz.
Bu proje, ceviz.net'in proje bolumunde gelistirilmekte ama oraya henuz herkes erisemedigi icin kodlari download edebileceginiz baska bir adres veriyorum:
http://www.geocities.com/acemi17/sinbad.pm.txt
Kullanmayi dusunenlere, buradan daha detayli bilgi verebilirim.
Hocam aynı ısı PHP de yapmayı calısmak bosunamı olur? Yanı Perl den anlamadıgım ve konu ılgımı cektıgı ıcın soruyorum.. Sanırım sen yola Perl ıle devam etmekte kararlısın?
Kısaca kodlarını PHP ye uyarlıyabılırsem PHP ıle devam edebılırmıyız? Yoksa ben projeyı uzaktan seyretmek zorunda kalıcam..
Her dille bot yazilir, PHP ile de... Kodlari birebir cevirmekle olmaz (cunku Perl'e ozel bazi nesneler/kutuphaneler kullanilmis) ama ayni isi yapan yeni bir PHP programi yazilabilir.
Sanirim Internet'te PHP ile yazilmis ornek bot kodlari vardir.
Var evet.. Bı kacını ındırdım ama ıcınden cıkamadım.. Senın ornegınde ıse bol turkce acıklama var.. Bu anlamda daha cok yardımcı olabılır.. Hem nede olsa bı ırc sunucu ıle konusurken kullanılan dıl herzaman aynı?
Hem nede olsa bı ırc sunucu ıle konusurken kullanılan dıl herzaman aynı?
Bir IRC sunucu ile konusurken kullanilacak dil tabii ki ayni ama benim yazdigim kodlarda ust seviye bilesenler kullanilmis. Ornegin web sitesi ile yapilan haberlesmenin, IRC islemlerini bloklamamasi icin POE bileseni kullanildi. Bunu da bastan yazmak gerekir.
PHP ile yapilacaksa en iyisi, bu kodlari ise karistirmadan PHP mantigi ile kodlari bastan yazmak.
Ama projenin ileri safhalarinda, web arayuzu hazirlamak da gerekecek. O zaman PHP bilenlerin yardimi, hic de fena olmaz :)
2 gun once 3 saatlik bir ugra$la PHP'de tum server icin bir anti-spam botu yazdim. Gayet te guzel cali$iyor ve muhtemelen PHP'de yazilmi$ dunyanin ilk irc anti-spam botu oldu :)
Ortalikta seen, google arama, geyik yapma botlari mevcut PHP ile yazilmi$.
Oldukca basit, tek bilmeniz gereken ekstra $ey IRC RFC'nin bazi onemli noktalari, orn sunucuya baglanirken gondermeniz gereken header ve her komuttan sonra gidece CRLF.
www.google.com.tr search "IRC RFC".
Benim bot admin yetkileri ile dolandigi icin etrafta ve tam olarak bitmedigi icin kaynak kodlarini vermem sakincali olacak, tamamlandiginda atabilirim bir yere.
Bu arada PHP'nin socket fonksiyonlari aktif olarak compile edilmi$ olmasi gerekiyor. Bir de PHP icin ozel IRCGW (ircgateway) mevzu var, ama fsockopen ve socket fonksiyonlari i$inizi rahatca gormenizi sagliyor. Bandwidth pek yemiyor, ramlerle de bir sorunu yok, canavar ma$alla canavar! :D
:cool:
Anladım... Yınede burda kafama bısey takılmıyor degıl.. Ornegın PHP ıle yazılan bır botun calısabılmesı ıcın ya sonsuz bı donguye gırelecek kı sanırım bu beraberınde timeout u getırır yada belırlı aralıklarla sayfa refresh edılecek ozmanda devamlılık olmıycak? Yanı bot her yırmı sanıyede bır irc sunucuya tekrar baglanmak zorunda kalıcak..
Bu sorun nasıl cozumlenırkı? Yoksa PHP ıle yazılmıs ırc botlar baska bı mantıklamı calısıyor? (Bu arada sorular senı sıkmıyor dıılmı?)
Upss. Bıraz gec kalmısım.. Neyse oyleyse ASA yada sormus oluyum ben soruyu :)
PHP ile bot yazarsan, web sunucunun kontrolunde calisan bir web uygulamasi gibi olmayacak, basli basina bir program olacak.
Bir de bu tip islerde, sonsuz donguye sokarken dikkatli olmak lazim. Belli olaylar olustugunda, kodlari tetikleyecek sekilde kod yazilmali yoksa cok fazla kaynak tuketir.
Ben hele bı baslıyımda.. Hatta hemen sımdı baslıyım :)
cron'a ekleyip cali$masini duzenleyebilirsin.
Bunun di$inda zaten IRC sunucusuna surekli bir baglanti acmi$ oluyorsun, onemli olan botunun baglantinin kesildigi zaman (killendigi, excess flood'dan du$tugu vs) durumlarda, o durumu farkedip, fclose ile gerekli socketi kapatmasi olacaktir.
:cool:
Ben bu ısı beceremıycem sanırım.. Once fsockopen fonksıyonuyla baglanmayı denedıgım ırc sunucuya no ident turu bı hata verıp gırısı kabul etmedı.. Acaba baglandıktan sonra benden bısemı ıstıyor dıye RFC yı ınceledım ama baglantı sırasında ne yapmam gerektıgıne daır bısey bulamadım (emınım vardır ama ben bulamadım)
Ardından pes edıp baskaları nasıl yapmıs dıye poBot u ıncelemeye koyuldum.. Baktım socket fonksıyonlarını kullanmıslar.. Alla alla ne olakı dıye manualı karsıtırdım.. Verılen orneklerı calıstırmayı denedım.. Fonksıyon yok hatası aldım.. Kutuphane yuklu degıl sanırım dıyerek extension=php_sockets.dll satırını aktıf hale getırdım php.ini de.. Bu seferde PHP gocmeye basladı.. Icınden cıkamadım..
Bu arada epey de bı Socket Programlama yazısı okudum : ) Sonuc hala basladıgım yerdeyım : ) Sımdı sız ne tavsıye edersınız? Benden ıs cıkmazmı yoksa : )
Cok iyi gidiyorsun :)
Zaten baslangicta hep boyle olur.
IRC sunucuya baglandiginda, once su iki satiri gonderiyorsun.
NICK :HunTER
USER HunTER HunTER HunTER :HunTER
Bu satirlarin sonuna carriage return karakteri eklemeyi unutma. Bunlari gonderdikten sonra, IRC sunucunun, sana bazi veriler gondermeye baslamasi lazim.
Gonderdigi veriler icinde
PING :xxxxxx
satirini yakalayip buna cevap olarak sunucuya
PONG :xxxxxx
gondermen lazim. Simdilik bu kadarini dene. Deneme yaptigin sunucudan supheleniyorsan, baska IRC sunucuda dene.
acemi kodların çok güzel.
ASA'nın dediği üzerine aratayım dedim Türkçe sayfalarda ilk çıkan bu konu başlığı oldu. Enteresan. :D
Arama bağlantısı:
http://www.google.com.tr/search?hl=tr&ie=UTF-8&oe=UTF-8&q=IRC+RFC&btnG=Google%27da+Ara&lr=lang_tr
Heheh o da iyiymi$ :)
I$ ba$a du$tu, PHP'cinin halinden PHP'ciler anlar :D
Tam cali$an bir kod vermeyecegim, ama baglanman icin yeterli kaynagi buradan bulabilirsin HunTER;
Once "\r\n"i yani carriage return, line feed'i tanimlaman lazim (bugunku helper sinavinda sordum bu soruyu linc etmeye kalktilar nedense).
time out olmamasi icin set_time_limit(0);
dedikten hemen sonra define ("CRLF", "\r\n"); diyerek i$imizi kolayla$tiralim, cunku servera yollayacagimiz her mesajdan sonra bunu gondermemiz gerekecek.
Sonra;
$nick = 'ASABoT';
$username = 'Servant';
$localhost = 'xfiles.fbi.gov';
$remotehost = 'irc.e-kolay.com';
$realname = 'ASA is my master';
$password = "abdurrezzak";
Gibi birkac degi$keni tanimladik. Sonra soketimizi aciyoruz;
$fp = fsockopen($remotehost, 6667, &$err_num, &$err_msg, 30);
Sirada servera ilk baglantida gondermemiz gereken header bilgisi var, bunlari yollamaya cali$madan once if ($fp) kontrolunu yapalim degil mi?
$Header = 'PASS ' . $password . CRLF;
$Header .= 'NICK ' . $nick . CRLF;
$Header .= 'USER ' . $username . ' ' . $localhost . ' ' . $remotehost . ' :' . $realname . CRLF;
fputs($fp, $Header);
Bu headeri da yolladiktan sonra sunucuya baglanmi$ olacaksin.
Bundan sonrasini fgets ile deneye deneye gelen cevaplari kontrol ederek bulabilecegine inaniyorum.
:cool:
Hocam cok saol ama hemen hemen aynı seyı yaptıgım halde bı turlu baglanamadım ırc servera.. Sanırım PONG u yakalayamadıgım ıcın ama ılgınc olan bu tıp bıseyde gelmıyo fgets ıle..
<?
$server = fsockopen ("irc.freenode.net", 6667, $errno, $errstr, 30);
if (!$server)
{
echo "$errstr ($errno)<br>\n";
}
else
{
fputs ($server, "NICK :HunTER\nUSER HunTER HunTER HunTER :HunTER");
$i = 0;
while (!feof($server))
{
if($i >= 100) exit;
$data = fgets ($server,128);
if(preg_match("'PING(.*?)'si", $data, $set))
fputs($server,"PONG ".trim($set[1]));
echo $data;
$i++;
}
fclose ($server);
}
?>
Aldıgım cıktı ıse su sekılde..
NOTICE AUTH :*** Looking up your hostname...
NOTICE AUTH :*** Checking ident
NOTICE AUTH :*** Found your hostname
NOTICE AUTH :*** No identd (auth) response
ERROR :Closing Link: HunTER (Connection Timed Out)
Yanı anlamıyorum.. Aklıma gelen PONG'u almak ıcın bı baska fonksıyon kullanmam gerektıgı ama manualde bu tıp bısey goremedım.. Kı ornekler genelde http uzerıne.. Socket fonksıyonlarınıda deneyemıyorum dedıgım gıbı calıstırdıgım anda php gocuyor..
Kısaca sızce hata nerde?
fputs ($server, "NICK :HunTER\nUSER HunTER HunTER HunTER :HunTER\n");
Sadece \n yeterli olmasi lazim ama yine sorun cikarsa \r\n dene.
fputs ($server, "NICK :HunTER\r\n");
fputs ($server, "USER HunTER HunTER HunTER :HunTER\r\n");
Saol sanırım bu sekılde oldu : ) Sanırım dıyorum cunku ekranda bu sefer hıcbısey goremıyorum : ) echo $data, sanırım bu ekrana bısey getırmıyor.. Sımdı $data yı bı dosyaya yazıp ordan takıp etmeyı yada ob_start() ve ob_get_contents(); ıle cıktıyı buferdan alıp basmayı denıycem.. Yoksa bu ıs kor dogusune benzıycek : )
<?
set_time_limit(0);
ob_start();
$n = "\n";
$nick = 'ErtugrulYildirim';
$kanal = 'ceviz';
$uzaksunucu = 'irc.e-kolay.net';
$yerelsunucu = 'adsluser-2866.adsl.ttnet.net.tr';
$port = 6667;
$sunucu = fsockopen ($uzaksunucu, $port, $hatano, $hatastr, 0);
if (!$sunucu)
{
echo $hatano."\n";
}
else
{
echo '<pre>'.$n;
fputs($sunucu, 'NICK '.$nick.$n);
fputs($sunucu, 'USER '.$nick.' '.$yerelsunucu.' '.$uzaksunucu.' : '.$nick.$n);
fputs($sunucu, 'JOIN '.$kanal.$n);
$i = 0;
while (!feof($sunucu))
{
$i++;
$veri = fgets ($sunucu,128);
if(preg_match("'PING(.*?)'si", $veri, $set))
fputs($sunucu,'PONG '.trim($set[1]).$n);
echo $veri;
if($i > 100) exit;
}
fclose ($sunucu);
echo '</pre>'.$n;
}
?>
Az once bıraz acelecı davrandım sanırım :) Evet buraya kadar geldım.. Sımdı ne tavsıye edersınız? Yanı amac kanaldakı kısılerın lıstesı almaksa..
CrazyCat
17/07/2003, 12:26
:)
bu iş bayağı keyifli görünüyor
bir patik atsam mı acaba :D
irc ile aram oldum olası pek barışık diildir belki biras düzeltmiş olurum :)
Hocam bende tam onu dıyecektım.. Bı ara sız konuyla ılgılı bı proje gelıstırmıyormuydunuz? Hanı msn tarzı bısey? Tamam ıcınde ırc yoktu belkı ama yınede tecrubelerınızı bızımle paylasırsanız cok mutlu olurum :)
Aslında benım yapmak ıstedıgım de su sunucu-ıstemcı mımarısıne daır okuduklarımı uygulayarak ogrenmek.. Adına da soket programlama denıyor sanırım :)
CrazyCat
17/07/2003, 14:25
:)
daha önce irc ile hiç haşırneşir olmamıştım :)
soket programlama ile yaptığım çalışma C++ ile bir soket server yazma işiydi
Daha sonra benzerini php ile de denemiştim ama hatırladığım kadarıyle bazı soket komutları win de çalışmıyordu.
şimdi irc rfc yi okuyorum :)
yazdığın scripti denedim güzel çalışıyor.
ayrıca perl deki de çok temiz olmuş:)
irc ile ilgili bilmediğim bikaç şey var onları öğrenince php ile bir benzerini yazabiliriz :)
ayrıca soket programlama konusunda konuşuruz :)
Tamam hocam beklıycem :) Benım ıcınde okuyun RFC yı :) Bu arada bende olmayan ıngılızcemle neler yapabılecegıme bı bakıyım..
CrazyCat
17/07/2003, 15:22
tamam bi yandan okuyup bi yandan da deniyorum :)
mesaj göndermeyi başaramadım henüz.
nasıl gönderiliyor mesaj ? sen denedin mi?
birisi bana kanal +n ise prvmsg ile gönderemessin dedi :)
o ne ?
Adrenalin
17/07/2003, 15:34
Bir bot var bende ama SSH aracılığı ile webservere girip "./run" yazmadan çalışmıyor :) Serverdeki tüm kanalları gösteriyor kaç kişiler, topicleri neler.... ve serverde kaç user var kaç oper var gibi. isterseniz burada linkini veririm.
Birde ben yapiyorum userler webden memolarını okuyup çeşitli işlemleri yapabilecekleri ( şifre değiştirme gibi. )
DALnet'in yaptığı bir olay.
Ben irc.e-kolay.com da denıyorum sımdılık :) Ve kanala gırmeyıde basardım :) Ama mesaj gondermek bılmıyorum sımdı denıycem :)
Bu arada JOIN ardından # kullanmak gerekıyormus sanırım.. Yanı JOIN #ceviz Bırde artık if($i > 100) exit; lımıtını kaldırdım.. Sonucu dosyaya yazdırıyorum.. Boylece sayfaya gelmesını belemeden log.txt yı refresh ederek durumu ızlıyebılıyorum..
Ve gercekten kanalda php ıle acıtıgım userı gormek cok keyıflıymıs.. Bıde onla sohbet edebılsem :p
Kanala mesaj gondermek icin:
PRIVMSG #kanal :mesaj
Bir kisiye mesaj gondermek icin
PRIVMSG nickname :mesaj
Ve sonunda ıstenen oldu :) Amacı bellı olmasada bot ıs goruyor.. Unutmadan kapanması ıcın ona kanalda "kapan bot" demenız gerekıyor :)
<?
# Zaman sınırlaması yok.. (Tıme out almamak ıcın)
set_time_limit(0);
ob_start();
# Yankının yapılacagı kullanıcı ve kapatma mesajı
$sahip = 'HunTER__';
$kapat = 'kapan bot';
# Gereklı degıskenler
$n = "\n";
$nick = 'HunTER_BOT';
$kanal = 'ceviz';
$uzaksunucu = 'irc.freenode.net';
$yerelsunucu = 'adsluser-2866.adsl.ttnet.net.tr';
$port = 6665;
$dosya = fopen("log.txt","w+");
$sunucu = fsockopen ($uzaksunucu, $port, $hatano, $hatastr, 0);
# Baglantıda hata olusursa
if (!$sunucu)
{
echo 'Sunucuya Bağlanamadı';
}
else
{
# Sırasıyla nıkı, kullanıcıyı belırle ardından kanala gır ve selam ver
fputs($sunucu, 'NICK '.$nick.$n);
fputs($sunucu, 'USER '.$nick.' '.$yerelsunucu.' '.$uzaksunucu.' : '.$nick.$n);
fputs($sunucu, 'JOIN #'.$kanal.$n);
fputs($sunucu, 'PRIVMSG #'.$kanal.' :Selam Kanal'.$n);
while (!feof($sunucu))
{
$veri = fgets ($sunucu,128);
fputs($dosya,$veri);
# Pıng gelırse Pong Gonder
if(preg_match("'PING(.*?)'si", $veri, $set))
fputs($sunucu,'PONG '.trim($set[1]).$n);
# Kanal lıstesını al ve bunu bı $isimler ıcınde sakla
if(preg_match("':(.*?)353(.*?) :(.*?)'Ui", $veri, $set))
$isimler .= trim($set[3]);
# Eger kanala bı mesaj yazıldıysa
if(preg_match("':(.*?)!(.*?)PRIVMSG #".$kanal." :(.*?)'Ui", $veri, $set))
{
# Yazılan mesaj kapanma mesajıysa botu kapat
if(trim($set[3]) == $kapat)
{
# Isım lıstesını bas ve hoscakal de
fputs($sunucu, 'PRIVMSG #'.$kanal.' :Hoşçakalın, '.$isimler.$n);
fclose ($sunucu);
fclose ($dosya);
exit;
}
# Yazılan mesajı sahıbe echo et (test amaclı)
else if(trim($set[1]) != $nick)
{
fputs($sunucu,'PRIVMSG '.$sahip.' :'.trim($set[3]).' '.trim($set[1]).$n);
}
}
}
}
?>
Yaptıgı hıc bısey yok aslında.. Sadece kanala gırıyor selam verıyor ardından kanala yazılan herseyı $sahıp e yankılıyor.. Ve "kapan bot" denıldıgınde $ısımler ı basıp hoscakal dıyor.. Ve kapanıyor.. Hepsı bu :)
Ama dılersenız botun bı amacı olabılır tabı :) Benım aklıma bısey gelmedı henuz..
Ha bu arada scrıptın calıstırıldıgı dızınde log.txt adında bı dosya olusuyor ve sunucudan gelen tum verıler burda depolanıyor.. Yanı kapan bot dedıkten sonra olan bıtenı gormek ıcın yada calısma esnasında bu dosyayı takıp edebılırsınız..
Bot icin amac onerisi:
!kimler dendiginde, bunu diyen kisiye ozel mesaj atip ceviz forum'da kimlerin oldugunu soylesin
!mesajlar denildiginde, mesaj eklenen son X topic'in basligini soylesin
Program artik istenildigi kadar bot'u kontrol edebiliyor. Yani, ayni veya farkli sunucularda calisacak onlarca bot tanimlayabilirsiniz.
Son kodlar burada:
http://www.geocities.com/acemi17/sinbad01010016a.pm.txt
Hunter ellerine sağlık şu şekilde geliştirilmesi mumkunmu sureklı bağlı kalacak yanı web sayfası gıbı calısmayacak server e yukleyeceğiz o sureklı bağlı kalacak ve ne oluyor ne bıtıyor kayıt edecek bnc ... psybnc gibi...?
Saygılar
ellerine sağlık
Mingitau
18/07/2003, 00:13
Sanirim zaten Hunter ın kodu web sayfası olarak çalışmıyor :confused: değil mi Hunter?
Aslında evet.. Yanı bı kere calıstırıldıktan sonra browser kapansa dahı calısmaya devam edıyor (nasıl oldugunu bende bılmıyorum).. Ama o baslangıc bı kere verılmelı.. Bunun ıcınde sunucuda cron job calıstırılabılırmıs sanırım.. Ama ben hıc bu tur bısey denemedım..
Bu arada bu botu zaten localhostunuzda da deneyebılırsınız.. Ben oyle yaptım..
Son olarak acemı saol fıkır ıcın redial da kabul edersen neden olmasın.. Ama bunun ıcın sanırım vbb verıtbanına erısmem gerekır.. Buda bıraz urkutucu : ) Yada redial kımler onlıne dedıgımde bana cevap verıcek bı scrıpt yazabılır?
SiRReS onuda yapmayı dusunuyorum ama once daha ıyı bı temele oturtmalıyım sanırım scrıpt.. Bu nedenle belkı bır ırc nesnesı tanımlıyabılırım.. Aklıma gelen sunucudan gelen mesajları (001,354,363, vs) sonsuz bı dongu ıcınde parse edıp ılgılı kod ıcın ılgı metodu calıstıran bı nesne yazılabılır..
Hem bu sayede acemının perl de yaptıgına yakın bı php scrıptı olmus olur : ) Sız nedersınız?
Masterphp
18/07/2003, 11:28
Arkadaşlar Bence Hunter Bu olaya baya yani Socket Programlamaya kafayı takmış :)
Bende 1 sene önce acayip irc ile ilgilenirdim :)
Ama daha sonra unuttum...
Kolay gelsin Hunter ...
Acemi Kodlar Güzel...
HunTER Devam et :)
Sevgili hunter ve acemi;
Acaba ben size www.ceviz.net te ki son 5 haber, son 5 makale, ve forum.ceviz.net teki son 15 konuyu xml olarak versem, bu sizin akilli yasam belirtileri, ornegin !cevizm5 denildiginde ceviz.net teki son 5 makaleyi, !cevizh5 denildiginde son 5 haberi, !forumx denildiginde forumdaki son x konuyu verebilirler mi?
Verırler zannedersem :) Ama benım sımde oturup bırde XML parse etmeyı ogrenmem gerekecek :D
PHP ileyapilmis bir model var elimde, sanirim Sende biraz php biliyosun :D :D
Eheh :) Eh ucundan anlarım bıraz :) Cıdden ıyı olur aslında.. Hem mustafa hocanın yazdıgı bı makale var.. Zor olmaz yanı.. En ıyısı sen yazmaya basla scrıptı bende bu arada makaleyı okuyum :)
Acaba ben size www.ceviz.net te ki son 5 haber, son 5 makale, ve forum.ceviz.net teki son 15 konuyu xml olarak versem, bu sizin akilli yasam belirtileri, ornegin !cevizm5 denildiginde ceviz.net teki son 5 makaleyi, !cevizh5 denildiginde son 5 haberi, !forumx denildiginde forumdaki son x konuyu verebilirler mi?
"Akilli yasam belirtileri" ile !cevizm5, !cevizh5 diye mi konusulur yahu? "pisst bot kardes, sitede durumlar nasil, yeni birseyler var mi?" dense..?
Son olarak acemı saol fıkır ıcın redial da kabul edersen neden olmasın.. Ama bunun ıcın sanırım vbb verıtbanına erısmem gerekır.. Buda bıraz urkutucu : ) Yada redial kımler onlıne dedıgımde bana cevap verıcek bı scrıpt yazabılır?
Aslinda oneride bulunurken forumun normal sayfalari kullanilarak bu isin yapilmasini dusunmustum. Mesela forum ana sayfaya istenip "online uyeler" olumu diger verilerden ayristirilip bunun kullanilmasi gibi...
Ama XML isi daha rahat... Veya XML hic karistirilmayip basit bir text dosyada kullanilabilir.
XML dememin nedeni, su anda elimizde calisan uygulamalarolmasi idi.
Forumun altinda gordugunuz, ceviz.netteki son5 makale ve ve son 5 haber, ayrica ceviz.net in altinda gordugunuz forumdaki son 15 konu, RDF ile tasiniyor. Ama istediginiz takdirde, text olarakda verebilirim; bu noktada tercih tamami ile size kalmis ;)
Biraz XML'le ugrasmak daha faydali olur
Kesınlıkle :) Bu arada ben botu bı sınıf yapısına oturttum.. Son halı su sekılde.. http://www.gazetebogaz.com/Domain/Ceviz/Project/CevizBot/cevizbot.php.txt .. Ne dersınız? Bu sekılde olurmu?
Bot her geçen dakika Snıf atlıyor helal olsun
CrazyCat
18/07/2003, 17:03
classlı olanı test ettin mi?
ben bi baktım 103 de hata veriyor bağlantı zamanı ile ilgili.
bu arada yaptığın örnekleri alıp inceliyorum bir iki farklı deneme yazdım
sanırım yakında irc işini biraz çözerim :)
bugün vakit bulursam birde C++ de yazıcam web uygulamasına göre bir takım avantajları olabilir.
kolay gelsin.
Bende XML derım :) E pekı sımdı ne yapıyoruz :)
Masterphp
18/07/2003, 17:41
Ya Hunter bence bu konuyu biraz fazla uzattınız :) ama gerçekten irc için yararlı bişey olacaktır... Eminim Hiç şüphem yok Bu arada icq ya gelirsen iyi olur ...
Orjinal mesajı gönderen redial
Forumun altinda gordugunuz, ceviz.netteki son5 makale ve ve son 5 haber, ayrica ceviz.net in altinda gordugunuz forumdaki son 15 konu, RDF ile tasiniyor. Ama istediginiz takdirde, text olarakda verebilirim; bu noktada tercih tamami ile size kalmis ;)
Public mi bu dosyalar ? Değilse neden değil ? Değilse public olabilir mi? RDF kullanılmasına bayılan bir insan olarak sormak istedim.
Hele bir de her bölüm için son 15 konuyu gösteren bir RDF olsa ceviz.net tadından yenmeyecek. :)
Mingitau
18/07/2003, 21:00
Niye her bolumden son 15 konu merak ettim :D
Sizin orlarda 15 konudan assasi kurtarmiyo mu?
vs vs vs...
:D
15'den fazlası standartı (RSS/RDF) bozuyor. Yoksa keyfi değil yani :)
@Ansugo:
www.ceviz.net -> Son 5 Makale : http://www.ceviz.net/rdfout.php
www.ceviz.net -> Son 5 Haber : http://www.ceviz.net/rdfoutnews.php
forum.ceviz.net-> Son 15 Konu : http://forum.ceviz.net/rdfout.php
Bolumlerdeki Son 15 konu isteginiz dikkate alindi,
Pek yakinda rdfout.php ye parametreler gondererek istediginiz forumdaki istediginiz sayidaki son mesaji gorebileceksiniz. orn: rdfout.php?f=1&g=10 -> 1 numaral forumdan 10 adet son hareketi getir.
isinize yarar mi?
Mingitau
19/07/2003, 11:35
Yarar ;)
Yaradı bıle :) http://www.gazetebogaz.com/Domain/Ceviz/Project/CevizBot/cevizparse.php.txt .. Henuz bızım akıllı yasam belırtılerıyle bırlestırılmıs degıl ama bundan sonrası cok zor olmaz sanırım.. Sız nedersınız?
Evet cevizbot ve cevizparse yı bırlestırdım.. Sonuc ekte yeralıyor.. Scrıptın calısan halı ıse irc.freenode.net #ceviz den ızlenebılır :) Tabı flood engelıne takılıp sunucudan atılmazsa :)
Ozetle scrıpt irc kanalına baglanıp kanaldan yada ozelden gelen ozel mesajlara gore su ıslemlerı yapıyor..
!news : Son 5 Haberı mesajı yazanın ozelıne basar
!docs : Son 5 makaleyı mesajı yazanın ozelıne basar
!topics : Son 15 forum topıgını mesajı yazanın ozelıne basar
!kapan : bot kendını kapatır..
Yukardakı lısteye yenı eklemeler yapmak mumkun.. Ornegın !log dendıgınde log tutmaya baslıyacak ve !endlog ıle sonlandıracak turden bısey.. Yada sızın aklınıza ne gelırse :)
Bu arada kendısı hala gelıstırılmekte :)
Kodlara bakmadim. Ama bu son 5'leri alirken surekli ceviz.net'le ileti$im kurmasi kullanici sayisi arttiginda sorun yaratabilir. Son 5 haber ve makale gunde bir kere alinip, botun bulundugu sunucuda bir txt dosyasina konabilir ama son 15 forum topici icin aynisini yapmak zor.
Bir de flood korumasi hazirlaman lazim, yani belirli bir surede bota bir ki$i veya daha iyisi ip'den surekli mesaj gelirse, bunu normalden ayirtedip o nicki ignore etmesi gerekir, yoksa excess flood yuzunden du$er.
:cool:
Predator
19/07/2003, 16:32
PHPirc diye birşey buldum baya güzel,
googledan aranınca bulunuyo,
Bu arada ident ettiremiyorum bir türlü cevizbot her msgın başına 1 tane boşluk koyuyo şimdi phpirc yi inceliyeceğim
Mingitau
19/07/2003, 17:43
phpirc soket kullanmıyordu sanırım.
Kodlara bakmadim. Ama bu son 5'leri alirken surekli ceviz.net'le ileti$im kurmasi kullanici sayisi arttiginda sorun yaratabilir. Son 5 haber ve makale gunde bir kere alinip, botun bulundugu sunucuda bir txt dosyasina konabilir ama son 15 forum topici icin aynisini yapmak zor.
Bot, son istegin ne zaman yapildigini ve bu istegin sonucunu saklayabilir. Son istek zamanindan itibaren belli bir sure gecmedigi surece (ornegin 10 dakika gecmedigi surece) hep ayni cevabi/listeyi gonderir.
Eger bu sure asildiktan sonra bir istek gelirse yeniden siteyi sorgular. Ve tekrar 10 dakika boyunca yapilan isteklere ayni cevabi gonderir.
Boylece istek sayisi artsa bile bir sorun yasanmaz, her seferinde siteye baglanmak gerekmez.
Orjinal mesajı gönderen redial
@Ansugo:
www.ceviz.net -> Son 5 Makale : http://www.ceviz.net/rdfout.php
www.ceviz.net -> Son 5 Haber : http://www.ceviz.net/rdfoutnews.php
forum.ceviz.net-> Son 15 Konu : http://forum.ceviz.net/rdfout.php
Bolumlerdeki Son 15 konu isteginiz dikkate alindi,
Pek yakinda rdfout.php ye parametreler gondererek istediginiz forumdaki istediginiz sayidaki son mesaji gorebileceksiniz. orn: rdfout.php?f=1&g=10 -> 1 numaral forumdan 10 adet son hareketi getir.
isinize yarar mi?
Yaramaz mı efendim ? :) Bunları hemen bizim local habercimize ekleyelim. Gerisini de beklemedeyim, haberiniz olsun efendim :)
Bandwithi ise fazla düşünmenize gerek olmadığını düşünüyorum. Ortalama bir RSS/RDF dosyası 2~8 KB arasında değişiyor. ( Fazlasını yapan halt etmiş olur ). Günde 1000 kişi bottan haber istese ve bot her seferinde ceviz.net ten XML verilerini istese bile bu 2 MB ile 8 MB arası bir transfer eder ki normal'de 3Mb yi geçmeyecektir. Ayda 60Mb ile 240Mb arası bir bant genişliği gerekir ki normalde 90MB yi geçmez.
Ceviz.net irc odasının kullanırlık durumunu dikkate alırsak bu oran (1000) bile uzun vadede kolay kolay sağlanamayacağı için bence bir soru olmayacaktır. Eğer Bot'u ceviz.net'e özel değilde genel kullanıma açacak isek, Bot'un her isteği log etmesinden ziyâde kullanıcının vereceği bir zaman dilimi içerisinde ( 10 dakka, 20 dakka, her istek ) kontrol etmesi bence daha hoş olur. Böylece sadece son olarak istenen dosyayı serverdan ne zaman aldığının kayıt bilgisini tutmak yeterli olacaktır.
Son durum su sekılde..
http://www.gazetebogaz.com/Domain/Ceviz/Project/CevizBot/cevizbot.php.txt
http://www.gazetebogaz.com/Domain/Ceviz/Project/CevizBot/cevizparse.php.txt
Yanı ASA'nın soyledıgı her ıkı seyıde yaptım.. Suan her on dakıkada bır cevızı parse edıyor.. Ve bır kullanıcı ancak 10sn aralıklarla gorev bıldırebılıyor..
Ama hala sunucunun flood yaptıgımı sanıp benı kıcklemesınden kurtulamadım.. Aslında sunucunun benı kıcledıgını anlayabılesem dongu ıcınde tekrar baglanmam mumkun.. Ama bu verıyı yakalayamadım...
Yanı sorun sunucunun benı kıcledıgını nasıl anlarım.. Yada kıcklenmekten nasıl kurtulabılırım.. Bunuda halledersem sanırım bot artık kullanılabılır hale gelır..
Bu arada ıkı yenı gorev daha ekledım..
!log: log tutmaya baslar
!endlog: logu kapatır..
Ilerde bu logları duzenlıyerek gosteren bı scrıpt daha yazılabılır..
Mingitau
19/07/2003, 21:17
o sunucuda #php kanalında bazı açıklamalar var flood olduğu zaman nasıl yazılmalı filan
uzun kod parçalarında gerekli oluyormuş...
rootbalans
21/07/2003, 12:54
6667 ve ilgili portları kapalı olan bir ağdaki bir bilgisayardan irc'ye bağlanmayı sağlayacak bir scripte ihtiyacım var. Böylece bir web sitesinden irc'ye girmek isteyen ama irc serverlerin kullandığı ilgili portlar kapalı olduğu için chat odasına girememek gibi bir sorun ortadan kalkmış olacak.
Yazmana gerek sanırım.. www.hotscripts.com adresınde aradıgın turden bısey bulman mumkun.. Bu arada sorun hala devam edıyor yanı sunucudan kıclendıgımı hala algılayabımıyorum..
Yanı bu suna benzıyor kodda gelen pınge pong ıle cevap vermek ıcın su tıp bı satır var..
# PING geldıgınde PONG gonder
if(preg_match("'PING(.*?)'si", $data, $set))
fputs($this->server,'PONG '.trim($set[1]).n);
Oysa bu PING **** ıfadesını tutulan logda gormek mumkun degıl.. Nasıl oldugunu bılmıyorum ama loga alamadıgım bu ıfadeyı ayrıstırıp PONG gondermem mumkun..
Benzer sekılde benı kıcledıgınde sunucudan bu tıp bı ıfade alıyormuyum? Alıyorsam bunu algılayıp $this->ReConnect() dıyebılırım cunku.. Ikıncısı soruna bı cozum de su sekılde getırelebılır..
for($i=0; $i < count($result); $i++)
{
# Scrıpt 1sn durduracak fonksıyon
sleep('1');
$post = explode(n,$result[$i]);
foreach($post as $key => $value)
fputs($this->server, 'PRIVMSG '.$nick.' :'.$value.n);
}
Bu sekılde her mesaj oncesı 1sn duraklıyarak sunucun flood yaptıgımı sanmasının onune gecebılırım.. Ama bu 1sn lık bekleme o anda bottan gorev talep eden herkesı yada tum scrıptı durduracagı ıcın yapmak ıstemedıgım bısey..
Acemının soyledıgıne gore bununda onune cok kanallı (multi thread mıydı?) bı yapı gelıstırılerek gecılebılırmıs.. Ama buda benı asıyor halıyle : ) Dahası PHP'nın buna ımkan verıp vermedıgını dahı bılmıyorum...
Evet bu durumda bana neler onerırsınız?
Sunucudan atildiginda while (!feof($this->server)) dongusunden cikiyor olman lazim, yani baglanti kapaniyor/kopuyor. Bu kopmanin senin kontrolunde mi, yoksa baska nedenle mi oldugunu kontrol edip duruma gore tekrar kodlari bastan baslatabilirsin.
$this->closecode geldiyse bu kontrolu ayrilmadir. Gelmediyse, bot'un tekrar baglanmasi gerekir.
Anladım... Yanı dongu bıtımınde hemen $this-Run() demek mumkun.. Ama $this-closecode olmadıgı surece...
Evet ama yalniz bunu yaparken class yapisini bozmamak lazim. Ornegin donguden neden cikildigini, global bir degisken yardimiyla takip etmemek lazim. Bunun yerine Run()'in dondurdugu degere gore bu anlasilabilmeli...
Disconnect()'deki exit ile programi kesmek de iyi bir yontem degil. Programi boyle aniden kesmek yerine, duzgun bir sekilde donguden cikmak ve normal yollardan programdan cikmak daha iyi...
omerosmanoglu
21/07/2003, 15:26
Buralarda neler oluyorda haberimiz yok şu rating özelliğini kullanmak lazım.
Sanırım bu defa oldu :) Kodların yenı halı burda.. http://www.gazetebogaz.com/Domain/Ceviz/Project/CevizBot/cevizbot.php.txt
Ama bıraz salla patı oldu :) Senın dedıgın sekılde yapmak ıcın sanırım her olaydan sonra bırde gerıbıldırım yapmalıyım.. Ama ustunde ugrasırsam neden olmasın...
Tekrar selam.. Soyledıgın sekılde Run methodunu while dongusu ıcıne alarak method ıcınde method cagrılmasının onune gectım.. Ardından kodu bıraz derleyıp toplarmak adına yenı bıkac method ekleyerek, varolan methodların adlarını da bı parca degıstırdım.. Ve part,join,nick gıbı olaylarıda loga dahıl ettım..
Neyse sorun sukı ırc sunucuya mesaj gonderımını merkezı hale getırmek ıcın ekledıgım BotPuts methodu nedense declare edılmıyor.. Kendısı ılk olarak BotConnect methodu ıcınde cagrıldıgı ve bu methoddan once yer aldıgı halde Call to undefined function hatasını alıyorum.. Icınden cıkamadım.. Kodların yenı halı surda..
http://www.gazetebogaz.com/Domain/Ceviz/Project/CevizBot/cevizbot.php.txt
Sızce neden bu hatayı alıyorum?
BotPuts('NICK '.$this->nick);
yerine
$this->BotPuts('NICK '.$this->nick);
olmayacak mi?
:) Kafam durmus sanırım... Son duzenlemelerıde yaptıktan sonra bot artık ellerınızden oper redial hocam : ) Eklemek cıkarmak ıstedıgınız bısey olursada ben yıne buralardayım nasıl olsa..
cevizbot.php: http://www.gazetebogaz.com/Domain/Ceviz/Project/CevizBot/cevizbot.php.txt
cevizparse.php: http://www.gazetebogaz.com/Domain/Ceviz/Project/CevizBot/cevizparse.php.txt
eee... botu kanala sokmayacak misin?
bot tamamsa, benimkini kapatayim, seninki calissin artik.
Valla redial ses etmeyınce bende etmedım.. Sanırım bıde senınkını kaldırmak ıcın cevize kanaldakı kısılerı post eden kısmıda yazmalıyım..
Neyse ben yazarken redialda gelır.. O kullanalım derse kullanırız..
cevizbot.php: http://www.gazetebogaz.com/Domain/Ceviz/Project/CevizBot/cevizbot.php.txt
cevizparse.php: http://www.gazetebogaz.com/Domain/Ceviz/Project/CevizBot/cevizparse.php.txt
Tamam, sanırım bu halıyle ısımızı gorur.. Bota ıkı yenı metod (TaskGetUsersList, TaskPutUsersList) ve bır yenı gorev daha ekledım (!names).. Henuz kullanıcı lıstesını post etmıyor (onayınız beklıyor) ama sımdılık kanala paste edıyor..
Evet sımdı top yıne redialda :)
Mingitau
27/07/2003, 15:25
elleşmeyin Redial e... :D
Alakasız ama baska yerde de sorulmaz herhalde.. Sorun su ben bu botun calısmasını sureklı kılmak ıcın basıt bı batch yazdım.. (Hanı su dosta calısan kutuk dosyalarından)
@echo off
:run
C:\Apache\php\php.exe D:\Document\Web\Ceviz\Project\CevizBot\cevizbot.ph p
goto run
Bu sayede herhangı bı sebepten dolayı botun calısması durursa (timeout gıbı..) otomatık olarak calısmaya devam edecek... Ama tek bı durumda bu dongunun kırılması ıstıyorum oda kanalda !close parola denmesı.. Bu durumda hatırlıyanınız varmı calısan uygulamadan deger almak ıcın ne yapılıyodu batch yazarken? %1 yada %%f gıbı bıseydı ama..
Programi konsoldan calistirdigin zaman timeout yuzunden kesilmemesi lazim.
Neden oldugunu bılmıyorum ama bı kac kez calısma durdu.. Log dosyasıda kapatılmadıgı ıcın timeout aldıgını en azından !close ıle kapanmadıgını dusundum.. Bıde su var kanalda read eror hatası belırdı ve sonra botun calısması sona erdı.. Belkıde agdakı bı duraksama yuzunden uzun sure sunucuya cevap veremedı bot ve sunucuda baglantımızı kestı..
Yınede herseye ragmen bu tıp bı tedbır almak gerekıyor sanırım.. Yoksa saat bası botun calısıp calısmadıgını kontrol etmemız gerekıyor..
Top yine taca cikti
Lütfen "taç çizgisinden oyun alanı dışına çıktı" demek gerekiyor. :yaaa: :p
Hakme yapılacak olan her itiraz ihtar (Sarı kart :D) ile cezalandırılacaktır. :D
Redial gözükmüyor bu aralar.
-_-
Ya redial'ın telefonunu fılan bılen varmı? Basına bısey gelmıs olmasın bu adamın? Cunku Ceviz Team'ede hıc bısey yazmamıs..
Bot'u Linux makineye kurmak icin gerekli notlari kodlarin icine koydum. Son haliyle (hepsi ayni sey, format farkli):
sinbad.pl.html (http://geocities.com/acemi17/sinbad.pl.html)
sinbad.pl.txt (http://geocities.com/acemi17/sinbad.pl.txt)
sinbad.pl (download) (http://geocities.com/acemi17/sinbad.pl)
Karamano
31/07/2004, 16:44
irc chat de kim online oldugu sitemde nasil gosterebilecegim?
benim fazla php bilgim yok yardimci olursaniz sevinirim
CodeMania
09/02/2005, 20:37
arkadaşlar şimdi belki benim sorum bu botlardan çok daha basit birşey oalcak . irc sunucumdaki kayıtlı kullanıcıların sitede de aynı kullanıcı adı ve şifre ile giriş yapabilmelerini ve siteden uye olanlarında aynı şekilde irc den aynı kullanıcı adı ve şifre ile giriş yapabilmelerini istiyorum.
siteden yada irc sunucusundan kayıt yapan her iki taraftada aynı kullanıcı adı ve şifre haklarını almış oalcaklar. ve sitede bir sayfa düzenleyip irc de şu anda online kayıtlı kim var görebileyim istiyorum. Ama bunun için nasıl bişi yapmalıyım.
Matkap sesleri arasında soruyu anca bu akdar düzgün sora bildim kusura bamayın..
Ceviz'de kullandigimiz bot'un kodlari linkte yer almakta:
http://www.geocities.com/acemi17/sinbad_0.01.0023.pl.txt
Bunu calistirmak icin:
* Internet'e surekli bagli, Perl yuklu Linux/Unix bir makine
* bu makineye ssh ile baglanma ve bot calistirma hakki
* kodlarin ustunde yazan aciklamalari okuyacak ve bunlari uygulayabilecek sabir
gerekmektedir.
Web sitenizin destekledigi dillerden (ASP, PHP vs) birisi ile basitce kod yazabiliyorsaniz, botun gonderdigi verileri okuyup web sitenizde gosterebilirsiniz.
CodeMania
15/02/2005, 05:01
Teşekurler. yaptığımda buraya gerekenleri yazacağım.
arkadaslar ben botu calistirdim calistirmasina ama bazi linkler olmus durumda bu linkleri aktif etmeniz mumkunmudur acaba?
simdiden tesekkurler.
Ve sonunda ıstenen oldu :) Amacı bellı olmasada bot ıs goruyor.. Unutmadan kapanması ıcın ona kanalda "kapan bot" demenız gerekıyor :)
<?
# Zaman sınırlaması yok.. (Tıme out almamak ıcın)
set_time_limit(0);
ob_start();
# Yankının yapılacagı kullanıcı ve kapatma mesajı
$sahip = 'HunTER__';
$kapat = 'kapan bot';
# Gereklı degıskenler
$n = "\n";
$nick = 'HunTER_BOT';
$kanal = 'ceviz';
$uzaksunucu = 'irc.freenode.net';
$yerelsunucu = 'adsluser-2866.adsl.ttnet.net.tr';
$port = 6665;
$dosya = fopen("log.txt","w+");
$sunucu = fsockopen ($uzaksunucu, $port, $hatano, $hatastr, 0);
# Baglantıda hata olusursa
if (!$sunucu)
{
echo 'Sunucuya Bağlanamadı';
}
else
{
# Sırasıyla nıkı, kullanıcıyı belırle ardından kanala gır ve selam ver
fputs($sunucu, 'NICK '.$nick.$n);
fputs($sunucu, 'USER '.$nick.' '.$yerelsunucu.' '.$uzaksunucu.' : '.$nick.$n);
fputs($sunucu, 'JOIN #'.$kanal.$n);
fputs($sunucu, 'PRIVMSG #'.$kanal.' :Selam Kanal'.$n);
while (!feof($sunucu))
{
$veri = fgets ($sunucu,128);
fputs($dosya,$veri);
# Pıng gelırse Pong Gonder
if(preg_match("'PING(.*?)'si", $veri, $set))
fputs($sunucu,'PONG '.trim($set[1]).$n);
# Kanal lıstesını al ve bunu bı $isimler ıcınde sakla
if(preg_match("':(.*?)353(.*?) :(.*?)'Ui", $veri, $set))
$isimler .= trim($set[3]);
# Eger kanala bı mesaj yazıldıysa
if(preg_match("':(.*?)!(.*?)PRIVMSG #".$kanal." :(.*?)'Ui", $veri, $set))
{
# Yazılan mesaj kapanma mesajıysa botu kapat
if(trim($set[3]) == $kapat)
{
# Isım lıstesını bas ve hoscakal de
fputs($sunucu, 'PRIVMSG #'.$kanal.' :Hoşçakalın, '.$isimler.$n);
fclose ($sunucu);
fclose ($dosya);
exit;
}
# Yazılan mesajı sahıbe echo et (test amaclı)
else if(trim($set[1]) != $nick)
{
fputs($sunucu,'PRIVMSG '.$sahip.' :'.trim($set[3]).' '.trim($set[1]).$n);
}
}
}
}
?>
Yaptıgı hıc bısey yok aslında.. Sadece kanala gırıyor selam verıyor ardından kanala yazılan herseyı $sahıp e yankılıyor.. Ve "kapan bot" denıldıgınde $ısımler ı basıp hoscakal dıyor.. Ve kapanıyor.. Hepsı bu :)
Ama dılersenız botun bı amacı olabılır tabı :) Benım aklıma bısey gelmedı henuz..
Mırç girişi şifreli biyere nasıl sokarız birde ident nasıl yaparız bota bunu acaba
aslında benim amacım botu irc ye baglayıp kanal sayısını alıp webte gostermek bu konuda yardımcı olabılırmısınız bana acaba ?
Botu kanala girdikten sonra kanala da girmesine gerek yok artık, names #kanalın adı komutuyla kanalda bulunanların rumuz bilgileri getirilebiliyor.
Komutun tam kullanımı şu şekilde : /names #kanalın adı
Python ile yapılması daha performanslıdır.
Belki vardır forumda.
Forum Yazılımı : vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.