[Python] Προγραμματίστε ένα bot για IRC

Σήμερα πρόκειται να σας διδάξω πώς να προγραμματίσετε ένα του bot για IRC. Πρώτα απ 'όλα, για όσους δεν το γνωρίζουν, το bot είναι ένα πρόγραμμα που συνδέεται με ένα κανάλι IRC και αλληλεπιδρά με αυτό, το οποίο μας επιτρέπει, για παράδειγμα, να εποπτεύουμε το κανάλι χωρίς ότι είμαστε συνδεδεμένοι και έτσι αποφύγετε τα ανεπιθύμητα μηνύματα ή ότι αναγνωρίζει μια σειρά παραγγελιών και εκτελεί τον αντίστοιχο κώδικα.
Παρόλο που υπάρχουν ήδη bots έτοιμα, ειλικρινά είμαι ένας από αυτούς που τους αρέσει να κάνουν τα δικά τους προγράμματα για να μάθουν και τη μεγάλη ικανοποίηση που μας δίνει αφού δούμε ότι λειτουργεί ^^

Με αυτό είπε, ας προχωρήσουμε στο σεμινάριο.

Για να προγραμματίσουμε το bot θα χρειαστεί ένα πρόγραμμα επεξεργασίας απλού κειμένου οποιαδήποτε (nano, gedit, medit, κ.λπ.) και διερμηνέας python (2.6 ή 2.7 θα είναι απαραίτητα, δεν λειτουργεί με το python 3.x).

Πρώτα εισάγουμε το απαιτούμενες ενότητες, σε αυτήν την περίπτωση θα χρειαστούμε μόνο δύο:

[κωδικός] #! / usr / bin / env python
# - * - κωδικοποίηση: utf-8 - * -

εισαγωγή πρίζας
εισαγωγή συμβολοσειράς
[/ Code]

Τώρα προχωράμε Ρύθμιση το bot:

[code] HOST=»irc.desdelinux.καθαρά"
PORT = 6667
NICK = »CalicoBot»
ΠΡΟΣΔΙΟΡΙΣΜΟΣ = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Αρχική»
readbuffer = »»
[/ Code]

Θα εξηγήσω κάθε μεταβλητή:

  • HOST: Η διεύθυνση URL του διακομιστή στον οποίο θα συνδεθούμε
  • ΛΙΜΑΝΙ: Η θύρα διακομιστή. Από προεπιλογή είναι 6667.
  • NICK, IDENT και REALNAME: Αντιστοιχούν στο ψευδώνυμο του bot, στην ταυτότητά του και στο πραγματικό του όνομα.
  • ΧΑΝ: Το κανάλι που θα εισαγάγει το bot
  • readbuffer: Σε αυτήν τη μεταβλητή τα δεδομένα που αποστέλλονται από τον διακομιστή θα αποθηκευτούν.

Μόλις διαμορφωθεί το bot μας προχωράμε τη σύνδεση

[κωδικός] s = socket.socket ()
s.connect ((HOST, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("USER% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("ΣΥΝΔΕΣΗ:% s \ r \ n"% CHAN)
[/ Code]

Η πρώτη γραμμή δεν έχει πολύ μυστήριο, η δεύτερη δημιουργεί το σύνδεση διακομιστή και οι τρεις τελευταίοι στέλνουν τα δεδομένα του bot στο διακομιστή για να προχωρήσουν στη σύνδεση.

Μόλις συνδεθούμε θα δημιουργήσουμε ένα Άπειρος βρόχος στο οποίο θα πάμε λήψη και αποστολή δεδομένων από / προς το διακομιστή:

[κωδικός] ενώ 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
για γραμμή σε θερμοκρασία:
line = string.rstrip (γραμμή)
line = line.split (CHAN + ':')

αν η γραμμή [0]. βρείτε ("PING")! = -1:
pingid = γραμμή [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ Code]

Από όλες τις γραμμές που γράφτηκαν παραπάνω, θα σχολιάσω μόνο τις σημαντικές.
με line = line.split (CHAN + ':'Αυτό που κάνουμε είναι να διαιρέσουμε τι μας στέλνει ο διακομιστής πότε ας πάρουμε κάτι από το κανάλι.
Για παράδειγμα, η ακόλουθη γραμμή δείχνει ότι κάποιος έγραψε κάτι στο κανάλι:

:son_link!sonlink@127.0.0.1 PRIVMSG #Home :Hola ^^

Το πρώτο πράγμα είναι το ψευδώνυμο του χρήστη και τα δεδομένα σύνδεσής του (διαχωρισμένα με!), Η εντολή (σε αυτήν την περίπτωση δείχνει ότι έγραψε), το κανάλι και, τέλος, μετά την τελεία, το μήνυμα που στάλθηκε. Δεν θα εξηγήσω πολλές ακόμη εντολές, καθώς δεν εμπίπτουν σε αυτό το σεμινάριο

Οι άλλες σημαντικές γραμμές είναι αυτές είναι μετά το if. Ο διακομιστής στέλνει συχνά την εντολή PING για να ελέγχει αν ο χρήστης είναι ακόμα συνδεδεμένος. Σε αυτήν την περίπτωση, το bot στέλνει την εντολή PONG με ένα αναγνωριστικό που έστειλε το PING για να δείξει στον διακομιστή ότι είναι ακόμα συνδεδεμένο.

Με αυτό έχουμε ήδη τη βάση του bot. Τώρα θα συνεχίσω να εξηγώ πώς να κάνω το bot να ανταποκρίνεται σύμφωνα με αυτό που θέλουμε σε ορισμένες εντολές, είτε προέρχονται από το ίδιο το IRC είτε από χρήστες.

Απάντηση σε εντολές IRC:

Το PING και το PRIVMSG είναι παραδείγματα εντολών IRC. Υπάρχουν πολλές εντολές, αλλά όπως είπα και πριν, είναι κάτι για το οποίο δεν θα αναφερθώ λεπτομερώς.
Για παράδειγμα, μπορούμε να κάνουμε το bot να χαιρετήσει τους χρήστες που συνδέονται:

[κωδικός] αν η γραμμή [0]. εύρεση («ΣΥΝΔΕΣΗ»)! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK και name.find (HOST) == -1:
s.send ("PRIVMSG% s: Welcome @% s ^^ \ n"% (CHAN, όνομα))
[/ Code]

Πρώτα ελέγξουμε εάν ο διακομιστής στέλνει την εντολή Ενώνω το οποίο υποδεικνύει ότι κάποιος είναι συνδεδεμένος στον διακομιστή. Στη συνέχεια, εξάγουμε το ψευδώνυμο, ελέγχουμε ότι το ψευδώνυμο δεν είναι το IRC url (αν όχι μόλις τρέξουμε το bot θα χαιρετήσει τη διεύθυνση url) και τελικά στέλνουμε το μήνυμα χαιρετισμού.

Εντολές Bot:

Τώρα πώς μπορώ να φτιάξω το bot μου απαντώ στις δικές μου εντολές; Ας δούμε καλύτερα ένα παράδειγμα:

[code] if line [1] == "έκδοση $":
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]

Σε αυτό το παράδειγμα εάν κάποιος γράφει έκδοση $ Το bot θα εμφανίσει το μήνυμα που αναφέρει το όνομα, την έκδοση και τον συντάκτη του. Ο πλήρης κωδικός του παραδείγματος είναι ο εξής:

[κωδικός] υποδοχή εισαγωγής
εισαγωγή συμβολοσειράς

HOST = »localhost»
PORT = 6667
NICK = »CalicoBot»
ΠΡΟΣΔΙΟΡΙΣΜΟΣ = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Αρχική»
readbuffer = »»
s = socket.socket ()
s.connect ((HOST, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("USER% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("ΣΥΝΔΕΣΗ:% s \ r \ n"% CHAN)

ενώ 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
για γραμμή σε θερμοκρασία:
γραμμή εκτύπωσης
line = string.rstrip (γραμμή)
line = line.split (CHAN + ':')

αν η γραμμή [0]. βρείτε ("PING")! = -1:
pingid = γραμμή [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

αν η γραμμή [0]. βρείτε («ΣΥΝΔΕΣΗ»)! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK και name.find (HOST) == -1:
s.send ("PRIVMSG% s: Welcome @% s ^^ \ n"% (CHAN, όνομα))

εάν len (γραμμή) <1:
if line [1] == "έκδοση $":
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]

Ελπίζω να σας άρεσε αυτό το σεμινάριο και, φυσικά, σας αφήνω τον σύνδεσμο για τον κώδικα του bot μου, ώστε να μπορείτε να δείτε τον κώδικά του πλήρως και να δείτε καλύτερα πώς λειτουργεί (αν και έχω αφαιρέσει ορισμένες εντολές για προσωπική χρήση).

CalicoBot


Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   auroszx dijo

    Heh, δεν θα μπορούσα να χάσω το Bot της μαλακίας που οδηγείτε στο IRC

  2.   Σταματάμε dijo

    Πολύ απλή και ξεκάθαρη εξήγηση.
    Τι γίνεται αν, στον κώδικα python λείπει όλη η εσοχή.

  3.   rafa dijo

    Εξαιρετικό άρθρο και πόσο εύκολο είναι να συνδεθείτε σε ένα IRC για να προγραμματίσετε ένα bot:)…

    Μου θυμίζει εκείνες τις στιγμές που νιώσαμε σαν προγραμματιστές να γράφουν σενάρια για mIRC σε συνομιλίες MSN ή MSNGroups

  4.   truko22 dijo

    Ενδιαφέρον το διατηρώ 😀

  5.   Genesis Vargas J. (@elprincipiodeto) dijo

    εξαιρετική!

  6.   Έλινξ dijo

    Πολύ χρήσιμο, ευχαριστώ Son_Link!

    Χαιρετισμούς!

  7.   dbillyx dijo

    Στην υγειά σας…

    ακολουθώντας τις γραμμές σας και δοκιμάζοντας το μόνο πράγμα που λειτουργεί είναι
    εισαγωγή πρίζας
    εισαγωγή συμβολοσειράς

    HOST = »localhost»
    PORT = 6667
    NICK = »CalicoBot»
    ΠΡΟΣΔΙΟΡΙΣΜΟΣ = »CalicoBot»
    REALNAME = »CalicoBot»
    CHAN = »# Αρχική»
    readbuffer = »»
    s = socket.socket ()
    s.connect ((HOST, PORT))
    s.send ("NICK% srn"% NICK)
    s.send ("USER% s% s bla:% srn"% (IDENT, HOST, REALNAME))
    s.send ("ΣΥΝΔΕΣΗ:% srn"% CHAN)

    αλλάζοντας το κανάλι και ψευδώνυμο τώρα το παρακάτω με ρίχνει σύνταξη σφάλματος

    Ρώτησα άλλους γνωστούς και μου λένε ότι δεν μοιάζει με πύθωνα

    Δεν ξέρω τι κάνω λάθος ή γιατί αντιγράφω τα πάντα και τα επικολλάω στο python και το δίνω να εισέλθει και συνδέεται με το κανάλι, αλλά μετά από 250 δευτερόλεπτα το κανάλι το αφαιρεί επειδή δεν υπήρχε απάντηση από το pong ...

  8.   φρυγανιά dijo

    Ο πλήρης κωδικός δεν λειτουργεί για μένα, η τελευταία παράγραφος είναι αυτό που αποτυγχάνει και δεν μπορώ να βρω το σφάλμα. Εάν διαγράψω αυτό το τμήμα, συνδέεται και λειτουργεί τέλεια. Δοκιμασμένο με Python 2.7.3 στα Windows 7.

    PS: Στην περίπτωσή μου συνδέομαι σε έναν διακομιστή με κωδικό πρόσβασης και προσθέτω αυτές τις γραμμές:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   Δελφίνι dijo

    Γεια Son Link, σας ευχαριστώ πολύ για το άρθρο, είναι πολύ ενδιαφέρον, απλώς δεν μπορώ να απαντήσω στις εντολές που στάλθηκαν. Το πρόγραμμα δεν πηγαίνει στο τελευταίο εάν και δεν μπορώ να καταλάβω γιατί: "if len (line)> 1:"
    Περιμένω την απάντηση σου.
    Ευχαριστίες