Το προφίλ μας στο Google Plus
3

IRC Bots

> Hello, I am Eliza.

* Hello Eliza, how are you?

> Why are you interested in whether or not I am ?

* Because I care about you.

> We were discussing you, not me.

* OK, sorry.

> Please don’t apologize!

Ο παραπάνω διάλογος είναι μεταξύ ενός ανθρώπου και μιας μηχανής ή αλλιώς ενός robot (ή καλύτερα ενός bot, όπως συνηθίζεται να λέγεται τελευταία). Θα πείτε τώρα «Ε, εντάξει, που είναι το περίεργο;». Χμ, το περίεργο ή καλύτερα το ενδιαφέρον της υπόθεσης, είναι ότι ο παραπάνω διάλογος έλαβε χώρα το 1966! Ναι, καλά διαβάσατε, ένα έτος που κατ’ αντιστοιχία με την ιστορία της γης θα εντασσόταν κάπου μέσα στην πλειστόκαινο περίοδο. Κι όμως, πρόκειται για ένα πρόγραμμα το οποίο αναπτύχθηκε από τον Joseph Weizenbaum και προσομοιώνει μια ψυχοθεραπεύτρια, την Eliza (με την οποία μπορείτε να μιλήσετε ακόμα και σήμερα –αν και είναι λίγο μεγαλούτσικη για bot- σε αυτή τη σελίδα. Με σεβασμό όμως, ε;).

Απ’ ότι καταλάβατε, λοιπόν, τα bot που μιλάνε με ανθρώπους είναι παλιά ιστορία. Αν θέλουμε να επεκτείνουμε λίγο το θέμα, θα λέγαμε ότι παλιά ιστορία είναι και η Τεχνητή Νοημοσύνη (Artificial Intelligence, AI), δηλαδή ο κλάδος εκείνος της πληροφορικής που προσπαθεί να κάνει τις μηχανές να μιμούνται τους ανθρώπους (σε όλα τα επίπεδα). Εμείς εδώ θα προσανατολιστούμε στην επικοινωνία μέσω γραπτού διαλόγου (chat), η οποία βέβαια είναι ένα απειροελάχιστα μικρό κομμάτι του παζλ. Θα φτιάξουμε ένα πολύ μικρό και απλό πρόγραμμα που να μπορεί να μιλάει με ανθρώπους. Αναρωτιέστε πού θα συχνάζει; Μα, πού αλλού; Σ’ ένα από τα γνωστότερα ηλεκτρονικά στέκια συζητήσεων: το IRC (Internet Relay Chat).

Μπαίνοντας σε ένα “dwmatiaki” για κουβεντούλα!

Το IRC είναι μια ιντερνετική υπηρεσία που προσφέρει τη δυνατότητα online συζητήσεων σε όλα τα μέλη της, απ’ όλο τον κόσμο. H συζητήσεις γίνονται μέσω κάποιων συγκεκριμένων server. Στην Ελλάδα, το GR-Net εδώ και αρκετά χρόνια παρέχει αυτές τις υπηρεσίες. Αρκετοί server χρησιμοποιούνται για να εξυπηρετήσουν το GR-Net, όπως οι dionysos.irc.gr, nana.irc.gr κ.ά. Όλοι εμείς, οι «κοινοί» χρήστες που θέλουμε να μιλήσουμε, συνδεόμαστε σ’ αυτούς τους server μέσω κάποιων προγραμμάτων που ανήκουν στην κατηγορία των λεγόμενων IRC client. Τέτοια προγράμματα είναι το mIRC (για Windows, βλ. παραπάνω εικόνα), το XChat (για Linux και Windows) και πολλά άλλα.

Το πρόγραμμα που θα δείξουμε εδώ τρέχει κάτω από τα Windows Vista και θα χρησιμοποιήσουμε τον IRC client mIRC. Αλλά το ίδιο ακριβώς αποτέλεσμα θα έχετε (χωρίς καμία αλλαγή, το έχουμε δοκιμάσει ήδη) και σε Ubuntu Linux, με χρήση του Xchat. Ως συνήθως, η γλώσσα που θα χρησιμοποιήσουμε για να φτιάξουμε το Bot μας, είναι η Perl. Θεωρούμε δεδομένο ότι είναι ήδη εγκατεστημένη στο σύστημα σας (μπορείτε να την κατεβάσετε από εδώ). Δεν μπορούμε να παραλείψουμε ν’ αναφέρουμε ότι ο κώδικας Perl του bot έτρεξε χωρίς καμιά αλλαγή και στο Linux μας. Φυσικά, γι’ αυτό παίρνει τα εύσημα πιο πολύ η ίδια η Perl, η οποία τρέχει και στα δύο συστήματα χωρίς προβλήματα συμβατότητας.

Πρώτα απ’ όλα θα πρέπει να σκεφτούμε τι θέλουμε να κάνει το bot μας. Καλό είναι ν’ αποφασίσουμε ευθύς εξαρχής και να μην έχουμε παλινωδίες (ο όρος προστέθηκε από τον αρχισυντάκτη, ο οποίος πάντα ήθελε να τον χρησιμοποιήσει μπας και καταλάβει τι έχει κι αρέσει τόσο πολύ στους πολιτικούς – ακόμα να καταλάβει…) στην πορεία. Επίσης, θα πρέπει ν’ αποφασίσουμε ποιος θα ‘ναι ο ρόλος του. Υπάρχουν διάφοροι ρόλοι που έχουν ήδη αναλάβει διάφορα bot στο IRC. Μερικοί απ’ αυτούς είναι να καλωσορίζουν τους χρήστες, να προσέχουν κακές λέξεις (και να βάζουν πιπέρι σ’ όσους τις λένε), να πετάνε έξω από το chat room όσους είναι πολύ άτακτοι κ.ο.κ. Επίσης, πιο εξελιγμένα bot λειτουργούν κι ως διαχειριστές παιχνιδιών που παίζονται στο IRC. Για παράδειγμα, το bot του trivial αναλαμβάνει να κάνει ερωτήσεις και ν’ αποφασίζει ποιος χρήστης απάντησε σωστά μέσα σε συγκεκριμένο χρονικό διάστημα.

Το δικό μας botάκι θα είναι πολύ πιο απλό. Στόχος μας είναι να το κάνουμε όσο το δυνατόν πιο «ανοικτό», ώστε ν’ αποτελέσει μια βάση για περαιτέρω ανάπτυξη και εξέλιξη σ’ οτιδήποτε εσείς αποφασίσετε. Ναι, μπορεί εμείς να το γεννήσαμε, όμως εσείς θα το μεγαλώσετε και θα το διαπαιδαγωγήσετε! Τι από τα δύο νομίζετε ότι έχει μεγαλύτερη σημασία;

Καιρός όμως να δώσουμε τα αρχικά γονίδια που θα δώσουν μορφή στο botάκι μας. Χμ, θα το θέλαμε ντροπαλό, ευγενικό και υπάκουο. Αυτά είναι τα αρχικά στοιχεία που θα το χαρακτηρίζουν:

use IO::Socket;
$srv = IO::Socket::INET->new(PeerAddr=>'dionysos.irc.gr',
	PeerPort=>'6667',
	Proto=>'tcp',
	Timeout=>'30') || print "Cannot wait more... 30 secs already passed ! $!\n";

print $srv "USER Botakiii kalo kai 8aymatoyrgo\r\n";
print $srv "NICK ThiseasPerlPet\r\n";
print $srv "JOIN #Dwmatiaki\r\n";

