Version from May 18 of posttotwitter.py
authorSelena Deckelmann <selena@endpoint.com>
Tue, 18 Aug 2009 16:30:47 +0000 (10:30 -0600)
committerSelena Deckelmann <selena@endpoint.com>
Tue, 18 Aug 2009 16:30:47 +0000 (10:30 -0600)
posttotwitter.py [new file with mode: 0755]

diff --git a/posttotwitter.py b/posttotwitter.py
new file mode 100755 (executable)
index 0000000..90629e6
--- /dev/null
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+
+# python rss reader -> twitter post
+import feedparser, pickle, os, sys, twitter, urllib, simplejson as json
+import psycopg2
+import feedparser
+import datetime
+import socket
+import ConfigParser
+
+
+
+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)
+
+               psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
+               self.db.set_client_encoding('UTF8')
+               c = self.db.cursor()
+               c.execute("SET TIMEZONE=GMT")
+
+               if os.path.exists(self.filename):
+                       self.itemsDB = pickle.load(file(filename, 'r+b'))
+               else:
+                       self.itemsDB = {} 
+
+       def getLatestFeedItems(self, items = 10):
+               feed=feedparser.parse(self.url);
+               it=feed["items"]
+               it_ret=it[0:items]
+               return it_ret
+
+       def twitIt(self, items):
+               oldItems=pItems=0
+               items.sort(reverse=True)
+               for it in items:
+                       if self.itemPublished(it) == None:
+                               trim = json.loads(self.trim(it["link"]))
+                               txt=it["title"] +" "+trim["url"]
+                               # print txt
+                               try: 
+                                       status = self.twApi.PostUpdate(txt)
+                               except IOError, e:
+                                       raise e
+                               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 trim(self, url):
+               try:
+                       data = urllib.urlencode(dict(url=url, source="RSS2Twit"))
+                       encodedurl="http://tr.im/api/trim_url.json?"+data
+                       instream=urllib.urlopen(encodedurl)
+                       ret=instream.read()
+                       instream.close()
+                       if len(ret)==0:
+                               return url
+                       return ret
+               except IOError, e:
+                       raise "urllib error."
+
+       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://planet.postgresql.org/rss20_short.xml"
+       r2t=RSS2Twitter(sys.argv[1], url, 'planetpostgres', 'pl4n3t.pg')
+       its=r2t.getLatestFeedItems()
+       r2t.twitIt(its)