Yksinkertainen ircbotti pythonilla.
ircbot.py
# -*- coding: cp1252 -*- """ yksinkertainen ircbotti komennot: !test !join !quit !anagram """ import socket import botcommands class Ircbot: def __init__( self ): # määritellään botille pääkäyttäjät self.users = [ ':nick!username@host.fi' ] # välttämättömiä tietoja self.server = 'irc.irkkailuserverisi.fi' self.port = 6667 self.username = 's-bot' self.realname = 's-bot' self.nick = 's-botti' # luodaan socket self.socket = socket.socket() # haetaan botille komennot self.commands = botcommands.command_dict # päälooppia toistettan kunnes done = 1 self.done = 0 # kanava jolle botti halutaan self.channel = '#jokukanavatähän' def send( self, string ): # tällä lähetetään viestejä self.socket.send( string + '\r\n' ) def connect( self ): # yhdistetään serveriin ja läheteään omat tiedot self.socket.connect( ( self.server, self.port ) ) self.send( 'NICK %s' % self.nick ) self.send( 'USER %s a a :%s' % ( self.username, self.realname ) ) # liitytään kanavalle self.send( 'JOIN %s' % self.channel ) def check( self, line ): print line line = line.split(' ') # vastataan pingiin muuten serveri katkaisee yhteyden if line[0] == 'PING': self.send( 'PONG :abc' ) try: # vastataan komentoihin myös yksityiskeskutelussa if line[2][0] != '#': line[2] = line[0].split( '!' )[0][1:] # suoritetaan komennot jos niitä on tullut self.commands[ line[3] ].main( self , line ) except: pass def mainloop( self ): buffer = '' while not self.done: # vastaanotetaan dataa buffer += self.socket.recv( 4096 ) buffer = buffer.split( '\r\n' ) for line in buffer[0:-1]: self.check( line ) buffer = buffer[-1] def main(): irc = Ircbot() irc.connect() irc.mainloop() if __name__ == '__main__': main()
botcommands.py
# -*- coding: cp1252 -*- """ muutama esimerkki komennoista """ import random # tähän sanastoon lisätään komennot ja niitä vastaavat oliot command_dict = {} class Test: def main( self, irc, line ): irc.send( 'PRIVMSG %s :Hello world!' % line[2] ) command_dict[ ':!test' ] = Test() class Join: def main( self, irc, line): irc.send( 'JOIN %s' % ( line[4] ) ) command_dict[ ':!join' ] = Join() class Quit: def main( self, irc , line ): # määritellään komento vain pääkäyttäjille if line[0] in irc.users: irc.send( 'QUIT' ) irc.socket.close() irc.done = 1 command_dict[ ':!quit' ] = Quit() class Anagram: def main( self, irc, line): string = list( ' '.join( line[4:] ) ) random.shuffle( string ) string = ''.join( string ) irc.send( 'PRIVMSG %s :%s' % ( line[2], string ) ) command_dict[ ':!anagram' ] = Anagram()
Wheehey, olenkin ihmetellyt millä kielillä botteja yleensä koodataan. Pieni teoriaosuus vois kanssa olla ihan kiva, jossa kerrottais botin käyttö käytännössä jne.
Et sitten viittinyt käittää irclib luokkaa?
Se nyt on ihan sotkua se.
Pitää muuten ihan paikkaansa, ZcMander ei viittinyt sitten katsoa yhtään saatavilla olevaa dokumentaatiota irclibiin liittyen? sitä ei ole :P
Joo ei toki ole, mutta tutoriaaleja ainakin on:
http://www.devshed.com/c/a/Python/IRC-on-a-Higher-Level/
http://www.devshed.com/c/a/Python/IRC-on-a-Higher-Level-Concluded/
http://www.devshed.com/c/a/Python/IRC-on-a-Higher-Level-Continued/
NameError: name 'ircbot' is not defined
ircbot -> Ircbot
Hyvä pätkä. Sain tuon avustuksella tehtyä hienon virityksen kahden verkon väliin :)
GJ, tää auttaa tekemään botin kans muille kielille, ainaki mua on auttanu
Vinkuu vieläki vaikka kuinka vaihtais nimii. Äät ja ööt on menettäny pisteensä, kaikki "ircbot"it ovat vaihtuneet "Ircbot"eiksi.
Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> Ircbot.py NameError: name 'Ircbot' is not defined
Tää oli tosi hyvä, tein tämän perusteella tollasen koko mun pientä serveriä hoitavan botin missä on noin 30 komentoo.
moptim kirjoitti:
Vinkuu vieläki vaikka kuinka vaihtais nimii. Äät ja ööt on menettäny pisteensä, kaikki "ircbot"it ovat vaihtuneet "Ircbot"eiksi.
Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> Ircbot.py NameError: name 'Ircbot' is not defined
No juma. Otappa se
# Ircbot.py
rivi huittiin sieltä.
Hieno esimerkki. Python 3 kanssa vaatii hieman muutoksia, kuten merkkijonojen laittaminen byteiksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.