Going on with the python saga, I took some time to test urllib and a python twitter module which lucindo was using. Twitter is pretty much stupid as it is – a giang shared text box, but it seems that it could work as a mean to broadcast automatic messages (not in the straight sense as their message signaling fails a lot).
So, I hacked what could be the beggining of a rss aggregation tool in python. Currently it only reads from one feed, but it’s not hard to extend it. Also, it uses tinyurl api service to save space (since each post must have no more than 140 chars). I choose the five newest items to post, and save them using pickle to avoid double posting the next time the script runs.
How’s that for a interweb 2.0 mashup ?
#!/usr/bin/env python # python rss reader -> twitter post import feedparser, pickle, os, sys, twitter, urllib class RSS2Twitter: def __init__(self, filename, url, username, passwd): self.filename=filename self.url=url self.username=username self.passwd=passwd self.twApi=twitter.Api(username=self.username, password=self.passwd) if os.path.exists(self.filename): self.itemsDB = pickle.load(file(filename, 'r+b')) else: self.itemsDB = {} def getLatestFeedItems(self, items = 5): feed=feedparser.parse(self.url); it=feed["items"] it_ret=it[0:items] return it_ret def twitIt(self, items): oldItems=pItems=0 for it in items: if self.itemPublished(it) == None: print "--------------\n" txt=it["title"] +" "+self.tiny(it["link"]) print txt status = self.twApi.PostUpdate(txt) print "status: ", status.text pItems=pItems+1 print "Total items: ", len(items) print "published: ",pItems print "old stuff: ",len(items) - pItems def itemPublished (self, item): if self.itemsDB.has_key(item["link"]) == True: return True else: self.itemsDB[item["link"]]=item["title"] pickle.dump(self.itemsDB, file(self.filename, 'w+b')) return None def tiny(self, url): try: data = urllib.urlencode(dict(url=url, source="RSS2Twit")) encodedurl="http://www.tinyurl.com/api-create.php?"+data instream=urllib.urlopen(encodedurl) ret=instream.read() instream.close() if len(ret)==0: return url return ret except IOError, e: raise "urllib error." if __name__ == "__main__": # run it like python rss2twitter.py oi.dat (oi.dat is the posted item db) # update username and passwd with your twitter account data, surrounding them with quotes. url="http://rssfeed" r2t=RSS2Twitter(sys.argv[1], url, USERNAME, PASSWD) its=r2t.getLatestFeedItems() r2t.twitIt(its)