Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Python: ircbot

Sivun loppuun

proof [13.08.2005 00:49:50]

#

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()

Puhveli [17.08.2005 19:50:18]

#

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.

ZcMander [31.10.2005 19:22:07]

#

Et sitten viittinyt käittää irclib luokkaa?

proof [29.11.2005 22:52:59]

#

Se nyt on ihan sotkua se.

TeeVee [18.03.2006 19:15:31]

#

Pitää muuten ihan paikkaansa, ZcMander ei viittinyt sitten katsoa yhtään saatavilla olevaa dokumentaatiota irclibiin liittyen? sitä ei ole :P

ZcMander [23.06.2006 00:26:12]

#

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/

moptim [21.06.2007 12:22:48]

#

NameError: name 'ircbot' is not defined

Zhamb [25.07.2007 19:09:25]

#

ircbot -> Ircbot
Hyvä pätkä. Sain tuon avustuksella tehtyä hienon virityksen kahden verkon väliin :)

temu92 [08.08.2007 12:42:50]

#

GJ, tää auttaa tekemään botin kans muille kielille, ainaki mua on auttanu

moptim [27.08.2007 18:26:55]

#

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

kimbledon [28.06.2008 06:58:01]

#

Tää oli tosi hyvä, tein tämän perusteella tollasen koko mun pientä serveriä hoitavan botin missä on noin 30 komentoo.

janijohannes [21.04.2009 17:46:10]

#

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

Mizou [03.10.2010 22:49:48]

#

Hieno esimerkki. Python 3 kanssa vaatii hieman muutoksia, kuten merkkijonojen laittaminen byteiksi.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta