Объединение нескольких каналов Календаря Google для отображения на моем рабочем столе - PullRequest
0 голосов
/ 03 декабря 2008

У меня есть несколько календарей Google, которые я хотел бы объединить и разместить на рабочем столе Windows с помощью Samurize . Я пытался использовать плагин Page Scraper от Samurize, но, похоже, он не подходит для этой задачи.

Я могу заставить Samurize запустить скрипт и разместить его на рабочем столе, но я не уверен какие лучшие инструменты для этого.

Все мои URL имеют вид:

http://www.google.com/calendar/feeds/example%40gmail.com/private-REMOVED/basic?futureevents=true&orderby=starttime&sortorder=ascending&singleevents=true

Так что я могу получить их, используя curl, но тогда мне нужно их отфильтровать.

Я хочу что-то похожее на:

2009 12 02  Event from calendar 1's description 
2009 12 03  Event from calendar 2's description 
2009 12 04  Event from calendar 1's description 
2009 12 05  Event from calendar 3's description 
2009 12 06  Event from calendar 1's description 

Однако даты в каналах календаря форматируются следующим образом:

<title type='html'>Event from calendar 1's description</title><summary type='html'>When: Fri 5 Dec 2008&lt;br&gt;

Так как мне отфильтровать даты и описания и преобразовать даты?

(у меня установлен cygwin, так что что-то, использующее perl или sed / awk, было бы идеально, так как я достаточно знаком с ними, чтобы быть уверенным в их изменении в будущем, но я открыт для предложений.)

Ответы [ 3 ]

1 голос
/ 03 декабря 2008

Построение по сценарию Джона В. Это то, что я использую

#!c:\cygwin\bin\perl.exe -w
use strict;
use LWP::Simple qw(get);

my %calendars = ( "Sam Hasler", "http://www.google.com/calendar/feeds/blah/blah/basic"
                , "Family    ", "http://www.google.com/calendar/feeds/blah/blah/basic"
                , "Work      ", "http://www.google.com/calendar/feeds/blah/blah/basic"
                );

my $params = "?futureevents=true&orderby=starttime&sortorder=ascending&singleevents=true";

my %months = ( "Jan", "01", "Feb", "02", "Mar", "03", "Apr", "04"
             , "May", "05", "Jun", "06", "Jul", "07", "Aug", "08"
             , "Sep", "09", "Oct", "10", "Nov", "11", "Dec", "12");

my $calendar_name;
my $calendar_url;
my @lines;

while (($calendar_name, $calendar_url) = each(%calendars)){
    my $calendar_data = get "$calendar_url$params";
    @lines = split(/\n/, $calendar_data);

    foreach (@lines) {
        if (/<title type='html'>([\d\D]*)<\/title><summary type='html'>When: (\S+) (\S+) (\S+) (\S+)&lt;br&gt;/)
        {
            my $day = "$3";
            if ($3 < 10 ) {
                $day = "0$3";
            }

            print "$5 $months{$4} $day\t$calendar_name\t$1\n";
        }
    }

}

Я просто передаю вывод через sort, чтобы получить его в порядке дат.

Обновление: Я преобразовал свой скрипт в плагин и отправил его на веб-сайт Samurize: Слияние каналов Календаря Google .

1 голос
/ 23 апреля 2009

Две идеи.

Вы можете использовать Yahoo Pipes (см. эту статью .)

Или, если вы не хотите ждать, пока Yahoo обновит свои данные, здесь - это разрабатываемый скрипт python для объединения файлов ICAL.

1 голос
/ 03 декабря 2008

Я изучаю Perl, поэтому, пожалуйста, не смейтесь слишком усердно, но вот кое-что, что может помочь вам в анализе:

#!C:\Perl\bin -w
use strict;

my %months = ("Jan", "01", "Feb", "02", "Mar", "03", ... etc. etc. ... "Dec", "12");

$_ = "<title type='html'>Event from calendar 1's description</title><summary type='html'>When: Fri 5 Dec 2008<br>";

if (/<title type='html'>([\d\D]*)<\/title><summary type='html'>When: (\S+) (\S+) (\S+) (\S+)<br>/)
{
    print "$5 $months{$4} $3 $1\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...