Perl から Google Drive にファイルをあげたりダウンロードしたり一覧を取ったり
Google OAuth のクライアントIDとクライアントシークレットを入手する
まずは Google Cloud Platform でプロジェクト作成から。
もちろん、既存のプロジェクトに Google Drive API の利用権限を与えてもokです。
プロジェクトの作成が終わったら、左上のナビゲーションメニューから 「APIとサービス」-> 「ライブラリ」と進みます。
検索スペースに Google Drive と入力して Google Drive API を選択し、Google Drive API を有効化します。
概要のページに戻りましたが、「有効化のステータス」が「有効」になっていますでしょうか?なっていればokです。
左側のメニュー(左上には「APIとサービス Google Drive API」とある)から、認証情報を選択します。
上にある「認証情報を作成」をクリックし、「OAuth クライアントID」を選択します。
クライアントIDを作成するためには同意画面の作成が必要、という事で右側(または下側)にある「同意画面を設定」ボタンをクリックします
OAuth同意画面は前回と同様に「内部」を選択して「作成」ボタンをクリックします。
サービス名を入力します。わかりやすい名前にしておきましょう。
同じ画面の「Google API のスコープ にある「スコープの追加」ボタンをクリックします。
スコープでは
/auth/drive
を選択し、右下の「追加」ボタンをクリックします同意画面に戻りますが、Google API のスコープに Google Drive が追加されていればokです。
画面を下にスクロールして、「保存」ボタンをクリックします。
同意画面に戻るので、左側メニューから「認証情報」をクリックし、上にある「認証情報を追加」をクリックし、「OAuth クライアントID」をクリックます。
アプリケーションの種類は「デスクトップアプリ」を選択し、下にある「作成」ボタンをクリックします。
OAuthクライアントが作成されました!毎度ながら長い道のりですね・・・
ACCESS TOKEN と REFRESH TOKEN を手に入れる
前回利用した 3 つのキーを取得するスクリプトを使おうと思ったのですが・・・Google Sheet の時には利用しなかった ACCESS TOKEN が必要になることが判明しました。
ってことで、先のスクリプトを改修しました。
使い方も前回を参考にしてください。
#!/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 つの キーが手に入りました。
Google Drive API を使う!
やっとこさです。
今回も色々と大変だろうなー、と思っていたんですが、モジュールがとても使いやすく、ほとんど詰まる事なく Google Drive にファイル上げたり下げたりすることができました。
めちゃくちゃ助かりました。すごい!
ほとんど 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 週間くらい前の自分向けの記事。