ishiducaの日記 このページをアンテナに追加 RSSフィード

2010-05-04

[][Net::Google::Calendar]ターミナルからGoogleCalendarにイベントを追加する 13:52 [Net::Google::Calendar]ターミナルからGoogleCalendarにイベントを追加する - ishiducaの日記 を含むブックマーク はてなブックマーク - [Net::Google::Calendar]ターミナルからGoogleCalendarにイベントを追加する - ishiducaの日記 [Net::Google::Calendar]ターミナルからGoogleCalendarにイベントを追加する - ishiducaの日記 のブックマークコメント

ターミナルから自分のカレンダーにイベントを追加する(gcal)のにNet::Google::Calendarを使うのに少しハマった。最初試したら

401 Authorization required at ...

とエラーを吐くので調べた結果、Mac OS 10.5 ではCypt::SSLeayがインストールされていないかららしいとわかったので

cpanm Cypt::SSLeay

してから実行したら動いた。(参照 reembody » Blog Archive » Net::Google::Calendar

こんな感じで

$ gcal 2010-05-08_10:00 2010-05-09_17:00 開発温泉

引数とかは

$ gcal -h

で見られます

gcal

#!/usr/bin/env perl -s
use strict;
use warnings;
use utf8;
use Encode;
use Net::Google::Calendar;
use DateTime;
use DateTime::Format::W3CDTF;
use XML::Atom::Link;

our($h, $allday, $loc, $des, $link);

sub usage {

local $_ =<<"USAGE";
Usage: $0 [-allday][-loc=location][-des=description][-link=url] startTime endTime summary

    # format of Time
      YYYY-MM-DD_hh:mm (ex: 2010-05-09_12:02)

USAGE
;

}
sub check {
    my $reg = '^20\d\d-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])'
            . 'T([01][0-9]|2[0-3]):([0-5][0-9])$';

    local $_ = shift;
    my $flg  = shift;

    s/\//-/g;
    s/\./-/g;
    s/_/T/;
    s/ /T/;

    # 年が不足していた場合は追加する
    if(/^0[1-9]|1[0-2]/) {
        my $dt = DateTime->now;
        my $y  = $dt->year;
        $_ = $y . '-' . $_;
    }

    # 時刻が不足してた場合には適当に付け足す
    /T([01][0-9]|2[0-3]):([0-5][0-9])$/ or
        $_ .= $flg eq 'start' ? 'T00:00' : 'T23:59';

    # 日付フォーマットの確認
    /$reg/ or die usage;

    # 終日(allday)フラグのあった場合には、1日後の日付に直す
    my $dt = DateTime::Format::W3CDTF->parse_datetime("$_+09:00");
    $allday and $dt = $dt->add( days => 1 );
    $dt;
}

# ヘルプ表示
$h and print usage and exit 0;
# 引数チェック
scalar @ARGV < 3 and die usage;

my( $start, $end, @summary ) = @ARGV;

# 日付フォーマットチェックと日付オブジェクトの生成
$end   = check($end, 'end');
$start = check($start,'start');

# ログイン
my $private_url = 'http://www.google.com/calendar/feeds/'
    . 'xxxxxxxxxx%40group.calendar.google.com/private-<key>/basic';
my $username = 'your mailaddress'; # xxxx@gmail.com
my $password = 'your password';
my $cal = Net::Google::Calendar->new( url => $private_url );
$cal->login( $username, $password );

# イベントのエントリー
my $entry = Net::Google::Calendar::Entry->new();
$entry->title( join(" ", @summary) );
$entry->content($des) if $des;
$entry->status('confirmed');
$entry->location($loc) if $loc;
$entry->transparency('opaque');
$entry->visibility('private');
$entry->when( $start, $end , $allday );
if ($link) {
    my $ref = $link;
    $link = XML::Atom::Link->new;
    $link->type('text/html');
    $link->rel( 'alternate');
    $link->href($ref);
    $entry->add_link($link);
}
$cal->add_entry($entry);

# 一覧を表示
my $enc_utf8 = find_encoding('utf-8');
$cal = Net::Google::Calendar->new( url => $private_url );
foreach my $ev ($cal->get_events()) {
    my $cont = $ev->content->body;
    $cont    =~ s|<br />||g; 
    print $ev->title , "\n";
    print $enc_utf8->encode($cont) , "\n\n";
}

exit 0;

$private_urlは「橋本商会 » Net::Google::Calendarで予定一覧を取得する」を参照にしました。

JaneJane2012/02/21 21:19Apparently this is what the etseeemd Willis was talkin' 'bout.

mdlqutlqmdlqutlq2012/02/23 19:27ynmjLu <a href="http://burjdypjrcpt.com/">burjdypjrcpt</a>

mjfbexzmjfbexz2012/02/23 23:42TwuUUq , [url=http://vgxehmixxfdl.com/]vgxehmixxfdl[/url], [link=http://vyyfooecvmdk.com/]vyyfooecvmdk[/link], http://hoogapcjfmos.com/

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20100504