sironekotoroの日記

Perl で楽をしたい

Perl から Google Drive にファイルをあげたりダウンロードしたり一覧を取ったり

Google OAuth のクライアントIDとクライアントシークレットを入手する

  1. まずは Google Cloud Platform でプロジェクト作成から。

    もちろん、既存のプロジェクトに Google Drive API の利用権限を与えてもokです。

    f:id:sironekotoro:20201025162317p:plain

  2. プロジェクトの作成が終わったら、左上のナビゲーションメニューから 「APIとサービス」-> 「ライブラリ」と進みます。

    f:id:sironekotoro:20201025184243p:plain

  3. 検索スペースに Google Drive と入力して Google Drive API を選択し、Google Drive API を有効化します。

    f:id:sironekotoro:20201025184402p:plain

  4. 概要のページに戻りましたが、「有効化のステータス」が「有効」になっていますでしょうか?なっていればokです。

    f:id:sironekotoro:20201025184535p:plain

  5. 左側のメニュー(左上には「APIとサービス Google Drive API」とある)から、認証情報を選択します。

    f:id:sironekotoro:20201025184638p:plain

  6. 上にある「認証情報を作成」をクリックし、「OAuth クライアントID」を選択します。

    クライアントIDを作成するためには同意画面の作成が必要、という事で右側(または下側)にある「同意画面を設定」ボタンをクリックします

    f:id:sironekotoro:20201025184824p:plain

  7. OAuth同意画面は前回と同様に「内部」を選択して「作成」ボタンをクリックします。

    f:id:sironekotoro:20201025185003p:plain

  8. サービス名を入力します。わかりやすい名前にしておきましょう。

    f:id:sironekotoro:20201025185205p:plain

  9. 同じ画面の「Google API のスコープ にある「スコープの追加」ボタンをクリックします。

    f:id:sironekotoro:20201025185357p:plain

  10. スコープでは /auth/drive を選択し、右下の「追加」ボタンをクリックします

    f:id:sironekotoro:20201025185725p:plain

  11. 同意画面に戻りますが、Google API のスコープに Google Drive が追加されていればokです。

    画面を下にスクロールして、「保存」ボタンをクリックします。

    f:id:sironekotoro:20201025185836p:plain

  12. 同意画面に戻るので、左側メニューから「認証情報」をクリックし、上にある「認証情報を追加」をクリックし、「OAuth クライアントID」をクリックます。

    アプリケーションの種類は「デスクトップアプリ」を選択し、下にある「作成」ボタンをクリックします。

    f:id:sironekotoro:20201025190016p:plain

  13. OAuthクライアントが作成されました!毎度ながら長い道のりですね・・・

    f:id:sironekotoro:20201025190217p:plain

ACCESS TOKEN と REFRESH TOKEN を手に入れる

前回利用した 3 つのキーを取得するスクリプトを使おうと思ったのですが・・・Google Sheet の時には利用しなかった ACCESS TOKEN が必要になることが判明しました。

sironekotoro.hateblo.jp

ってことで、先のスクリプトを改修しました。

使い方も前回を参考にしてください。

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

use Net::Google::OAuth;

my $CLIENT_ID = "";
my $CLIENT_SECRET = "";
my $SCOPE         = 'drive';
my $EMAIL         = 'hogehoge@sironekotoro.com';

my $oauth = Net::Google::OAuth->new(
    -client_id     => $CLIENT_ID,
    -client_secret => $CLIENT_SECRET,
);

$oauth->generateAccessToken(
    -scope => $SCOPE,
    -email => $EMAIL,
);

print "This is ACCESS TOKEN:\n";
print "=" x 20 . "\n";
print $oauth->getAccessToken() . "\n";
print "=" x 20 . "\n";

print "This is REFRESH TOKEN:\n";
print "=" x 20 . "\n";
print $oauth->getRefreshToken() . "\n";
print "=" x 20 . "\n";

これで、Google Drive API に必要な 4 つの キーが手に入りました。

  • クライアントID
  • クライアントシークレット
  • アクセストーク
  • リフレッシュトーク

Google Drive API を使う!

やっとこさです。

今回も色々と大変だろうなー、と思っていたんですが、モジュールがとても使いやすく、ほとんど詰まる事なく Google Drive にファイル上げたり下げたりすることができました。

めちゃくちゃ助かりました。すごい!

metacpan.org

ほとんど SYNOPSIS に載っている通りなのですが、うちの試したスクリプトを載せておきます。

ファイルのダウンロード、アップロードについてはコメント外してお試しください。

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

use feature qw/say/;
use Data::Dumper;
binmode STDIN,  ":utf8";
binmode STDOUT, ":utf8";

use Carp;

use Net::Google::Drive;

my $CLIENT_ID              = "";
my $CLIENT_SECRET    = "";
my $ACCESS_TOKEN    = "";
my $REFRESH_TOKEN  = "";

my $disk = Net::Google::Drive->new(
    -client_id     => $CLIENT_ID,
    -client_secret => $CLIENT_SECRET,
    -access_token  => $ACCESS_TOKEN,
    -refresh_token => $REFRESH_TOKEN,
);

# # ファイル一覧
my $file_name = '*';    # アスタリスクで全部のファイルの情報を取ってくる

my $files = $disk->searchFileByNameContains( -filename => $file_name )
    or croak "File '$file_name' not found";

for my $file ( @{$files} ) {
        say '=' x 20;
        say $file->{id};
        say $file->{name};
        say $file->{mimeType};
        say $file->{kind};
        say '=' x 20;
}

# # ファイルダウンロード
# # -dest_file :保存先(ローカル)でのファイル名
# # -file_id   :ダウンロードしたいGoogle Drive上のコンテンツ
# $disk->downloadFile(
#     -dest_file => './branches.csv',
#     -file_id   => '1juzsinLmryTufEIY53h3nuFPaq_l4Lxn',
#     );


# # ファイルアップロード
# # -dest_file :アップロードしたいファイル(のパス)
# # -parents   :Google Drive上のフォルダの下に格納するかを指定
# # 無指定の場合はトップに保存
# # フォルダIDはフォルダURLの後半のところ
# # https://drive.google.com/drive/folders/{Google Drive上のフォルダID}

# my $res = $disk->uploadFile(
#     -source_file => './test.txt',
#     -parents   => ['hogehogefuga'], # 配列リファレンスの中に指定すること
#     );

# # アップロードしたファイルの file_id などが返ってくる
# say Dumper $res;

この記事は誰向けのものか?

もちろん、自分向けの記事です。大体、2 週間くらい前の自分向けの記事。