sironekotoroの日記

Perl で楽をしたい

Perl で Google Drive API を使ってファイル一覧を取得する

さて、Google Cloud Platform で利用する ACCESS TOKEN と REFRESH TOKEN を手にしたからには、次の段階へ向かわねばなりません。

そもそも、なんか OAuth いじるの楽しくなって色々やってしまいましたが、これは目的と手段が逆転するいつものパターンです。

楽しいんですよねー

Google Drive に上がっているファイル一覧を取得する

GET でパラメータを並べていくだけなので、簡単にできました。

注意するところとしては、一回の応答で取得できるのは100件のみ。100件以上ファイルがある場合には応答に nextPageToken が含まれるので、次の API 組み立ての際に pageToken を加えてアクセスって感じです。

これで連続取得ができます。

大量にファイルがあると返ってこないので、5 回取得したら(つまり 500件)ループを抜けるようにしてます。

#!/usr/bin/env perl
use strict;
use warnings;

binmode STDOUT, ":utf8";

use HTTP::Tiny;
use JSON;
use URI::Escape;
use URI;

my $GOOGLE_DRIVE_API = "https://www.googleapis.com/drive/v3/files";
my $ACCESS_TOKEN       = "";
my $count_limit = 5;

# 全てのファイルを取得する
my $uri = URI->new($GOOGLE_DRIVE_API);

$uri->query_form( access_token => $ACCESS_TOKEN );

files($uri);

sub files {
    my $uri   = shift;
    my $count = 0;
    my $ht    = HTTP::Tiny->new();
    while ( $count < $count_limit ) {
        my $contents = decode_json( $ht->get($uri)->{content} );

        $uri->query_form(
            access_token => $ACCESS_TOKEN,
            pageToken    => $contents->{nextPageToken},
        );

        for my $content ( @{ $contents->{files} } ) {

            print "=" x 20 . "\n";
            printf( "%-8s: %s\n", "id",       $content->{id} );
            printf( "%-8s: %s\n", "name",     $content->{name} );
            printf( "%-8s: %s\n", "mimeType", $content->{mimeType} );
            printf( "%-8s: %s\n", "kind",     $content->{kind} );
            print "=" x 20 . "\n";
        }

        $count++;
        last if !$contents->{nextPageToken};

        # 最終ページには nextPageToken キーが無い
    }
}
====================
id      : 13uf_8fJph3J3raPee0Sg5rsgb-w5MIUBLVdhDhD8xSE
name    : チェックリスト
mimeType: application/vnd.google-apps.document
kind    : drive#file
====================
====================
id      : 1f9ZuDCOSGUujhSSXvv_kruzI7qbkKq9FQXf2YuNn_Io
name    : メモ
mimeType: application/vnd.google-apps.document
kind    : drive#file
====================
...