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 definedTää 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.