2026年3月27日金曜日

グーグルドライブの操作をコマンドで行う方法について

あまプロではGoogleDriveを扱う事が有ります。
先日、日次処理や週次処理などで毎回グーグルドライブにファイルをアップロードするのが面倒やったので、バッチ(スクリプト)で自動化しました。
その手順をあメログ。


グーグルドライブの操作を自動化するには、ブラウザからのGUIの操作をCLI( CUI?)で行う必要があります。
マウスでぽちほち遣るのをコマンドでぽちぽちに変えるだけです。
グーグルドライブには既にプログラムなどからグーグルドライブを操作するAPIが用意されてまして、プログラムに詳しい人はAPIを操作できるんですが、詳しくない方はAPIとプログラムを両方学ぶ必要が有り…だいぶ敷居が高いです。
なので今回はAPIを後ろで実行してくれるコマンドを利用します。
ほなどのコマンドを使うねんって話なんですが、有名なのはrclonegdriveなどがあります。
今回は今月リリースされたgws( GoogleWorkSpace)を使ってみます。Google謹製の非公式ツールだそうです。
グーグルアカウントは事前に作成して、ホストのブラウザでログインしておいて下さい。

先ず、Dockerでコンテナを作成します。LXDとかでもいけますので、お好みで。

docker run -it --name googledrive_ctn alpine:latest

今回はイメージにアルパインを用いました。イメージも何でも良ぇので、お好みで。 
コンテナに入って、パッケージを最新化します。
他のディストリビューションの場合は適宜読み替えて下さい。

 apk update && apk upgrade

次に必要なパッケージをインストールします。
gwsはnodeで動作しますので関連パッケージを一式インストールします。 

 apk add nodejs npm vim bash curl tar python3

不要なパッケージも有りますが、お好みで。特にvimは好みが分かれるけど、お好みで。
alpineのデフォルトシェルはashですが、各インストーラのシェルはbash用なのでご注意を。
インストール後にコンテナにbashで再ログインして下さい。

docker exec -it googledrive_ctn bash 

次にgcloudCLIをインストールします。
gwsはgcloudに依存しているので、先にこっちからインストールします。
パッケージでインストールできれば楽なんですが、今の所は個別にインストールせなあきません。
インストール方法は公式に掲載の手順通りに行います。

パッケージをダウンロードして 

curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-linux-x86_64.tar.gz

それを解凍して

tar -xf google-cloud-cli-linux-x86_64.tar.gz

インストーラを起動するだけ

 ./google-cloud-sdk/install.sh

インストール完了後、source ~/.bashrcで設定を反映するか、コンテナに再ログインして下さい。
次にgcloudの初期設定を行います。

gcloud init 

ここからが少しややこしくて、コンテナのターミナルとホストのブラウザを行ったり来たりします。
まず、複数行に渡る長いURLが生成されますので、それをコピーしてホストのブラウザでアクセスします。

グーグルアカウントを選択して 

Google Cloud SDKへログインして

 許可して

 認証パスワードをコピーします 

 コピーした認証パスワードをコンテナのターミナルへ貼り付けます

 これでgcloudコマンドがグーグルアカウントのGoogleCloudへ紐付きます。
次にプロジェクトを選択します。
既存のプロジェクトを選択するか、無ければプロジェクトを作成します。
今回はお試しでCreate a new projectを選択します。 
適当なProjectIDを設定して、問題なければこれでgcloudの初期設定は完了です。

ではいよいよgwsのインストールです。 
こちらも公式に載っている手順通りに行います。

npm install -g @googleworkspace/cli

次にgwsの初期化を行います。

 gws auth setup

グーグルアカウントを選択して 

GoogleCloudのプロジェクトを選択して 

APIを選択して
今回はGoogleDriveのみにします。色々操作できますので、興味のある方は試してみて下さい。

またまたややこしくて、コンテナのターミナルとホストのブラウザを行ったり来たりします。
OAuth認証します。
Step AでURLが生成されますので、コピーしてホストのブラウザでアクセスします。

 GoogleAuthPlatformが表示されるので、下の開始ボタンを押下してプロジェクトの構成を行います。 

 ターミナルに出てた通りExternal(外部)を設定します

 
 

次にOAuthクライアントを作成します。 

ターミナルに出ていた通りDesktop app(デスクトップアプリ)にします。 

表示の通り、アクセスできるのはテストユーザーのみになります。
なので、テストユーザーを作成します。


 

作成したOAuthクライアントのクライアントIDをコピーして、コンテナのターミナルへ貼り付けます。 

 

次にOAuthクライアントのシークレットもコピーして、コンテナのターミナルへ貼り付けます。 

ここまででgwsの初期設定は完了です。
続いてgwsのログインが実行されます。
実行されない場合は下記を実行します。

gws auth login

次にOAuthの範囲を指定します。
今回はグーグルドライブの操作が目的なのでdrive.fileを選択しておきます。
適宜必要な機能を選択して下さい。

 またまたURLが生成されますので、コンテナのターミナルからコピーしてホストのブラウザでアクセスします。 

認証します。

ホスト上のgwsだとこのままgwsへリダイレクトされてログイン完了するんですが、コンテナ内のgwsの為に接続できません。

面倒ですが、ブラウザのURL<http://localhost:38555/?.....>をコピーして、もう一つ別のターミナルを起動してコンテナにログインします。 
別ターミナルのコンテナ内でコピーしたURLへアクセスします。 

curl 'http://localhost:38555/?iss=https://accounts.google.com&code=*******'

 URLをシングルクォートで括るのをお忘れなく。

<html><head><title>Success</title></head><body>You may now close this window.</body></html>
が表示されればログイン成功です。このターミナルは閉じても大丈夫です。
元のターミナル(gws auth setupしてたの)がログインしています。
お疲れ様でした。これでgwsの設定完了です。 

試しにファイルの一覧を取得してみましょう。

gws drive files list

ファイルをダウンロードしてみましょう。

gws drive files get --params '{"fileId": "*****", "alt": "media"}' -o ファイル名
ファイルをアップロードしてみましょう。
gws drive files update --params '{"fileId": "*****", "supportsAllDrives": true, "uploadType": "multipart"}' --upload ファイルパス

この様にgws drive*コマンドで、グーグルドライブへの色々な操作が行えます。
これらをスクリプト(バッチ)ファイルに記述すると、 その操作を自動的に行ってくれます。
認証が少し複雑なんですが、認証さえできてしまえば便利なので是非ご活用下さい。

2026年3月20日金曜日

Dockerのコンテナで起動したFlutter( Web)をDevtoolsで表示

あまプロではFlutterで開発する事があります。
Flutterのデバッグではまったのであメログ。

Flutterは"Everything is a widgets" の思想の通り、全てがウィジェットで構成されています。
何か画面を作る際はそのウィジェットを組み合わせて作るのですが、画面を作り込んで行くとどうしてもウィジェットの中にウィジェットの中にウィジェット…の様に階層が深くなってしまいます。
ブラウザのデベロッパーツールで階層を確認しようとしても、Flutterの出力するHTMLはcanvas要素なので階層が解りません。
そうすると、AIには簡単に理解できても人間にはなかなか理解把握ができません。
常にAIを当てにして教えてもらっても良いのですが、Flutterには階層を表示する用のツールDevtoolsが予め備わってますので、それを利用して把握します。

開発機(ホスト)直下に開発環境を構築する場合は良いのですが、一般的にはDockerLXDなどのコンテナを使ってコンテナ内に開発環境を構築します。
こうすると、コンテナを切り替えるだけで開発環境を切り替える事ができるので便利です。
しかし、コンテナを経由するとホスト直下でできてた事ができなかったり、設定を工夫する必要が有ります。
今回は下記の様に、ホストのブラウザからコンテナ上のFlutter(のウェブページ)へ接続して、更にDevtoolsで階層を確認してみます。

ざっくり概念図

先ずコンテナの作成ですが今回はDockerを使ってUbuntuのコンテナを作ってみます。
Dockerのインストールや基本操作は各種サイトやAIなどをご確認下さい。
既にFlutterを構築しているコンテナをお持ちの場合は そちらを使っても問題ありません。

