Lompat ke konten Lompat ke sidebar Lompat ke footer

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 = &lt;$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 = &lt;$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 = &lt;$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 "&lt;$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 = &lt;$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 = &lt;$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 = &lt;$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 "&lt;$nick> $text";

      

        if($text = /hi lnxbot/gi){

            print $sock "PRIVMSG #channel :hi $nick\n";

        }

    }

}

Ok geass Mungkin hingga di Sini dulu...Penjelasanya