Twistory is now historyに興味があったのを思い出したので
TwitterのツイートをGoogleカレンダーに登録する、というtwistory、以前試してみたらうまくいかなかった*1のですが、でも面白い試みと感じたのを思い出しました。
それで、ちょっとだけ汎用性を高め、一般的なRSSをiCalendar形式に変換して、Googleカレンダーに登録する、というのはどうか、と思ったのですが*2、頓挫しつつあります。
下記のように登録できたりできなかったり。まさか、今日のTwitterの不調が影響しているとも思えないし。心当たりがある方、何かご教示いただければ幸いです。
一応、ブックマークレット等
問答無用で現ページ先頭のtype="application/rss+xml"のlink要素を登録しようとするタイプ
javascript:(function(w,d,h,ls,l,i){ls=d.getElementsByTagName('link');for(i=0;i<ls.length;i++){l=ls[i];if(l.type=='application/rss+xml'){w.location.href='http://www.google.com/calendar/render?cid='+encodeURIComponent('http://gadgtwit.appspot.com/rss2ical/'+l.href);return}}})(window,document)
プロンプトを出して、登録するかを確認するタイプ(最大、type="application/rss+xml"のlink要素数分尋ねてくる)
javascript:(function(w,d,h,ls,l,i,h,r,t){ls=d.getElementsByTagName('link');for(i=0;i<ls.length;i++){l=ls[i];if(l.type=='application/rss+xml'){h='http://gadgtwit.appspot.com/rss2ical/'+l.href;t=l.title;r=prompt((t?t:'下記URL')+'をGoogleカレンダーに登録します。よろしいですか?',h);if(r){w.location.href='http://www.google.com/calendar/render?cid='+encodeURIComponent(h);return}}}})(window,document)
たとえばTwitterの個人ページとか、はてなブックマークの個別ページに行って、ブックマークレットを実行すれば(必要に応じてプロンプトに応答すれば)、Googleカレンダーのページへと移動し、本当にそのカレンダーを追加するかURLを出して(URLは、「http://gadgtwit.appspot.com/rss2ical/<RSSのURL>」の形式)確認してくるので、[はい、このカレンダーを追加します]を押せば、うまくいけば登録できます。
独り言とか
- 何故か、全く同じRSS(を変換したもの)にも関らず、登録できるときと、できないときがある。
- 続けて何度やってもだめな場合や、一度でうまくいく場合もある。
- プロンプトで確認されるURLをコピーしておいて、直接ダウンロードしても、一応正常に出力されているように見える。
- ちなみに、RSS→Pythonのdict()への変換は独自にやっているので、かなり手抜き。Atomとかも未対応。
- iCalendar形式への変換は、たまたま見つけたPythonのライブラリであるicalendar-2.1を使用させていただいている。が、ちょっとバグが有るみたい(日本語を変換したときにゴミが入ることがある)なので、parser.pyにパッチを当てて使っている(下記参照)。
parser.pyのパッチ箇所
元ソースの440行目辺り。2010.06.15の日付が入っている部分がパッチ。
if m is not None and m.end()!=l_line: new_lines.append(self[start:start+m.start()]) start += m.end() continue # 2010.06.15: start => _end = end # 2010.06.15: <= end if end >= l_line: end = l_line else: # Check that we don't fold in the middle of a UTF-8 character: # http://lists.osafoundation.org/pipermail/ietf-calsify/2006-August/001126.html while True: char_value = ord(self[end]) if char_value < 128 or char_value >= 192: # This is not in the middle of a UTF-8 character, so we # can fold here: break else: end -= 1 # 2010.06.15: start => if _end != end: slice = self[start:end] # 2010.06.15: <= end new_lines.append(slice)
2006/8の日付で、最終文字がUTF-8の真ん中だった場合には改行位置を前にずらす処理(end -= 1)を入れてあるのだけれど、endを減らしているのに、sliceがそのまま(前のend位置で切り出したまま)になっていたので、これを修正しただけ。自信はない。ゴミは消えたみたいなので、多分、あっていると思うのだけれど。