過去に北海道ライフル射撃協会の紹介(動画あり) の内容をWeb::ScraperでスクレーピングしてNet::Google::Calendarで投稿するスクリプトを書きました。
が、サンプルに使ってたページが無くなってました。
スクレーピングする元さえあれば動くスクリプトなのでそのまま貼っておきます。
これを応用すると色んなページのHTMLで書いてある予定とかをGoogleカレンダーに投稿できます。
例えばHTMLで書いてた昔の日記のタイトルを$entry->content(‘content’)で内容と一緒に投稿するとか。
use utf8;
use strict;
use warnings;
use Web::Scraper;
use URI;
use DateTime;
use Net::Google::Calendar;
# HTMLスクレーピング
my $scraper = scraper {
process '/html/body/table/tbody/tr/td/table/tbody/tr/td/div[2]/div[3]/table/tbody/tr[2]/td[2]', 'date' => 'HTML';#日付の書いてあるtdまでのXPath
process '/html/body/table/tbody/tr/td/table/tbody/tr/td/div[2]/div[3]/table/tbody/tr[2]/td[3]', 'nakami' => 'HTML';#内容までのXPath
};
# URL
my $uri = new URI('http://www.h3.dion.ne.jp/~moasa/shoukai.html');
# オブジェクト生成
my $res = $scraper->scrape($uri);
#########データ整形####################
my $temp = $res->{date};
$temp =~ tr/0-9A-Za-z/0-9A-Za-z/;#全角数字を半角に
$temp =~ s/<br \/>/\n/g;
$temp =~ s/<font [^>]*">|<\/font>//g;
my @daylist = split(/\n/, $temp);
##
my $temp2 = $res->{nakami};
$temp2 =~ tr/0-9A-Za-z/0-9A-Za-z/;
$temp2 =~ tr/:/:/;
$temp2 =~ s/<br \/>/\n/g;
$temp2 =~ s/<font [^>]*">|<\/font>| //g;
$temp2 =~ s{x{301c}}{x{ff5e}}g; #波ダッシュ変換
$temp2 =~ s/~/-/g;
my @titlelist = split(/\n/, $temp2);
########################################
# Google カレンダーへのログイン処理
my $private_url = 'https://www.google.com/calendar/feeds/カレンダーID@group.calendar.google.com/private-カレンダーID/basic';
my $username = '***@gmail.com'; # x...@gmail.com
my $password = '***'; #パスワード
# オブジェクト生成
my $cal = Net::Google::Calendar->new( url => $private_url );
$cal->login($username, $password);
my $counter = 0;
my $datetemp;
my $flag = 0;
my $dt = DateTime->now;
my $year = $dt->year; #今年の西暦取得
foreach my $title (@titlelist) { #イベントのタイトル
my $date = $daylist[$counter]; #イベントのタイトルと対になる日付
$counter++;
my $entry = Net::Google::Calendar::Entry->new();
$entry->status('confirmed');
$entry->transparency('transparent');
$entry->visibility('private'); #一般公開する場合public
if ($date eq "\n" || $date eq "") { $date = $datetemp; }
chomp($date);
my $next;
my @list = ($date =~ /d+/g); #日付の数字だけ取得
my $num = @list;
if ($num != 2){
$next = $list[2] - $list[1];
}
my $month = $list[0];
my $day = $list[1];
if ($month == 12) {$flag = 1;}
my $hour = 0;
my $allday = 0;
my $plus = 0;
if ($title =~ /(d{1,2}):(d{1,2})-(d{1,2}):(d{1,2})/) {
$hour = $1;
$plus = $3 - $1;
$title =~ s/d{1,2}:d{1,2}-d{1,2}:d{1,2}//g;
}
elsif ($title =~ /(d{1,2}):(d{1,2})-$/) {
$hour = $1;
$plus = 24- $1;
$title =~ s/d{1,2}:d{1,2}-//g;
}
else {
$allday = 1;
}
if ($month < 12 && $flag == 1) {
$year++;
$flag = 0;
}
if (defined($next)) { #日付をまたぐ場合
my $dt = DateTime->new(
time_zone => 'Asia/Tokyo',
year => $year,
month => $month,
day => $day
);
my $dt2 = $dt + DateTime::Duration->new( days => $next+1 );
my $dt3 = $dt2->add( days =>1 );
$entry->when($dt->add( days =>1 ), $dt2, $dt3);
}
elsif ($allday == 1){ #終日の場合
my $dt = DateTime->new(
time_zone => 'Asia/Tokyo',
year => $year,
month => $month,
day => $day
);
$entry->when($dt,$dt->add( days => 1 ),$dt);
}
else {
my $dt = DateTime->new( #時間指定の場合
time_zone => 'Asia/Tokyo',
year => $year,
month => $month,
day => $day,
hour => $hour,
minute => 0
);
$entry->when($dt, $dt+DateTime::Duration->new( hours => $plus ));
}
$entry->title($title);
$cal->add_entry($entry); #カレンダーにイベントを投稿
$datetemp = $date;
}