web-dev-qa-db-fra.com

Comment puis-je programmer un simple IRC bot en python?

J'ai besoin d'aide pour écrire un bot de base IRC qui se connecte simplement à un canal .. est-ce que quelqu'un peut m'expliquer cela? J'ai réussi à le faire se connecter au IRC serveur mais je ne parviens pas à rejoindre un canal et 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.

22
Jake

Il serait probablement plus facile de le baser sur l'implémentation tordue du protocole IRC. Jetez un œil à: http://github.com/brosner/bosnobot for inspiration.

12
Alex Gaynor

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

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

PASS <some_secret_password>

Ce qui suit est la commande NICK.

NICK <username>

Ensuite, vous devez envoyer la commande USER.

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

Les deux sont obligatoires.

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

PING :12345678

Répondez avec le même texte exact après "PING" avec la commande PONG:

PONG :12345678

Ce qui est après PING est unique à chaque serveur, je pense donc assurez-vous de répondre avec la valeur que le serveur vous a envoyée.

Vous pouvez maintenant rejoindre un canal avec la commande JOIN:

JOIN <#channel>

Vous pouvez maintenant envoyer des messages aux canaux et aux utilisateurs avec la commande PRIVMSG:

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

Quittez avec

QUIT :<optional_quit_msg>

Expérimentez avec Telnet! Commencer avec

telnet irc.example.com 6667

Voir IRC RFC pour plus de commandes et d'options.

J'espère que cela t'aides!

50
TheMagician

Je l'ai utilisé comme MAIN 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 :!

17
MichaelvdNet

Il s'agit d'une extension de MichaelvdNet's Post , qui prend en charge quelques éléments supplémentaires:

  • Utilise un wrapper SSL pour le socket
  • Utilise l'authentification par mot de passe du serveur
  • Utilise l'authentification par mot de passe nickserv
  • Utilise des sockets non bloquants pour permettre le déclenchement d'autres événements
  • Enregistre les modifications apportées aux fichiers texte à canaliser

    #!/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
earthmeLon

Cela ouvrira un socket, mais vous devez également dire à l'IRCd qui vous êtes. J'ai fait quelque chose de similaire en Perl il y a longtemps, et j'ai trouvé les IRC RFCs très utiles.

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

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

0
Daenyth