while($response = <$srv>)
{
	print $response; #Show server reply on the console.

	if (($response =~ /PRIVMSG/) && ($response =~ /ThiseasPerlPet nani/i))	
	{
		print $srv "PRIVMSG #Dwmatiaki :Bye bye paw gia nani ;-)\r\n"; 
		print $srv "PRIVMSG #Dwmatiaki :/quit"; 
		exit;  
	}
	if (($response =~ /PRIVMSG/) && ($response =~ /ThiseasPerlPet/i))	
	{
		print $srv "PRIVMSG #Dwmatiaki :Aaaa... mi lete to onoma mou... ntrepomai!\r\n"; 
	}
	if ($response =~ m/^PING (.*?)$/gi) 
	{
		print $srv "PONG ".$1."\r\n";
	}
}
Ανάλυση
  • Γραμμή 1: Εδώ χρησιμοποιούμε την έτοιμη βιβλιοθήκη επικοινωνίας sockets. Πρόκειται για βασικό εξάρτημα ώστε να μπορούμε να επικοινωνούμε με τον έξω κόσμο, δηλαδή με το Διαδίκτυο.
  • Γραμμές 2-5: Πραγματοποιείται η σύνδεση με τον IRC server dionysos.irc.gr, μέσω της θύρας 6667. Το πρωτόκολλο επικοινωνίας δηλώνεται ότι θα είναι το TCP και ο χρόνος αναμονής για να πραγματοποιηθεί η σύνδεση στα 30".
  • Γραμμές 7-9: Ορίζουμε το όνομα του χρήστη στο IRC, τον nick name που θα έχει το botάκι μας, καθώς και το δωμάτιο (chat room) το οποίο θέλουμε να επισκεφτεί!
  • Γραμμές 11-29: Εδώ ορίζεται αυτό που οι προγραμματιστές ονομάζουν loop: Μια διαδικασία που επαναλαμβάνεται συνέχεια ή, ακριβέστερα για την περίπτωσή μας, όσο ισχύει η συνθήκη ($response = <$srv>), δηλαδή συνέχεια! Μέσα εδώ θα βάλουμε αυτό που θέλουμε να κάνει το bot μας, καθώς επίσης και κάποιες υποχρεωτικές εντολές για να δείχνουμε ότι το bot μας είναι… ζωντανό!
  • Γραμμές 13: Όταν εκτελέσουμε το πρόγραμμά μας από την γραμμή εντολών, (βλ. την επόμενη εικόνα), αυτή η εντολή θα εμφανίζει στην οθόνη τις εντολές που μας στέλνει ο server (δηλαδή ο dionysos.irc.gr).
  • Γραμμές 15-20: Όταν κάποιος χρήστης γράψει κάτι που να περιλαμβάνει τις λέξεις «ThiseasPerlPet nani», το bot θα θεωρήσει ότι το στέλνει για ύπνο, οπότε θα μας αποχαιρετάει και θα φεύγει ήσυχα – ήσυχα (είπαμε, το θέλουμε ευγενικό και υπάκουο!)
  • Γραμμές 21-24: Όταν κάποιος χρήστης γράψει κάτι που να περιλαμβάνει το όνομα του bot μας (δηλαδή το ThiseasPerlPet), τότε εκείνο θα απαντά «Aaaa… mi lete to onoma mou… ntrepomai!», καθώς είπαμε ότι θα είναι και ντροπαλό!
  • Γραμμές 15-28: Σε τακτά χρονικά διαστήματα κάθε IRC server κάνει έλεγχο για το εάν οι clients είναι live, δηλαδή συνδεδεμένοι σ’ αυτόν. Αυτό το κάνει στέλνοντας μια εντολή PING. Αν ο client δεν απαντήσει τότε ο server θα θεωρήσει ότι είναι ανενεργός και θα διακόψει την επικοινωνία. Σ’ αυτή την περίπτωση θα δούμε, στο τερματικό (βλ. γραμμή 13), το μήνυμα του server:
    PING :dionisos.irc.gr
    ERROR :Closing Link: xxxx.xxxx.gr (Ping timeout)
    

    Οπου xxxx.xxxx το IP μας. Για να το αποφύγουμε αυτό πρέπει να βάλουμε τις παραπάνω γραμμές στον κώδικά μας, ώστε αν λάβουμε από τον server μια εντολή τύπου PING ν’ απαντήσουμε όπως προβλέπεται, δηλαδή μ’ ένα PONG (μήπως η ονοματολογία σας θυμίζει κάποιο παιχνίδι;). Σ’ αυτή την περίπτωση, ανά τακτά χρονικά διαστήματα θα βλέπουμε στο τερματικό τα παρακάτω:

    PING :dionisos.irc.gr
    ...
    PING :dionisos.irc.gr
    ...
    
