¿Cómo programo un simple bot de IRC en Python?
sockets connect (5)
Eso abrirá un socket, pero también debe decirle al IRCd quién es usted. He hecho algo similar en Perl hace años, y encontré las IRCs RFC para ser muy útil.
RFC principal: http://irchelp.org/irchelp/rfc/rfc.html
Otros RFC: http://irchelp.org/irchelp/rfc/index.html
Necesito ayuda para escribir un bot básico de IRC que solo se conecta a un canal. ¿Alguien puede explicarme esto? Logré hacer que se conectara al servidor IRC, pero no puedo unirme a un canal e iniciar sesión. El código que tengo hasta ahora es:
import sockethost = ''irc.freenode.org''
port = 6667
join_sock = socket.socket()
join_sock.connect((host, port))
<code here>
Cualquier ayuda sería muy apreciada.
Esta es una extensión de la publicación de MichaelvdNet , que admite algunas cosas adicionales:
- Utiliza un contenedor SSL para socket
- Utiliza la autenticación de contraseña del servidor
- Utiliza la autenticación de contraseña nickserv
- Utiliza sockets no bloqueantes, para permitir que otros eventos se activen
Registra los cambios en los archivos de texto en el 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
Lo usé como el código PRINCIPAL de IRC:
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!)
Luego, puede comenzar a configurar comandos como !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'')
Tenga en cuenta que todos los textos irc.send
deben comenzar con PRIVMSG
o NOTICE
+ channel/user
y el texto debe comenzar con a PRIVMSG
Para conectarse a un canal IRC, debe enviar ciertos comandos específicos del protocolo IRC al servidor IRC antes de poder hacerlo.
Cuando se conecta al servidor, debe esperar hasta que el servidor haya enviado todos los datos (MOTD y otras cosas), luego debe enviar el comando PASS.
PASS <some_secret_password>
Lo que sigue es el comando NICK.
NICK <username>
Luego debe enviar el comando USUARIO.
USER <username> <hostname> <servername> :<realname>
Ambos son obligatorios.
Entonces es probable que vea el mensaje PING del servidor, debe responder al servidor con el comando PONG cada vez que el servidor le envíe un mensaje PING. El servidor también puede pedir PONG entre los comandos NICK y USER.
PING :12345678
Responda con el mismo texto después de "PING" con el comando PONG:
PONG :12345678
Lo que viene después de PING es único para cada servidor que creo, así que asegúrese de responder con el valor que le envió el servidor.
Ahora puedes unirte a un canal con el comando JOIN:
JOIN <#channel>
Ahora puede enviar mensajes a canales y usuarios con el comando PRIVMSG:
PRIVMSG <#channel>|<nick> :<message>
Salir con
QUIT :<optional_quit_msg>
¡Experimenta con Telnet! Empezar con
telnet irc.example.com 6667
Consulte el IRC RFC para obtener más comandos y opciones.
¡Espero que esto ayude!
Probablemente sería más fácil basarlo en la implementación de Twisted del protocolo IRC. Eche un vistazo a: http://github.com/brosner/bosnobot para obtener inspiración.