Google::API::Clientを使う(perl)

Pocket

ここのところいろいろな言語でGoogle APIをたたいてみています。PerlのGoogle::API::Clientを使ってみたのですが、ドキュメントがいまいち整備されていなかったので、実際にGmail APIをたたくサンプルを書いてみました。大まかな作りはruby, pythonのライブラリとあまり変わりありません。

OAuth2認証部分

#!/usr/bin/perl
use Data::Dumper;
use Google::API::Client;
use Google::API::OAuth2::Client;
my $auth = Google::API::OAuth2::Client->new({
    auth_uri => "https://accounts.google.com/o/oauth2/auth",
    token_uri => "https://accounts.google.com/o/oauth2/token",
    client_id => "your-id",
    client_secret => "your-secrets",
    redirect_uri => "urn:ietf:wg:oauth:2.0:oob",
    auth_doc => {
        oauth2 => {
            scopes => {
                "https://www.googleapis.com/auth/gmail.readonly"
                    => "gmail read"
            }
        }
    });

print $auth->authorize_uri, "\n";
my $code = <STDIN>;
$auth->exchange($code);

$auth->authrorize_uriはresponce_type=codeなURLを生成します。上記コードで画面上に表示されたURLに接続・承認を行い、ブラウザ上に表示されたアクセスコードをexchangeメソッドの引数に渡します。これで認証は完了します。

client_secrets.jsonファイルからオブジェクトを生成するnew_from_client_secretsメソッドもありますが、jsonファイルにシリアライズするメソッドは用意されていないようです。

サービスの構築とメソッドの実行

my $client = Google::API::Client->new;
my $service = $client->build('gmail', 'v1');
my $body = {
    'userId' => 'your-email-address@example.jp'
};
my $res = $service->users->messages->list(body => $body)->execute({
    "auth_driver" => $auth});
print Dumper($res->{"messages"});

ポイントは以下です。

  • client->buildでAPIとバージョンを指定
  • bodyは連想配列で記述(jsonにマッピングされる)
  • 認証情報はexecuteの引数auth_driverに指定する
    • リフレッシュはGoogle::API::Methods側でよしなにしてくれる
  • 得られる結果もjsonを連想配列化したものになる

ブラウザでAPIs Explorerを試しながらあれこれ試してみればすぐに理解できると思います。