Home > TwitterのTimelineからiCalendarをつくる

TwitterのTimelineからiCalendarをつくる

Twitterのuser_timelineからiCalendarを生成するスクリプトを書きました。 ものすごいシンプルなもの。

ダウンロード

user_timeline_to_ical.rb

つかいかた

ruby user_timeline_to_ical.rb Twitterのユーザ名

とすると、標準出力にiCalendar形式で最近20件のイベントが出てきます。 出力をリダイレクトして、iCalやGoogle CalendarといったiCalendar形式をimportできるソフトウェアに食わせてみましょう。

スクリーンショット

iCalから: Twitter to iCalendar-01

Google Calendarから: Twitter to iCalendar-02

制限事項

  • 10/09現在、Twitter APIでuser_timelineにpageパラメータを渡すことができなくなっているため、20件以上のメッセージを取り出すことができません。
  • iCalendarの性質上、イベントが同じ時間帯に密集していると非常にみづらいです。たまにしかTwitterにpostしない人にはちょうどいいかも。

今後

トラッキング専用のアカウントにdirect messageをなげれば、あとから自分が何やっていたかをiCalendarで取得できるWebサービスをつくるつもりです。redmineのプロジェクトでつくってます。 これができれば、すべてのpostを表示せずにすむようになるし、iCalからsubscribeしたりできて、だいぶ時間家計簿として見易くなると期待しています。

2007.10.23 追記 : つくりました

背景

レバレッジ時間術 を読んでて、時間家計簿をつけようと思いました。 ちょうど最近Twitterを始めてて、これは時間をトラッキングしとくのにちょうどいいのでは、と思いついた次第。

ソース

いちおう貼りつけときます。

#
# create iCalendar from recent 20 user_timeline.
#
# usage
#   ruby user_timeline_to_ical.rb [username] > some.ics
#
require 'rubygems'
require 'json'
require 'icalendar'
require 'uri'
require 'open-uri'
require 'kconv'
require 'nkf'
require 'logger'
 
KCODE = 'u'
 
# XXX:
#   quick fix to avoid charset crash
module Icalendar
  class Component < Icalendar::Base
    def print_properties
      s = ""
 
      @properties.each do |key,val|
        # Take out underscore for property names that conflicted
        # with built-in words.
        if key =~ /ip_.*/
          key = key[3..-1]
        end
 
        # Property name
        unless multiline_property?(key)
           prelude = "#{key.gsub(/_/, '-').upcase}" +
 
           # Possible parameters
           print_parameters(val)
 
           # Property value
           value = ":#{val.to_ical}"
           escaped = prelude + value.gsub("\", "\\").gsub("n", "\n").gsub(",", "\,").gsub(";", "\;")
           #escaped = value
           #s << escaped.slice!(0, MAX_LINE_LENGTH) << "rn " while escaped.size > MAX_LINE_LENGTH # XXX : quick fix to avoid charset crash
           s << escaped << "rn"
           s.gsub!(/ *$/, '')
         else
           prelude = "#{key.gsub(/_/, '-').upcase}"
            val.each do |v|
               params = print_parameters(v)
               value = ":#{v.to_ical}"
               escaped = prelude + params + value.gsub("\", "\\").gsub("n", "\n").gsub(",", "\,").gsub(";", "\;")
               s << escaped.slice!(0, MAX_LINE_LENGTH) << "rn " while escaped.size > MAX_LINE_LENGTH
               s << escaped << "rn"
               s.gsub!(/ *$/, '')
            end
         end
      end
      s
    end
  end
end
 
class UserTimeLine
  attr_accessor :id, :since
  URL = 'http://twitter.com/statuses/user_timeline/'
 
  def initialize(id)
    @id = id
    #@log = Logger.new('debug.log')
  end
 
  def get(url)
    JSON.parse(open(url).readlines.join).sort { |a, b| a['id'] <=> b['id'] }
  end
 
  def url(*arg)
    url = URL + @id + '.json'
    return url if arg.empty?
 
    hash = arg[0]
    args = {}
 
    args['page'] = hash[:page] if hash[:page]
    if hash[:since]
      if String == hash[:since].class
        args['since'] = URI.escape(hash[:since].split.join('+'))
      else # should be Number
        args['since_id'] = hash[:since]
      end
    end
    arg = args.collect { |k, v| [k, v].join('=') }.join('&')
 
    url + '?' + arg
  end
 
  def to_ical
    msgs = get(url).collect {|x| [x['text'], x['created_at']]}
    cal = Icalendar::Calendar.new
 
    (msgs.size-1).times do |i|
      cal.event do
        dtstart  DateTime.parse(msgs[i][1]).to_ical(true)
        dtend    DateTime.parse(msgs[i+1][1]).to_ical(true)
        summary  msgs[i][0]
      end
    end
 
    cal.to_ical
  end
end
 
 
utl = UserTimeLine.new(ARGV.shift)
print NKF.nkf('-w -Lw', utl.to_ical)

レバレッジ時間術―ノーリスク・ハイリターンの成功原則 (幻冬舎新書 ほ 2-1)
本田 直之
幻冬舎 (2007/05)
売り上げランキング: 359
おすすめ度の平均: 4.5
5 効率アップのシステム化
4 時間管理ができるとカッコいい!
4 マンガ本からの脱却を目指す方への最初の一冊

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://blog.deadbeaf.org/2007/10/09/make-icalendar-from-twitter-timeline/trackback/
Listed below are links to weblogs that reference
TwitterのTimelineからiCalendarをつくる from mootoh.log

Home > TwitterのTimelineからiCalendarをつくる

Feeds

Return to page top