TwitterのTimelineからiCalendarをつくる
Twitterのuser_timelineからiCalendarを生成するスクリプトを書きました。 ものすごいシンプルなもの。
ダウンロード
つかいかた
ruby user_timeline_to_ical.rb Twitterのユーザ名
とすると、標準出力にiCalendar形式で最近20件のイベントが出てきます。 出力をリダイレクトして、iCalやGoogle CalendarといったiCalendar形式をimportできるソフトウェアに食わせてみましょう。
スクリーンショット
制限事項
- 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)
posted with amazlet on 07.10.09
本田 直之
幻冬舎 (2007/05)
売り上げランキング: 359
幻冬舎 (2007/05)
売り上げランキング: 359
おすすめ度の平均: 

効率アップのシステム化
時間管理ができるとカッコいい!
マンガ本からの脱却を目指す方への最初の一冊- Newer: TopCoder::SRM::370
- Older: redMineでキーボードショートカット
Comments:0
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




