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.
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.
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!
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 :
!
Il s'agit d'une extension de MichaelvdNet's Post , qui prend en charge quelques éléments supplémentaires:
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
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