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.
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.
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!
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 :
!
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
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