App-ggdrv

 view release on metacpan or  search on metacpan

MANIFEST  view on Meta::CPAN

INSTALL
lib/App/ggdrv/crecord.pm
lib/App/ggdrv/download.pm
lib/App/ggdrv/download5.pm
lib/App/ggdrv/fsearch.pm
lib/App/ggdrv/fsearchall.pm
lib/App/ggdrv/start.pm
lib/App/ggdrv/sync5.pm
lib/App/ggdrv/tokens.pm
lib/App/ggdrv/update.pm
lib/App/ggdrv/upload.pm
lib/App/ggdrv/upload5.pm
Makefile.PL
MANIFEST			This list of files
README
META.yml                                 Module YAML meta-data (added by MakeMaker)
META.json                                Module JSON meta-data (added by MakeMaker)

ggdrv  view on Meta::CPAN

use Getopt::Long qw [ GetOptions :config bundling no_ignore_case pass_through ] ; # GetOptionsFromArray ] ;
use Time::HiRes qw[ gettimeofday tv_interval sleep ] ; # Perl 5.7.3からコアモジュール
use Term::ANSIColor qw[ color :constants ] ; $Term::ANSIColor::AUTORESET = 1 ;
use FindBin qw[ $Script $Bin ] ; 
use lib "$FindBin::Bin/lib" ; 
use App::ggdrv::start ; # GCPでAPIを設定する方法を、読む人に説明する文書を表示する。
use App::ggdrv::crecord ; # 設定ファイルの書き込み方を説明する。自動実行の機能も提供。
use App::ggdrv::tokens  ; # トークン2個を設定する。表示も可能。
use App::ggdrv::fsearch ; 
use App::ggdrv::fsearchall ; 
use App::ggdrv::upload ;
use App::ggdrv::update ;
use App::ggdrv::download ;
use App::ggdrv::upload5 ; # uploadに依存
use App::ggdrv::download5 ;
use App::ggdrv::sync5 ; # update に依存
## 計算秒数などについての処理
#my %o ; 
our $prt2 ;  # 最後に2次情報を出さないなら 0 という値が設定される。
my $time_start = [ gettimeofday ] ; 
END{ ## 終了する段階で、二次情報を表示する
  exit if 0 eq ($prt2//'') ;# 0 eq  ( $o{2} // '' ) ;
  use POSIX qw [ strftime ] ; 
  my $dt1000 = sub { my $t = [ gettimeofday ] ; strftime( "%Y-%m-%d %H:%M:%S." . sprintf("%03d", $t->[1] / 1e3 ) , localtime( $t->[0] ) ) } ;

ggdrv  view on Meta::CPAN


my $a1 = shift @ARGV or do { $prt2 = 0 ; & App::ggdrv::start::start() ; exit } ;
GetOptions ( '2=s' => \$prt2 ) ;
GetOptions ( run => \my$run ) ; 
GetOptions ( tokens => \my$tokens , get => \my$get , try => \my$try , atoken => \my$atoken ) ; 
for ( $a1 ) { 
  /^crecord$/ and & App::ggdrv::crecord::crecord( $run ) and $prt2 = 0 ; 
  /^(tokens|token)$/ and & App::ggdrv::tokens::tokens( $get , $try , $atoken ) ;
  /^fsearch$/ and & App::ggdrv::fsearch::fsearch () ; 
  /^fsearchall$/ and & App::ggdrv::fsearchall::fsearchall () ;
  /^upload$/ and & App::ggdrv::upload::upload () ; 
  /^update$/ and & App::ggdrv::update::update () ;
  /^download$/ and & App::ggdrv::download::download ()  ;
  /^upload5$/ and & App::ggdrv::upload5::upload5 () ;  ## ここから5列TSVファイルを使った操作3種類
  /^download5$/ and & App::ggdrv::download5::download5 () ;
  /^sync5$/ and & App::ggdrv::sync5::sync5 () ;
  /^--help$/ and do { $prt2=0 ; & HELP_MESSAGE } ;
}
exit ;

## ヘルプの扱い
sub VERSION_MESSAGE {}
sub HELP_MESSAGE{
    use FindBin qw[ $Script ] ; 

ggdrv  view on Meta::CPAN

   ggdrv tokens  #  トークンの情報2個を単に表示する。(リフレッシュトークン(使わないと半年で無効化)とアクセストークンがある。)
   ggdrv tokens --get   # トークンを取得する(設定ファイルに書き込む)。書き込む前のファイルはバックアップは1回のみ保管。
   ggdrv tokens --get --try   # トークンを取得するが、設定ファイルには書き込まない。
   ggdrv tokens --atoken  # アクセストークンのみ更新する。60分未使用であれば、更新は必要。-try を指定すると設定ファイルに書き込まない。

  [ファイル検索]
   ggdrv fsearch FILENAME # ファイルを最大100個まで探す(フォルダは指定不能)。ワイルドカードを指定可能。タブ区切り5列で出力。
   ggdrv fsearchall -g10  # ファイルを100個ずつ -g で指定した回数出力(フォルダは指定不能)。1個のファイルにつき、縦に4行を出力。## <-- 時々リフレッシュトークンを更新する必要あり。

  [(単純な)アップロード/更新/ダウンロード]
   ggdrv upload -f フォルダID(28文字) FILE [FILE] .. # アップロードする。 同名ファイルに対し複数回実行したら、その分グーグルドライブ上に現れるので注意。
   ggdrv update ID1 FILE1 [ID2 FILE2] [ID3 FILE3] .. # 更新する。33文字のIDに対して、ローカルのファイルの名前をペアにして指定。
   ggdrv download ファイルID(33文字) ローカルで予定するファイル名 # ダウンロードする。

  [作業対象のファイルを管理しつつアップロード/更新/ダウンロード] ※ サブコマンドに「5」が後置するのが特徴。
   ggdrv upload5 FOLDER_ID LOCAL_DIR > VAR_FILE # アップロードする。標準出力をファイルに保管して、続くサブコマンドでも使う。
   ggdrv download5 LOCAL_DIR < VAR_FILE        # ダウンロードする。
   ggdrv sync5 OLD_DIR NEW_DIR < VAR_FILE   # 同期に使う。OLD_DIRはGoogleドライブと予め同期させ、NEW_DIRと違えば、それをアップデート。

 オプション: 
   -2 0 : 最後に2次情報を標準エラー出力に出さない。サブコマンドの後ろに置くこと。

 環境変数 : export VAR=VALUE で指定。unset VAR で解除が可能。

   GGDRV_API    :  クライアントIDやクライアントシークレットを保管するファイルの名前。未指定なら ~/ggdrv2303v1 である。

ggdrv.pm  view on Meta::CPAN

   ggdrv tokens  #  トークンの情報2個を単に表示する。(リフレッシュトークン(使わないと半年で無効化)とアクセストークンがある。)
   ggdrv tokens --get   # トークンを取得する(設定ファイルに書き込む)。書き込む前のファイルはバックアップは1回のみ保管。
   ggdrv tokens --get --try   # トークンを取得するが、設定ファイルには書き込まない。
   ggdrv tokens --atoken  # アクセストークンのみ更新する。60分未使用であれば、更新は必要。-try を指定すると設定ファイルに書き込まない。

  [ファイル検索]
   ggdrv fsearch FILENAME # ファイルを最大100個まで探す(フォルダは指定不能)。ワイルドカードを指定可能。タブ区切り5列で出力。
   ggdrv fsearchall -g10  # ファイルを100個ずつ -g で指定した回数出力(フォルダは指定不能)。1個のファイルにつき、縦に4行を出力。## <-- 時々リフレッシュトークンを更新する必要あり。

  [(単純な)アップロード/更新/ダウンロード]
   ggdrv upload -f フォルダID(28文字) FILE [FILE] .. # アップロードする。 同名ファイルに対し複数回実行したら、その分グーグルドライブ上に現れるので注意。
   ggdrv update ID1 FILE1 [ID2 FILE2] [ID3 FILE3] .. # 更新する。33文字のIDに対して、ローカルのファイルの名前をペアにして指定。
   ggdrv download ファイルID(33文字) ローカルで予定するファイル名 # ダウンロードする。

  [作業対象のファイルを管理しつつアップロード/更新/ダウンロード] ※ サブコマンドに「5」が後置するのが特徴。
   ggdrv upload5 FOLDER_ID LOCAL_DIR > VAR_FILE # アップロードする。標準出力をファイルに保管して、続くサブコマンドでも使う。
   ggdrv download5 LOCAL_DIR < VAR_FILE        # ダウンロードする。
   ggdrv sync5 OLD_DIR NEW_DIR < VAR_FILE   # 同期に使う。OLD_DIRはGoogleドライブと予め同期させ、NEW_DIRと違えば、それをアップデート。

 オプション: 
   -2 0 : 最後に2次情報を標準エラー出力に出さない。サブコマンドの後ろに置くこと。

 環境変数 : export VAR=VALUE で指定。unset VAR で解除が可能。

   GGDRV_API    :  クライアントIDやクライアントシークレットを保管するファイルの名前。未指定なら ~/ggdrv2303v1 である。
 

lib/App/ggdrv/download.pm  view on Meta::CPAN


sub download {
  getopts '~',\my%o ;
  my $gfile = $ENV{ GGDRV_API } // "~/.ggdrv2303v1" ;
  my $cid  = qx [ sed -ne's/^CLIENT_ID[ =:\t]*//p' $gfile ] =~ s/\n$//r ; #"54525797.....34dseo.apps.googleusercontent.com" ;
  my $csec = qx [ sed -ne's/^CLIENT_SECRET[ =:\t]*//p' $gfile ] =~ s/\n$//r ; # "GOCSP...YUbpe1" ; 
  my $rtoken = qx [ sed -ne's/^REFRESH_TOKEN[ =:\t]*//p' $gfile ] =~ s/\n$//r ; 
  my $atoken  = qx [ sed -ne's/^ACCESS_TOKEN[ =:\t]*//p' $gfile ] =~ s/\n$//r ; 
  my $disk = Net::Google::Drive->new( -client_id => $cid, -client_secret => $csec, -access_token => $atoken, -refresh_token => $rtoken );

  do { my @f = $ARGV[0] ? ($ARGV[0] ) : () ; my $r = $disk->uploadFile( -source_file => $ARGV[1], -parents => [ @f ] ) ; exit } if $o{'~'} ; 
  $disk->downloadFile( -file_id => $ARGV[0], -dest_file => $ARGV[1] ) or do { use Carp ; croak "Failure to download." } ;
}

=encoding utf8

=head1

 ggdrv --download file_id local_file_name  # ダウンロード
 ggdrv --download -~ folder_id local_file_name  # アップロード

lib/App/ggdrv/update.pm  view on Meta::CPAN

use HTTP::Request::Common ;
use JSON qw[ encode_json ] ;
use LWP::UserAgent ;
use URI::QueryParam ;
use URI ;

my ($GOOGLE_DRIVE_UPLOAD_API , $gfile , $atoken ) ; 
return 1 ; 

sub update {
  $GOOGLE_DRIVE_UPLOAD_API = "https://www.googleapis.com/upload/drive/v3/files/";
  $gfile = $ENV{ GGDRV_API } // "~/.ggdrv2303v1" ;
  $atoken = qx [ sed -ne's/^ACCESS_TOKEN[ =:\t]*//p' $gfile ] =~ s/\n$//r ;
  while ( my ($file,$id) = splice @ARGV , 0 , 2 ) { f_each ($file,$id) }
  # & f_each ( split /:/, $_ , 2 ) for @ARGV ; 
}

sub f_each ( $$ ) { 
  my $URI = URI->new( $GOOGLE_DRIVE_UPLOAD_API . $_[1] );
  $URI->query_param( uploadType => 'multipart' );
  my $ua  = LWP::UserAgent->new;
  my $res = $ua->request(
    PATCH $URI,
    'Content-Type' => 'multipart/form-data',
    Authorization  => "Bearer $atoken" ,
    Content    => [
      metadata => [
        undef, undef, # undef => undef と書くことは出来るだろうか?
        'Content-Type' => 'application/json;charset=UTF-8',
        'Content' => encode_json( {} ) #name=>'temp.txt', mimeType=>'text/plain', parents  => ['10_33chars_in_total'], id => $target_fileid},

lib/App/ggdrv/upload.pm  view on Meta::CPAN

package App::ggdrv::upload ;
use strict;
use warnings;
use feature 'say' ; 
use HTTP::Request::Common;
use JSON qw/encode_json decode_json/;
use LWP::UserAgent;
use Getopt::Std ; 
use Carp; 

my ($gfile , $atoken, $GOOGLE_DRIVE_UPLOAD_API , %o);
return 1 ;

sub upload { 
  getopts 'f:m:' , \%o ;
  $o{f} //= '' ; # フォルダ名
  $o{m} //= 'text/plain' ; # MIMEタイプ
  $gfile = $ENV{ GGDRV_API } // "~/.ggdrv2303v1" ;
  $atoken = qx [ sed -ne's/^ACCESS_TOKEN[ =:\t]*//p' $gfile ] =~ s/\n$//r ;
  $GOOGLE_DRIVE_UPLOAD_API = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart" ;
  & f_each ( $_ ) for @ARGV ; 
}

sub f_each ( $ ) { 
  binmode STDOUT, ":utf8";
  my $mimeType = $o{m} ; 
  my $ej1 = encode_json { name => $_[0] , mimeType => $mimeType , $o{f} ne q[] ? ( parents  => [ $o{f} ] ): () } ;
  my $res = LWP::UserAgent -> new -> request (
    POST $GOOGLE_DRIVE_UPLOAD_API ,
    'Content-Type' => 'multipart/form-data' ,

lib/App/ggdrv/upload5.pm  view on Meta::CPAN

package App::ggdrv::upload5 ; 
use strict ; 
use warnings ; 
use feature qw [ say ] ; 
use FindBin qw [ $Bin ] ;
use Getopt::Std ; 
use Cwd ; 
use Carp ;
return 1 ;

sub upload5 { 
  getopts 'm:n', \my %o ;
  $o{m} //= 'text/plain' ;
  $ARGV[1] //= '.' ; # ローカルのディレクトリ名。
  my $cwd = getcwd ;
  chdir $ARGV[1] or die ; 
  my @files = grep { -f } <*>  ; # ディレクトリは対象外となる。
  my $out = '' ; # 
  #print qx[ $FindBin::Bin/upload11.pl -m $o{m} -f $ARGV[0] $_ ] for @files ; 
  do { print qx [ $0 upload -20 -m $o{m} -f $ARGV[0] $_ ] for @files } if ! $o{n} ; 
  do { say qq [ $0 upload -20 -m $o{m} -f $ARGV[0] $_ ] for @files } if $o{n} ; 
  chdir $cwd ;
}


=encoding utf8

=head1

 ggdrive updoad5 FOLDER_ID LOCAL_DIR > VAR_FILE



( run in 4.159 seconds using v1.01-cache-2.11-cpan-b16cb0d3907 )