isit?

Aug 09

Twitter to IRC monitor bot (python)

A SSL IRC bot that takes a feed from search.twitter.com and sends it to a irc channel. Edit the search variable to change the search terms. Needs python2.6. Bot will display 5 tweets every 20 seconds. Twitter search code taken from here. Tumblr screws up the quotes so unbroken code here

from xml.dom import minidom
import time, urllib2, socket, ssl, time, random, string

class bot:
    def __init__(self, host, port, chan):
        self.irchost=host
        self.ircport=port
        self.ircnick=”TMon-“
        self.ircchan=chan
        self.irc = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
        self.irc.connect ((self.irchost, self.ircport))
        self.sslirc = ssl.wrap_socket(self.irc)
        self.sslirc.write(‘NICK ‘+self.ircnick+’\r\n’)
        self.sslirc.write(‘USER ‘+self.ircnick+’ ‘+self.ircnick+’ ‘+self.ircnick+’ :’+self.ircnick+’\r\n’)
        time.sleep(1)
        while 1:
            self.ircdata = self.sslirc.read()
            print(self.ircdata)

            if ‘End of /MOTD command.’ in self.ircdata: #?
               #time.sleep(1)
               self.sslirc.write(‘JOIN ‘+self.ircchan+’\r\n’)
               self.getweet()

            if self.ircdata.find(‘PING’) != -1: #handle pings
               self.sslirc.write(‘PONG :’+self.ircdata[6:]+’\r\n’)

    def getweet(self):
        try:
            search = “leeds”
            id = 0

            while True:
                socket.setdefaulttimeout(90)
                url = “http://search.twitter.com/search.atom?rpp=5&q=%s&since_id=%s” % (search, id)
                try:
                    xml = urllib2.urlopen(url)
                except(urllib2.HTTPError, urllib2.URLError) as err:
                    self.sslirc.write(‘PRIVMSG ‘+self.ircchan+’ :[!] http timeout\r\n’)
                    print (‘[!] http timeout’)
                    time.sleep(5)
                else:
                    doc = minidom.parse(xml)
                    entries = doc.getElementsByTagName(“entry”)
                    if len(entries) > 0:
                        entries.reverse()
                        for e in entries:
                            title = e.getElementsByTagName(“title”)[0].firstChild.data
                            id = e.getElementsByTagName(“id”)[0].firstChild.data.split(“:”)[2]
                            name = e.getElementsByTagName(“name”)[0].firstChild.data.split(” “)[0]
                            str=(name,title,)
                            #filtered_string = ”.join(filter(lambda x:x in string.printable, str))
                            fs=”.join([x for x in title if ord(x) < 128])
                            self.sslirc.write(‘PRIVMSG ‘+self.ircchan+’ :’+name+’ - ‘+fs+’\r\n’)
                            #print fs
                            time.sleep(20)
        except(AttributeError):
            pass
b = bot(‘irc.server’,6697,’#channel’)