Tuesday, September 15, 2009

Export your Twitter timeline to Google Calendar

This is the Python code to do the thing. I use Jython 2.5 and gdata 2.0.2. If you are running it behind proxy, you can set the environment as below:
set https_proxy=https://https_proxy
set http_proxy=http://http_proxy
set proxy-username=proxy-username
set proxy-password=proxy-password
And here is the source code:
try:
  from xml.etree import ElementTree
except ImportError:
  from elementtree import ElementTree
import gdata.calendar.service
import gdata.service
import atom.service
import gdata.calendar
import atom
import time
import datetime

gUsr = 'Gmail address'
gPwd = 'Gmail password'

tUsr   = 'Twitter user name'

# Depends on your tweets, 
# it should be 200/tweets
tPage  = 5
tCount = 200

# After run the script, 
# you can get the last id from the result
last_id = ''

twitURL = 'http://www.twitter.com/'

months_choices = {}
for i in range(1,13):
  months_choices[datetime.date(2009, i, 1).strftime('%b')] = i

class gCalendar:
  '''
  Refer to \gdata-2.0.2\samples\calendar\calendarExample.py
  '''

  def __init__(self, email, password):

    self.cal_client = gdata.calendar.service.CalendarService()
    self.cal_client.email = email
    self.cal_client.password = password
    self.cal_client.source = 'Twitter sync'
    self.cal_client.ProgrammaticLogin()

  def InsertEvent(self, title='title',
      content='content', where='where',
      start_time=None, end_time=None, recurrence_data=None):

    event = gdata.calendar.CalendarEventEntry()
    event.title = atom.Title(text=title)
    event.content = atom.Content(text=content)
    event.where.append(gdata.calendar.Where(value_string=where))

    if recurrence_data is not None:
      # Set a recurring event
      event.recurrence = gdata.calendar.Recurrence(text=recurrence_data)
    else:
      if start_time is None:
        # Use current time for the start_time and have the event last 1 hour
        start_time = time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime())
        end_time = time.strftime('%Y-%m-%dT%H:%M:%S.000Z',
            time.gmtime(time.time() + 1))
      event.when.append(gdata.calendar.When(start_time=start_time,
          end_time=end_time))

    new_event = self.cal_client.InsertEvent(event,
        '/calendar/feeds/default/private/full')

    return new_event

def userTimeline(tusr, count=5, page=1, since=1):

  statuses_user_timeline = twitURL + \
    'statuses/user_timeline.xml?screen_name=%s&count=%s&page=%s&since_id=%s'

  c = atom.http.ProxiedHttpClient()

  r = c.request('GET', statuses_user_timeline % (tusr, count, page, since))

  return r.read()

def feedCal(gService, xml):
  global last_id
  
  tree = ElementTree.fromstring(xml)

  status = tree.getiterator('status')

  for s in status:
    id = s.find('id').text
    c = s.find('text').text
    t = s.find('created_at').text
    t1 = t.split()
    t2 = [int(i) for i in t1[3].split(':')]
    st = datetime.datetime(int(t1[5]), int(months_choices[t1[1]]), int(t1[2]),
      t2[0], t2[1], t2[2])

    td = datetime.timedelta(seconds=1)
    et = st + td

    gService.InsertEvent(c, 'ID: %s' % id, 'twitter',
      st.strftime('%Y-%m-%dT%H:%M:%S.000Z'),
      et.strftime('%Y-%m-%dT%H:%M:%S.000Z'))

    # Get the first id as the last id
    if last_id < id: last_id = id

# Start here
def main():
  global last_id
  
  gCal = gCalendar(gUsr, gPwd)

  if last_id:
    feedCal(gCal, userTimeline(tUsr, tCount, 1, last_id))
  else:
    for i in range(1,tPage):
      feedCal(gCal, userTimeline(tUsr, tCount, str(i)))

  print '  Last id is', last_id

if __name__ == '__main__':
  print time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime()), 'start'
  main()
  print time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime()), 'complete'

No comments:

Post a Comment