Η ώρα της αλήθειας

Ώρα να τρέξουμε το mIRC και να μπούμε στο δωματιάκι με όνομα “#dwmatiaki” (βλ. πρώτη εικόνα). Από ένα τερματικό πληκτρολογούμε perl bot1.pl.

Τρέχουμε το botάκι μας από γραμμή εντολών...

Όλα τα μηνύματα του IRC server εμφανίζονται στην κονσόλα μας (γραμμή εντολών). Αν όλα πήγαν καλά θα δούμε το botάκι να κάνει την εμφάνιση του στο room #dwmatiaki:

To bot μπαίνει στο chat room...

Ας αρχίσουμε το διάλογο μαζί του, για να δούμε πώς συμπεριφέρεται. Αρκεί ν’ αναφέρουμε το όνομα του και θα το πιάσουν οι ντροπές.

To bot μας είναι... ντροπαλό!

Εντάξει, αρκετά το κουράσαμε το bot μας. Άλλωστε είναι ακόμα μικρό, οπότε δεν έχει μάθει πολλές λέξεις. Καιρός λοιπόν για νάνι! (βλ. εικόνα 5).

To bot μας είναι ακόμα μικρό και πάει νωρίς για νάνι :-)

Συμπεράσματα

Παρουσιάσαμε τις βασικές αρχές για τη δημιουργία ενός IRC bot. Στην πραγματικότητα, το πρόγραμμα που σας δείξαμε είναι ένας σκελετός ή ένα template, αν θέλετε, το οποίο μπορεί να χρησιμοποιηθεί για ν’ αναπτύξετε το δικό σας bot. Μην ξεχνάτε όμως αυτό που είπαμε στην αρχή: Πριν ξεκινήσετε θα πρέπει να έχετε αποφασίσει τι θέλετε να φτιάξετε. OK, δεν είναι ανάγκη να έχετε προαποφασίσει κάθε λεπτομέρεια, αλλά ο στόχος πρέπει να είναι ξεκάθαρος. Οι εφαρμογές είναι απεριόριστες. Ιδού μερικές:

  • Bot που εκτελεί χρέη operator
  • Bot που παίζει κάποιο παιχνίδι με τους χρήστες
  • Bot που κρατάει στατιστικά στοιχεία
  • Bot που σκανάρει IPs ή εκτελεί penetration tests και ενημερώνει με τα αποτελέσματα τους χρήστες ενός room

Ό,τι πρόγραμμα μπορείτε να φανταστείτε ότι φτιάχνεται με την Perl, μπορείτε να το βάλετε σ’ ένα bot που θα εκτελείται μέσα σε κάποιο room του IRC. Οι δυνατότητες περιορίζονται (ως συνήθως) μόνο από τη φαντασία μας!

3 Responses to “IRC Bots”

  1. Dr.Paneas | 03/12/2011 at 19:52

    Ωραίος! Θα το δοκιμάσω μόλις βρω χρόνο αν και με βάζεις να μάθω perl, κάτι που πάντα ήθελα αλλά το απέφευγα.

  2. firstroad | 28/12/2011 at 01:43

    ωραίος πάντα ήθελα να μάθω για τα botakia, πάντως η eliza τα άκουσε τα μπινελίκια της :D

  3. Deltia_fire | 18/07/2013 at 20:36

    Ωραίο άρθρο!

    Να ρωτήσω κάτι; Μπορώ με κάποιον τρόπο να φτιάξω ένα botaki και να εκτελεί κάποια commands όταν κάποιος πχ γράφει μια συγκεκριμένη λέξη ; η να γράφει κάποιο κείμενο σε loop; Τέλος θα ήθελα να ρωτήσω αν μπορώ να χοστάρω κατα καποιον τροπο το botaki σε κάποιον σέρβερ πχ.. γιατί τώρα έξω φτιάξει ένα bot με scripts μέσω του mirc . :)

    Ευχαριστώ.

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων