Comment programmer un Simple bot IRC en python?

j'ai besoin d'aide pour écrire un bot IRC de base qui se connecte à un canal.. quelqu'un est-il capable de m'expliquer cela? J'ai réussi à le connecter au serveur IRC mais je suis incapable de joindre un canal et de me connecter. Le code que j'ai jusqu'à présent est:

import sockethost = 'irc.freenode.org'
port = 6667
join_sock = socket.socket()
join_sock.connect((host, port))
<code here> 

Toute aide serait grandement appréciée.

21
demandé sur Jake 2010-06-03 21:39:08

5 réponses

il serait probablement plus facile de se baser sur la mise en œuvre du protocole IRC de twisted. Jetez un coup d'oeil à : http://github.com/brosner/bosnobot pour l'inspiration.

12
répondu Alex Gaynor 2010-06-03 17:40:13

pour vous connecter à un canal IRC, Vous devez envoyer certaines commandes spécifiques au protocole IRC au serveur IRC avant de pouvoir le faire.

lorsque vous vous connectez au serveur, vous devez attendre que le serveur ait envoyé toutes les données (MOTD et whatnot), puis vous devez envoyer la commande PASS.

PASS <some_secret_password>

ce qui suit est la commande NICK.

NICK <username>

alors vous devez envoyer la commande USER.

USER <username> <hostname> <servername> :<realname>

les Deux sont obligatoires.

alors vous êtes probablement pour voir le message de PING du serveur, vous devez répondre au serveur avec la commande PONG chaque fois que le serveur vous envoie un message de PING. Le serveur peut aussi demander PONG entre les commandes NICK et USER.

PING :12345678

Répondre avec exactement le même texte après "PING PONG commande:

PONG :12345678

ce qui suit le PING est unique à chaque serveur que je crois donc assurez-vous de répondre avec la valeur que le serveur vous a envoyé.

Maintenant vous pouvez rejoindre un canal avec JOIN commande:

JOIN <#channel>

Maintenant vous pouvez envoyer des messages aux canaux et aux utilisateurs avec la commande PRIVMSG:

PRIVMSG <#channel>|<nick> :<message>

Quitter

QUIT :<optional_quit_msg>

expérimenter avec Telnet! Commençant par

telnet irc.example.com 6667

voir le IRC RFC pour plus de commandes et d'options.

Espérons que cette aide!

45
répondu TheMagician 2017-03-05 11:11:25

j'ai utilisé cela comme le PRINCIPAL IRC code:

import socket
import sys

server = "server"       #settings
channel = "#channel"
botnick = "botname"

irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #defines the socket
print "connecting to:"+server
irc.connect((server, 6667))                                                         #connects to the server
irc.send("USER "+ botnick +" "+ botnick +" "+ botnick +" :This is a fun bot!\n") #user authentication
irc.send("NICK "+ botnick +"\n")                            #sets nick
irc.send("PRIVMSG nickserv :iNOOPE\r\n")    #auth
irc.send("JOIN "+ channel +"\n")        #join the chan

while 1:    #puts it in a loop
   text=irc.recv(2040)  #receive the text
   print text   #print text to console

   if text.find('PING') != -1:                          #check if 'PING' is found
      irc.send('PONG ' + text.split() [1] + '\r\n') #returnes 'PONG' back to the server (prevents pinging out!)

ensuite, vous pouvez commencer à définir des commandes comme:!hi <nick>

if text.find(':!hi') !=-1: #you can change !hi to whatever you want
    t = text.split(':!hi') #you can change t and to :)
    to = t[1].strip() #this code is for getting the first word after !hi
    irc.send('PRIVMSG '+channel+' :Hello '+str(to)+'! \r\n')

Notez que tous les irc.send les textes doivent commencer par PRIVMSG ou NOTICE+channel/user et le texte doit commencer par un : !

15
répondu MichaelvdNet 2012-09-30 12:14:00

ceci est une extension de MichaelvdNet Post, qui prend en charge quelques éléments supplémentaires:

  • utilise SSL wrapper pour socket
  • utilise l'authentification par mot de passe du serveur
  • utilise l'authentification nickserv password
  • utilise des sockets non bloquants, pour permettre à d'autres événements de se déclencher
  • Journaux des modifications sur des fichiers texte à canal

    #!/usr/local/bin/python
    
    import socket
    import ssl
    import time
    
    ## Settings
    ### IRC
    server = "chat.freenode.net"
    port = 6697
    channel = "#meLon"
    botnick = "meLon-Test"
    password = "YOURPASSWORD"
    
    ### Tail
    tail_files = [
        '/tmp/file-to-tail.txt'
    ]
    
    irc_C = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #defines the socket
    irc = ssl.wrap_socket(irc_C)
    
    print "Establishing connection to [%s]" % (server)
    # Connect
    irc.connect((server, port))
    irc.setblocking(False)
    irc.send("PASS %s\n" % (password))
    irc.send("USER "+ botnick +" "+ botnick +" "+ botnick +" :meLon-Test\n")
    irc.send("NICK "+ botnick +"\n")
    irc.send("PRIVMSG nickserv :identify %s %s\r\n" % (botnick, password))
    irc.send("JOIN "+ channel +"\n")
    
    
    tail_line = []
    for i, tail in enumerate(tail_files):
        tail_line.append('')
    
    
    while True:
        time.sleep(2)
    
        # Tail Files
        for i, tail in enumerate(tail_files):
            try:
                f = open(tail, 'r')
                line = f.readlines()[-1]
                f.close()
                if tail_line[i] != line:
                    tail_line[i] = line
                    irc.send("PRIVMSG %s :%s" % (channel, line))
            except Exception as e:
                print "Error with file %s" % (tail)
                print e
    
        try:
            text=irc.recv(2040)
            print text
    
            # Prevent Timeout
            if text.find('PING') != -1:
                irc.send('PONG ' + text.split() [1] + '\r\n')
        except Exception:
            continue
    
2
répondu earthmeLon 2017-05-23 12:18:20

ouvrir une socket, mais vous devez également indiquer l'IRCd qui vous êtes. J'ai fait quelque chose de similaire à perl il y a longtemps, et j'ai trouvé le IRC RFC très utile.

Main RFC: http://irchelp.org/irchelp/rfc/rfc.html

Autres Rfc: http://irchelp.org/irchelp/rfc/index.html

0
répondu Daenyth 2010-06-03 17:41:44