Bot Irc
Bare Bones IRC Bot In Perl.
Ini yaitu panduan singkat untuk menciptakan bot perl Anda sendiri yang akan bekerja pada irc. Saya tidak akan membahas semua modul dan cara yang berbeda untuk terhubung ke perintah irc dan masalah. Ini hanya akan meliputi koneksi dengan IO :: Socket dan memakai perintah raw irc. Saya merasa Anda berguru paling banyak dengan cara ini dan mempunyai banyak kendali atas apa yang sedang terjadi.
Pengalaman IRC sangat membantu, tetapi saya akan melaksanakan hal-hal yang cukup lambat sehingga seorang pemula mutlak sanggup memahami apa yang sedang terjadi. Ini juga akan membantu mereka dengan pengetahuan alittle sepenuhnya memahami protokol irc. Meskipun saya bukan hebat irc, sehabis menciptakan bot ini saya berguru beberapa trik.
Kami memulai dengan menciptakan koneksi:
#!/usr/bin/perl
use IO::Socket;
$sock = IO::Socket::INET->new(
PeerAddr => 'irc.undernet.org',
PeerPort => 6667,
Proto => 'tcp' ) or die "could not make the connection";
Anda sanggup memakai server irc dan port apa saja (port yang umum dipakai yaitu 6667-7000), begitu lama
karena mereka valid. Jika Anda mengalami masalah, coba cari server lain untuk itu
jaringan. Untuk mempermudah Anda sanggup menciptakan PeerAddr variabel yang
ditentukan oleh argumen dari baris perintah. Atau purhaps memetakan semua server
pada jaringan dan menciptakan arry dari mereka, menghubungkan ke yang acak dan menggunakan
koneksi terbaik. Ada banyak kemungkinan, masing-masing bekerja dengan sangat baik
situasi. Kami akan tetap pada alamat dan port yang keras dan sederhana.
Sekarang kita mempunyai koneksi ke server. Kami masih perlu terhubung / masuk ke
ircd. Semua yang kami kirim atau terima dari server akan melalui $ sock. Begitu
mari kita lihat apa yang server kirimkan kepada kami sehabis kami menciptakan koneksi.
while($line = <$sock>){
print "$line\n";
}
Kami akan melihat bahwa server mencetak beberapa baris. Setiap baris akan mempunyai angka
representasi untuk itu. Ini akan sangat membantu untuk memberi tahu bot kapan harus memulai dan mengakhiri
rutinitas. Kuncinya di sini yaitu garis dengan 'NOTICE AUTH' di dalamnya. Ini ketika kita butuhkan
untuk masuk ke server irc. Untuk melaksanakan ini kami kirim
NICK bots_nick<br>
USER bots_ident 0 0 :bots name
Dengan jeda baris sehabis bots_nick dan jeda baris di pecahan akhir. Makara di loop sementara
kami akan menambahkan sesuatu menyerupai ini:
while($line = <$sock>){
print $line;
if($line = /(NOTICE AUTH).*(checking ident)/i){
print $sock "NICK b0ilersbot\nUSER bot 0 0 :just a bot\n";
last;
}
}
Sekarang kita selesai dengan proses login. Jika Anda mengalami masalah, cobalah untuk membaca
pada protokol irc dan cara masuk ke dalamnya dengan telnet. Raven dari www.securitywriters.org
telah menulis tutorial yang layak perihal dilema ini, mencarinya.
Beberapa server akan meminta ping untuk memastikan klien aktif. Ini gres selesai
pada beberapa server dan merupakan perangkap umum untuk banyak bot yang tidak mendukung jenis ini
masuk proses masuk. Untuk menangani ini kami akan mengusut apakah server menginginkan kami melaksanakan ping.
Server akan meminta ping sebelum menanyakan perihal pendaftaran / identifikasi nickserv,
jadi kami akan menghentikan loop ini sehabis menyebutkan nickserv. Ini yaitu angka-angka itu
yang terakhir kalau statment untuk, 376 | 422. Cara mengidentifikasi ke nickserv yaitu menyerupai ini
NICKSERV :identify nick_password
ini hanyalah perintah irc sederhana. Perintahnya yaitu 'NICKSERV' dan argumennya
'identifikasikan nick_password' di mana nick_password yaitu kata sandi yang bergotong-royong untuk nick ini. Itu
baris berakhir dengan putus baris dan semua perintah irc berada dalam abjad besar. Ketika ada:
sebelum sesuatu itu berarti itu yaitu argumen beberapa kata (memiliki spasi di dalamnya). Ini adalah
bagaimana kita akan menangani ping yang mungkin dan identifikasi nickserv.
while($line = <$sock>){
print $line;
#use next line if the server asks for a ping
if($line = /^PING/){
print $sock "PONG :" . (split(/ :/, $line))[1];
}
if($line = /(376|422)/i){
print $sock "NICKSERV :identify nick_password\n";
last;
}
}
Jika Anda ingin mempunyai isyarat registrasi, Anda sanggup menemukannya sendiri .. atau melaksanakan apa yang saya lakukan
lakukan dan daftarkan nick dengan klien irc normal. Dengan cara ini kita hanya membutuhkan bot
mengenali.
Ketika Anda menciptakan bot Anda, Anda sanggup menyesuaikannya sesuai impian Anda. Sebagian besar bot saya miliki
sedikit lebih sedikit AI maka tutorial ini menunjukkan. Bot ini akan menjadi pelafalan yang cukup selat
dan tidak menciptakan banyak keputusan. Itu hanya menghubungkan dan melaksanakan sesuatu.
Saya suka menciptakan bot tidur selama beberapa detik hanya untuk menciptakan koneksi terputus.
Saya berada di 56k dan hal-hal sanggup lambat kadang-kadang. Beberapa kali tanpa tidur dengan bot
telah bergabung susukan sebelum identifikasi nickserv selesai, ini sanggup menjadi sakit
di leher kalau bot membutuhkan usermode atau keadaan lain yang membutuhkan nick
untuk diidentifikasi (seperti bot lain, mode susukan + R, atau dilema kepercayaan dengan pengguna).
Setelah tidur, dia akan bergabung dengan saluran. Anda akan melihat bahwa server mencetak banyak
informasi perihal susukan ketika Anda bergabung. Anda sanggup menyimpan informasi ini
variabel untuk memungkinkan bot menciptakan banyak keputusan. Sekali lagi, ini yaitu bot sederhana dan
tidak akan sadar akan lingkungannya atau menjadi dinamis. Tetapi Anda sanggup misalnya
mengaktifkan / menonaktifkan warna dengan mode susukan apa yang disetel atau siapa yang ada di susukan (beberapa orang
benar-benar benci warna). Ini yaitu bit terakhir dari proses masuk, sehabis ini bot
dapat benar-benar melaksanakan sesuatu.
sleep 3;
print $sock "JOIN #channel\n";
Perhatikan tidak ada: sebelum #channel. Ini sebab tidak ada ruang di dalamnya.
Dan perintah GABUNG ada di semua topi. Untuk daftar lengkap perintah, coba baca tutorial
pada protokol IRC. Saya bahkan tidak membahas dasar-dasar di sini, ada aneka macam manfaat untuk diketahui
perintah.
Sekarang kami bergabung dengan saluran. Tidak ada yang sanggup dilakukan selain membaca pesan
pengguna mengirim ke susukan dan menanggapi mereka. Tetapi inorder untuk membaca pesan yang kita butuhkan
untuk mem-parse mereka sehingga masuk akal. Format priv_msg yaitu sebagai berikut:
:nick!ident@hostname.com PRIVMSG #channel :the line of text
Saya ingin memisahkan mereka ke dalam variabel berikut untuk menciptakan semuanya lebih gampang untuk dilacak.
:$nick!$hostname $type $channel :$text
dalam teladan ini di sini yaitu nilai-nilai variabel:
$nick = nick<br>
$hostname = ident<br>
$type = priv_msg<br>
$channel = #channel<br>
$text = the line of text
Jadi kita akan perlu mengurai apa yang dikirim dari server ke dalam data yang sanggup digunakan. Ini adalah
bagaimana kita akan melakukannya. Hanya ada satu sentuhan di sini, dan itu memetikan server mengirim
ping. Mereka melaksanakan ini cukup sering untuk mengusut dan melihat apakah Anda masih terhubung. Jika tidak
balas ping itu maka kita akan terputus. Ketika server mengirim ping Anda
harus membalas dengan PONG dan karakter yang sama dengan ping. Makara beginilah cara kami mengirimkannya
while ($line = <$sock>) {
($command, $text) = split(/ :/, $line); #$teks yaitu barang dari ping atau teks dari server
if ($command eq 'PING'){
#sementara ada jeda baris - banyak cara berbeda untuk melaksanakan ini
while ( (index($text,"\r") >= 0) || (index($text,"\n") >= 0) ){ chop($text); }
print $sock "PONG $text\n";
next;
}
#done with ping handling
($nick,$type,$channel) = split(/ /, $line); #split by spaces
($nick,$hostname) = split(/!/, $nick); #split by ! to get nick and hostname seperate
$nick = s/://; #remove :'s
$text = s/://;
#get rid of all line breaks. Again, many different way of doing this.
$/ = "\r\n";
while($text = m#$/$#){ chomp($text); }
#end of parsing, now for actions
}
baik. Itu yaitu pecahan isyarat yang agak besar dan beberapa pecahan agak membingungkan. Kebanyakan
itu hanya menyingkirkan apa yang tidak kita inginkan dan memisahkan apa yang kita inginkan menjadi variabel.
Bit selanjutnya hanya untuk penampilan. Kami mencetak apa yang dikatakan seakan-akan ini yaitu klien irc normal.
if($channel eq '#channel'){
print "<$nick> $text";
}
Cek $channel diharapkan memetikan orang-orang priv_msg atau melihat Anda hal-hal. Ini sanggup menjadi
masalah ketika berhadapan dengan bot yang perlu kondusif atau sanggup menjadikan sakit kepala yang besar saat
ada yang salah. Saya akan meninggalkan berurusan dengan beberapa susukan kepada Anda. Tetapi untuk mengirim Pemberitahuan
Anda cukup melakukan: print $sock "NOTICE nick: baris teks di sini \ n"; dan mengirim
priv_msg Anda lakukan: cetak $sock "PRIVMSG nick: baris teks di sini \ n";
Sekarang struktur bot sudah selesai. Segala sesuatu yang dibutuhkan sudah selesai, satu-satunya hal yang tersisa untuk dilakukan
adalah custimize bot Anda untuk memilikinya melaksanakan apa yang ingin Anda lakukan. Ini sanggup hampir apa pun
tugas dibayangkan. Cukup parsing $ text $ nick dan variabel lain yang kami buat
memiliki bot menciptakan keputusan perihal apa yang harus dilakukan.
Berikut yaitu bot final secara keseluruhan. Saya menambahkan satu bit hanya untuk menandakan bahwa bot bekerja:
#!/usr/bin/perl
use IO::Socket;
$sock = IO::Socket::INET->new(
PeerAddr => 'irc.undernet.org',
PeerPort => 6667,
Proto => 'tcp' ) or die "could not make the connection";
while($line = <$sock>){
print $line;
if($line = /(NOTICE AUTH).*(checking ident)/i){
print $sock "NICK lnxbot\nUSER bot 0 0 :just a bot\n";
last;
}
}
while($line = <$sock>){
print $line;
#use next line if the server asks for a ping
if($line = /^PING/){
print $sock "PONG :" . (split(/ :/, $line))[1];
}
if($line = /(376|422)/i){
print $sock "NICKSERV :identify nick_password\n";
last;
}
}
sleep 3;
print $sock "JOIN #channel\n";
while ($line = <$sock>) {
($command, $text) = split(/ :/, $line); #$text is the stuff from the ping or the text from the server
if ($command eq 'PING'){
#while there is a line break - many different ways to do this
while ( (index($text,"\r") >= 0) || (index($text,"\n") >= 0) ){ chop($text); }
print $sock "PONG $text\n";
next;
}
#done with ping handling
($nick,$type,$channel) = split(/ /, $line); #split by spaces
($nick,$hostname) = split(/!/, $nick); #split by ! to get nick and hostname seperate
$nick = s/://; #remove :'s
$text = s/://;
#get rid of all line breaks. Again, many different way of doing this.
$/ = "\r\n";
while($text = m#$/$#){ chomp($text); }
if($channel eq '#channel'){
print "<$nick> $text";
if($text = /hi lnxbot/gi){
print $sock "PRIVMSG #channel :hi $nick\n";
}
}
}
Ok geass Mungkin hingga di Sini dulu...Penjelasanya