« GoogleMapsEditorが窓の杜大賞に候補としてノミネートされました。 | メイン | GoogleMapsEditor Ver.1.05 公開 - GoogleMapsAPIを利用した地図コンテンツをプログラムなしで作成できる編集ソフト »

マイミクの誕生日をGoogle Calendar用のiCalデータにする。

ご無沙汰しています。

ちょっと思いついたので作ってみました。

birthday.pl

use strict;
use WWW::Mixi;
use Jcode;

##定義
my $config_title    = "マイミク誕生日カレンダ";
my $config_login    = 'your_address@mixi.jp';
my $config_password = 'your_password';

##ログイン
my $mixi = WWW::Mixi->new($config_login, $config_password);
$mixi->login;
$mixi->delay(2/60);

##準備
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
my $today = sprintf("%02d%02d", $mon +1, $mday);
$config_title = cv($config_title);

##マイミク一覧を取得
my @friends;
my $list_url = '/list_friend.pl';
while($list_url ne ''){
  push @friends, $mixi->get_list_friend($list_url);
  my $next = $mixi->parse_list_friend_next();
  $list_url = ($next) ? $next->{'link'} : '';
}

##誕生日データ生成
output(iCal_head());
foreach my $friend(@friends){
  my $friend_name = $friend->{'subject'};
  my $friend_link = $friend->{'link'};
  my $friend_data = $mixi->get_show_friend_profile($friend->{'link'});
  if ($friend_data->{'誕生日'} =~ /(\d+)月(\d+)日/s) {
    my $friend_bd =  sprintf("%02d%02d", $1, $2);
    # 誕生日が過ぎてるなら来年の日付にする
    my $this_data_ymd = sprintf("%04d%02d%02d", 1900 + $year + (($today > $friend_bd) ? 1 : 0), $1, $2);
    my $this_data_summary = cv("${friend_name}の誕生日");
    my $this_data = << "EOD";
BEGIN:VEVENT
UID:${friend_link}
DESCRIPTION:${friend_link} [${this_data_summary}]
DTSTART:${this_data_ymd}
DTEND:${this_data_ymd}
SUMMARY:$this_data_summary
END:VEVENT
EOD
   output($this_data);
  }
}
output(iCal_tail());

sub output{
  my $src = shift;
  print jcode($src)->utf8;
}
sub cv {
  #http://www.villagewood.net/blog/archives/000204.html
  my $src    = shift;
  my @out    = unpack("C*",jcode($src)->ucs2);
  my $answer = '';
  for(my $i=0; $i < $#out; $i = $i + 2){
    $answer .= '&#'.($out[$i] * 256 + $out[$i + 1]) . ';';
  }
  $answer;
}

sub iCal_head {
<< "EOD";
BEGIN:VCALENDAR
PRODID:mixi - birthday list
VERSION:2.0
METHOD:PUBLISH
CALSCALE:GREGORIAN
X-WR-CALNAME:${config_title}
X-WR-CALDESC:${config_title}
X-WR-TIMEZONE:Asia/Tokyo
EOD
}

sub iCal_tail {
<< "EOD";
BEGIN:VTIMEZONE
TZID:Asia/Tokyo
BEGIN:STANDARD
DTSTART:19700101T000000
TZOFFSETFROM:+0900
TZOFFSETTO:+0900
END:STANDARD
END:VTIMEZONE
END:VCALENDAR
EOD
}

EUC-jpで保存してみてくださいませ。

使い方

とりあえずこんな感じで実行してみてくださいな。

perl birthday.pl > mymixibd.ics 

これで生成されたicsファイルをGoogle Calendarの Manage calendars から Import Calendar を選び、生成したmymixibd.icsをimportすればOKです。

My Calendarsで「Birthdays」という名前で作って、そこに流し込んだら色分けできるのでいいと思いますよ。

使い捨てスクリプトなので、適当にお使いください。

トラックバック

このエントリーのトラックバックURL:
http://hsj.jp/blog/mt-tb.cgi/1258

この一覧は、次のエントリーを参照しています: マイミクの誕生日をGoogle Calendar用のiCalデータにする。:

» mixi予定表の予定一覧をiCal形式に変換する mixi2iCal 送信元 Open MagicVox.net
mixi にはマイミクの誕生日やコミュニティのイベント,予定などを一覧できる 予定表があります。 私の場合,普段のスケジュール管理には Google C... [詳しくはこちら]

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)