hagino3000's blog

平成アーカイブス (更新停止)

ATNDのイベント画面にGoogleカレンダーへ予定を登録するボタンを追加するブックマークレット

こんな感じになります。



2009-12-17:Safariで動かなかったので修正しました。

コード
javascript:(function(){var eventId=window.location.pathname.match(/([0-9]*$)/);$.getJSON('http://api.atnd.org/events/?event_id='+eventId+'&format=jsonp&count=1&callback=?',callback);function callback(res){var e=res.events[0];var action="TEMPLATE";var text=e.title;var desc=e["catch"];var loc=e.place;var startT=formatToUTCDate(e.started_at);var endT=formatToUTCDate(e.ended_at);if(endT==null){endT=startT;}var dates=startT+'/'+endT;var trp="true";var url='http://www.google.com/calendar/event?'+'action='+action+'&text='+encodeURIComponent(text)+'&details='+encodeURIComponent(desc)+'<br>'+window.location+'&location='+encodeURIComponent(loc)+'&dates='+dates+'&trp=true'+'&sprop=website:'+window.location+'&sprop=name:atnd';$('h1.summary').parent().append($('<a>').attr('href',url).append($('<img>').attr('src','http://www.google.com/calendar/images/ext/gc_button2_ja.gif')));}function formatToUTCDate(jstDateTime){if(jstDateTime==null){return null;}var dateTime=jstDateTime.replace(/[-,:]/g,"").replace(/.....$/,"");var jstDate=Number(dateTime.slice(0,8));var jstTime=Number(dateTime.slice(9,15));var utcDate;if(jstTime<90000){utcDate=jstDate - 1;}else{utcDate=jstDate;}var utcTime=String((jstTime+240000 - 90000) % 240000);utcTime=utcTime.length==6?utcTime:'0'+utcTime;return utcDate+'T'+utcTime+'Z';}})();
ヒューマンリーダブル版
javascript:(function(){
  var eventId = window.location.pathname.match(/([0-9]*$)/);

  $.getJSON('http://api.atnd.org/events/?event_id='+eventId+'&format=jsonp&count=1&callback=?', callback);

  function callback(res) {
    var e = res.events[0];
    var action  = "TEMPLATE";
    var text    = e.title;
    var desc    = e["catch"];
    var loc     = e.place;
    var startT  = formatToUTCDate(e.started_at);
    var endT    = formatToUTCDate(e.ended_at);

    if (endT == null) {
      endT = startT;
    }

    var dates   = startT + '/' + endT;
    var trp = "true";

    var url = 'http://www.google.com/calendar/event?' +
    'action='   + action +
    '&text='    + encodeURIComponent(text)   +
    '&details=' + encodeURIComponent(desc) + '<br>' + window.location +
    '&location='+ encodeURIComponent(loc)    +
    '&dates='   + dates +
    '&trp=true' +
    '&sprop=website:' + window.location +
    '&sprop=name:atnd';

    $('h1.summary').parent().append(
      $('<a>').attr('href', url).append(
        $('<img>').attr('src', 'http://www.google.com/calendar/images/ext/gc_button2_ja.gif')
      )
    );
  }

  function formatToUTCDate(jstDateTime) {
    if(jstDateTime == null) {return null;}
    var dateTime = jstDateTime.replace(/[-,:]/g,"").replace(/.....$/,"");
    var jstDate = Number(dateTime.slice(0, 8));
    var jstTime = Number(dateTime.slice(9, 15));  
    var utcDate;
    if (jstTime < 90000) {
      utcDate = jstDate - 1;
    } else {
      utcDate = jstDate;
    }
    var utcTime = String((jstTime + 240000 - 90000) % 240000);
    utcTime = utcTime.length == 6 ? utcTime : '0' + utcTime;
    return utcDate+'T'+utcTime+'Z';  
  }
})();
反省

あまりにクソだったので修正しました。Firefoxでしか動作確認してません。API叩けばいいのにスクレイピングしてるし、タイムゾーン変換してないので時間がおかしくなったりします。とはいえATND側ですぐに実装される様な気がするし、もっといいグリモンとか他にあるはずなのでこれは適当でいいかなと思えてきた。