#!/Usr/bin/env python # -*- coding: utf-8 -*- # 2009 Gordon McGregor. Placed in the public domain. from twitter import Twitter import sys import time class WhatDidYouSay: rate_limit = 100 session = None def __init__(self, verbose = True): self.verbose = verbose def update_rate_limit_status(self): rate_limit_info = self.session.account.rate_limit_status() if self.verbose: print "Rate limit status : " + str(rate_limit_info['remaining_hits']) + \ " resets at " + time.ctime(rate_limit_info['reset_time_in_seconds']) self.rate_limit = rate_limit_info['remaining_hits'] self.reset_time_in_seconds = rate_limit_info['reset_time_in_seconds'] def initialise(self): self.session = Twitter() self.said = [] self.last_id = 0 self.update_rate_limit_status() def by(self, name): self.name = name self.initialise() self.get_tweets() self.write_tweets() def get_tweets(self): self.last_id = None more_to_say = True while more_to_say: if (self.last_id == None): if self.rate_limit <= 1: self.update_rate_limit_status() current_time_in_seconds = time.mktime(time.localtime()) delay_time = self.reset_time_in_seconds - current_time_in_seconds if (delay_time > 0): print "Warning: reached rate limit for Twitter API calls, waiting %d seconds" % delay_time time.sleep(delay_time) self.update_rate_limit_status() statuses = self.session.statuses.user_timeline(screen_name=self.name, count=200) self.rate_limit -= 1 else: statuses = self.session.statuses.user_timeline(screen_name=self.name, count=200, max_id = self.last_id) self.rate_limit -= 1 if(statuses[-1]['id'] == self.last_id): statuses = {} more_to_say = False if self.verbose: print "Status length " + str(len(statuses)) for element in statuses: self.said.append(element['text']) self.last_id = element['id'] if self.verbose: print "Last fetched id " + str(self.last_id) if len(statuses) == 1: more_to_say=False def dump_tweets(self): countdown=len(self.said) for tweet in self.said: print "%05d : %s" % (countdown, tweet) countdown -= 1 def write_tweets(self): f = open(self.name + ".tweet", "w") for tweet in self.said: encoded_tweet = tweet.encode('UTF-8') f.write(encoded_tweet + '\n') f.close() def main(): said = WhatDidYouSay(verbose = True) said.by(name="GordonMcGregor") said.by(name="timoreilly") if __name__ == '__main__': main()