perlならばcpanの「Net::Google::GData」とか使った方がいいかもしれない。
ただ、まだ「Net::Google::GData」は使ったこと無い。
でも↓くらいのほうが見通し良い。
昨日のcurlの場合と同様に、GoogleLoginに使用する「auth」を取得してサービスコード「cp」に一覧を要求している。
#!/usr/bin/perl
use strict;
use LWP::UserAgent;
use HTTP::Request::Common qw(GET POST);
use URI::Escape qw(uri_escape);
use XML::LibXML;
use Data::Dumper;
my $gdata_user='your-account@gmail.com';
my $gdata_pass='your-password';
my $url = 'https://www.google.com/accounts/ClientLogin';
my %postdata = (
Email => $gdata_user,
Passwd => $gdata_pass,
accountType => 'GOOGLE',
source => 'Google-Contact-Lister',
service => 'cp',
);
my $req = POST($url, [%postdata]);
my $ua = LWP::UserAgent->new;
my $res = $ua->request($req);
my $google_auth = (split(/\n/, $res->content))[2];
$google_auth =~ s!^Auth=!!;
$url = 'http://www.google.com/m8/feeds/contacts/' .
uri_escape($gdata_user) . '/base';
$req = GET($url, [%postdata]);
$req->header(
Authorization => "GoogleLogin auth=$google_auth",
);
$res = $ua->request($req);
my $x = XML::LibXML->new;
my $doc = $x->parse_string($res->content)->documentElement;
my @nodes = $doc->getElementsByTagName('entry');
for my $node (@nodes) {
my @title = $node->getElementsByTagName('title')->[0]->getChildNodes();
my $gd = $node->getElementsByTagName('gd:email')->[0];
print $title[0]->toString() . "," . $gd->getAttribute('address') . "\n"
if @title && $gd;
}
実行結果は、めちゃめちゃ非公開なものなので、出せません><CSV形式で名前とメアドが一覧されます。
AWSWORD:perl: