[perl]Google::API::Clientを使ってみた
perl歴はそろそろ1週間はすぎてるくらいのうえちょこです。初めてのPerlと続・初めてのPerlは読みましたが、リファレンスとオブジェクトの当たりから全然理解できてないです。なれるまでには暫く時間がかかりそうです。
さて、そうはいっても書かなきゃ慣れないので、前職でも使っていた日報クリエイターというWebアプリのPerl版をつくろうかなーと思っています。機能としては、Google Calendarから指定のカレンダーの指定の期間のイベントを取得し、整形して出力するだけのものです。前のはCakePHPで作ったんですがソースコードは会社に寄付しちゃってるんで、また1から作り直します。
最近のGoogle Data APIはバージョンが新しくなったらしく、GoogleからClient Libraryという形でライブラリが提供されています。PHP、Ruby、Python、Java、.NET、JavaScript、Objective-Cなどがあります。Perlのはありませんww が、perl版のClient Libraryを作っている方がいました。
Google APIs Client Library for Perl
モジュール構造で言うとGoogle::API::Clientです。
インストールログを貼っておきます。
そういえば、以下のインストール手順だと、本家のgithubから取ってきているんだけれど、今のバージョンだと、calendar APIに対するOAuth用URLが間違って出力されてしまうので、実際はforkしてoauth2_scope_delimiterというブランチ切ったものを使用しました。pull request投げたら、ローカルでは直してあるけどまだpushしてないバグだったって返答が来たので、そのうち本家も更新されると思います。
-
## 環境はperlbrewでインストールしたperl 5.14.2とcpanm
-
-
######################
-
# ライブラリのDL
-
######################
-
$ mkdir _libs
-
$ cd _libs
-
$ git clone https://github.com/comewalk/google-api-perl-client
-
$ cd google-api-perl-client
-
-
######################
-
# 1回目のMakefile.PL … 失敗
-
######################
-
$ perl Makefile.PL
-
-
### Can't locate inc/Module/Install.pm in @INC (@INC contains: …… ) at Makefile.PL line 1.
-
### BEGIN failed--compilation aborted at Makefile.PL line 1.
-
-
### (おそらく Module::Install がないのか?インストールしてみる)
-
$ cpanm Module::Install
-
-
######################
-
# 2回目のMakefile.PL … 失敗
-
######################
-
$ perl Makefile.PL
-
-
### Unknown function is found at Makefile.PL line 3.
-
### Execution of Makefile.PL aborted due to runtime errors.
-
-
### (readme_fromがないようなので、 Module::Install::ReadmeFromPod をインストールしてみる)
-
$ cpamn Module::Install::ReadmeFromPod
-
-
######################
-
# 3回目のMakefile.PL … 失敗
-
######################
-
$ perl Makefile.PL
-
-
### Writing README from lib/Google/API/Client.pm
-
### Unknown function is found at Makefile.PL line 6.
-
### Execution of Makefile.PL aborted due to runtime errors.
-
-
### (auto_set_repositoryがないようなので、 Module::Install::Repository をインストールしてみる)
-
-
######################
-
# 4回目のMakefile.PL … 成功
-
######################
-
$ perl Makefile.PL
-
-
######################
-
# 1回目のmake … 成功
-
######################
-
$ make
-
-
######################
-
# 1回目のmake test … 失敗
-
######################
-
$ make test
-
-
### (いろんなモノが足りない。エラーメッセージで分かるものからインストール)
-
$ cpanm LWP::Protocol::https Test::Pod Test::Pod::Coverage
-
-
######################
-
# 2回目のmake test … 失敗
-
######################
-
$ make test
-
-
### (おそらくテストは通らないんじゃない?とりあえず先進む)
-
-
######################
-
# 1回目のmake install … 成功
-
######################
-
$ make install
-
-
### (サンプルプログラムでインストール確認)
-
perl eg/urlshortener/cli_public_access.pl
-
-
### $VAR1 = {
-
### 'kind' => 'urlshortener#url',
-
### 'longUrl' => 'http://code.google.com/apis/urlshortener/',
-
### 'id' => 'http://goo.gl/BwA5N'
-
### };
-
###
-
### $VAR1 = {
-
### 'kind' => 'urlshortener#url',
-
### 'status' => 'OK',
-
### 'longUrl' => 'http://code.google.com/apis/urlshortener/',
-
### 'id' => 'http://goo.gl/BwA5N'
-
### };
ちなみに、こんな感じのコードで、calendarList.listが取得出来ました。<CLIENT ID>とかはGoogle APIs Consoleで取得してください。
-
use strict;
-
use warnings;
-
use lib "/path/to/libs/google-api-perl-client/lib";
-
use feature qw/say/;
-
-
use Data::Dumper;
-
-
use Encode;
-
use Google::API::Client;
-
use OAuth2::Client;
-
-
my $client = {
-
id => '<client id>',
-
secret => '<client secret>',
-
redirect_url => '<client redirect url>',
-
};
-
my $service = Google::API::Client->new->build('calendar', 'v3');
-
-
my $auth_driver = OAuth2::Client->new({
-
auth_uri => Google::API::Client->AUTH_URI,
-
token_uri => Google::API::Client->TOKEN_URI,
-
client_id => $client->{id},
-
client_secret => $client->{secret},
-
redirect_uri => $client->{redirect_url},
-
auth_doc => $service->{auth_doc},
-
});
-
-
say $auth_driver->authorize_uri;
-
-
say 'Enter verification code:';
-
my $code = ;
-
-
my $token_obj = $auth_driver->exchange($code);
-
-
my $res = $service->calendarList->list->execute({ auth_driver => $auth_driver });
-
#say Dumper($res);
-
-
my @calendar_list;
-
for my $item (@{$res->{items}}) {
-
}
-
for my $calendar (@calendar_list) {
-
}