mixiのカレンダーをGoogleで見てみる




  • 今日はmixiのカレンダーをiCalender形式に変換して、
    Googleカレンダーに取り込む実験。

    どうも色々調べて見ると、カレンダー情報のフォーマットはRFCで標準化しようとしてるらしいです。
    前回の日記(http://verygoodservice.jp/wp/?p=44)と同じようにmixiPHPをカスマイズして、使って見ました。

    ■mixiiiiical - mixiカレンダーをiCalender形式で配信
     http://verygoodservice.jp/mixical/

    使い方はmixxxxxirss!とほぼ同じ。

    ユーザ名、パスワードと配信したい年を入力して「フィードURLを作成」ボタンをクリックすると、
    iCalendarファイルのURLが出力されます。

    あとはこのURLをiCalendarに対応したスケジューラ(MacのiCal、Googleカレンダーなど)に
    このURLを登録するだけです!

    iCalendarファイルは動的に作ってるので、mixiで更新するとスケジューラ側にも反映
    されるはずです。(試してないけど)

    iCalendar形式でイベント情報を配信してるサービスは他にもあって、
    http://www.apple.com/jp/ical/library/index.html
    とかと組み合わせると面白いかもしれません。

    東京アートビート(http://www.tokyoartbeat.com/)が配信してるRSSもiCalendarに変換する
    ウェブサービスを作ろうかなぁと思ってます。

    世の中にあふれるイベント情報を収集する仕組みとかあったら便利だよね。

    さて、今日のmixiPHPの修正点。
    必要なとこしか直してないので、そこだけ公開。

        /**
         * カレンダーを取得
         * 
         * @param int $year 年
         * @param int $month 月
         * @return array 
         */
        function parse_show_calendar($year = 0, $month = 0)
        {
            if (empty($year) || empty($month)) {
                $url = "show_calendar.pl";
            } else {
                $url = "show_calendar.pl?year=" . intval($year) . "&month=" . intval($month);
            } 
            $content = $this->fetch($url);
            $term = $this->get_cal_term("", $content);

            //return $content;
            $content = mb_convert_encoding($content,"UTF-8","EUC-JP");
           
            preg_match(’/<table width="670" border="0" cellspacing="1" cellpadding="3" class="calendarTable01">(.*?)<\/table>/s’, $content, $match);
            $content = preg_replace(’/<tr align="center" bgcolor="#fff1c4">.*?<\/tr>/is’, ”, $match[1]);
            preg_match_all(’/<td bgcolor="[^<>]+" align="left" valign="top"><font style="[^<>]+">(\S*?)<\/font>(.*?)<\/td>/is’, $content, $result, PREG_SET_ORDER);
            foreach($result as $myrow) {
                // $date = array("year" => $term[’year’], "month" => $term[’month’], "day" => intval($myrow[1]));
                $date = $this->mktime(0, 0, 0, $month, $myrow[1], $year);
                $schedule = explode("<br />", $myrow[2]);
                foreach($schedule as $desc) {
                    if (preg_match(’/<img src="(.*?)" width="16" height="16" align="middle" \/><a href=(\S*?)>(.*?)<\/a>/i’, $desc, $ret)) {
                        $icon = pathinfo($ret[1]);
                        $ret[2] = preg_replace(’/"/i’,"",$ret[2]);
                        $item[] = array(’title’ => $ret[3], ‘link’ => $this->base_url . $ret[2], ‘date’ => $date , "category" => $this->mixi_cal_icon[$icon[’basename’]]);
                    } else if (preg_match(’/<a href=".*?" onClick="MM_openBrWindow\(\’(view_schedule\.pl\?id=\d+)\’.*?\)"><img src="(\S*?)".*?>(.*?)<\/a>/i’, $desc, $ret)) {
                        $icon = pathinfo($ret[2]);
                        $item[] = array(’title’ => $ret[3], ‘link’ => $this->base_url . $ret[1], ‘date’ => $date , "category" => $this->mixi_cal_icon[$icon[’basename’]]);
                    } 
                } 
            } 
            return $item;
        } 

        function &get_cal_term($act = "", &$content)
        {
            $result = array();
            switch ($act) {
                case ‘next’:
                    preg_match(’/<a href="(show_calendar\.pl\?.*?)">([^<>]+?)&nbsp;&gt;&gt;/’, $content, $match);
                    $result = array("link" => $match[1], "title" => $match[2]);
                    break;

                case ‘prev’:
                    preg_match(’/<a href="(show_calendar\.pl\?.*?)">&lt;&lt;&nbsp;([^<>]+)/’, $content, $match);
                    $result = array("link" => $match[1], "title" => $match[2]);
                    break;

                default:
                    preg_match(’/<a href="show_calendar\.pl\?year=(\d+)&month=(\d+).*?">[^&]*?<\/a>/’, $content, $match);
                    $result = array("year" => intval($match[1]), "month" => intval($match[2]));
                    //echo $content;
                    //var_dump($result);
            } 
            return $result;
        } 


    Posted on

  • Leave a reply