docker run -p 35059:35059 -p 80:80 -d --name con-name ubuntu:latest

 こちらはcon-nameという名前のコンテナを作成するコマンドです。
イメージはUbuntuの最新版を使って、コンテナの35059ポートをホストの35059ポートへ割り当て、コンテナの80ポートをホストの80ポートへ割り当てています。
35059ポートはDevtools用になります。80ポートはウェブページ用のポートです。
ポートは変更しても構いません。

次にコンテナ内に入って、Flutterをインスールして、Flutterプロジェクトを作成します。
インストール方法は公式サイトドキュメントをご覧下さい。

次にsocatパッケージをインストールします。

apt install socat

socatはポートフォワード(データ転送)ツールです。 

socatをインストールしたら、 バックグラウンドで実行しておきます。

socat TCP-LISTEN:35059,fork,reuseaddr TCP:127.0.0.1:36000 &
こちらは35059ポートへのアクセスを36000ポートへ転送しています。
何故転送が要るのかは後程。
バックグラウンドでなくても、別のターミナルからコンテナに入って
socat TCP-LISTEN:35059,fork,reuseaddr TCP:127.0.0.1:36000
しても良いです。お好みで。

では次にFlutterをWeb実行します。

flutter run -d web-server --web-hostname=0.0.0.0 --web-port=80 --dds-port=36000
こちらはFlutterをウェブサーバで実行して、0.0.0.0で総てのIPからアクセス可能にして、80ポートでアクセス可能にして、DertDevelopmentServiceを36000ポートに指定しています。
このdds-portを指定しないと、毎回ランダムなポートが割り当てられますので必ず指定します。
ここがややこしい所で、web-serverはweb-hostname=0.0.0.0を指定すると総てのIPからアクセス可能つまりコンテナ外のホストからアクセス可能になるのですが、ddsにはdds-hostname=0.0.0.0に相当するオプションがなく、ホストからアクセスできません。
ddsにアクセスできるのはコンテナ内の127.0.0.1のみになります。

そこで先程のsocatでホストからのアクセスを35059ポートで受けて、ddsの36000ポートへ転送するという手間が要ります。これでコンテナ内の127.0.0.1からddsへアクセスした事になります…面倒臭い。

以上で準備ができました。ホストのブラウザでhttp://127.0.0.1/へアクセスします。 

flutter createしただけのウェブページ
作成したプロジェクトのウェブページが表示されます。
ウェブページにアクセスがあると、コンテナのターミナルにDevtools用のURLが表示されます。
文字化けしてるのは御愛嬌
そのURLへホストのブラウザでアクセスするんですが、ポートを36000から35059へ置換してからアクセスします。
http://127.0.0.1:36000/Yk9MV84zNz0=/devtools/inspector?uri=ws://127.0.0.1:36000/Yk9MV84zNz0=/ws
なら
http://127.0.0.1:35059/Yk9MV84zNz0=/devtools/inspector?uri=ws://127.0.0.1:35059/Yk9MV84zNz0=/ws
にします。
Failed to connect the Dart tooling Deamonのエラーが出てますけど、表示されます
するとDevtoolsが表示されます。
Flutter Inspectorで階層構造が表示されます。
並べてみました
めちゃ解り易い。

今回の環境は 

Windows11 25H2
firefox --version
Mozilla Firefox 148.0
docker --version
Docker version 29.2., build a5c7197
lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 24.04.4 LTS
Release:    24.04
Codename:    noble
flutter --version
Flutter 3.41.5・channel stable・https://github.com/flutter/flutter.git
Framework・revision 2c9eb20739 (31 bours ago)・2026-03-17 6:14:01 -0700
Engine・hash c1db59d880ca73dd86cec08a6663f287522d9f39 (revision 052f31d115) (2 days ago)・2026-03-17 20:29:11
Tools・Dart 3.11.3・Devtools 2.54.2
dart --version
Dart SDK version: 3.11.3 (stable) (Tue Mar 17 01:06:16 2026 -0700 on "linux_x64"
でした。