こんばんは、七色メガネです。今日は golang で Google Drive の中身にアクセスする方法を備忘がてらメモします。
と言ってもやり方の大部分は公式で紹介されているので、今回はボリューム少なめです。
Google Drive に golang でアクセスする手順
- Google Drive API を有効にして、発行された credentials.json を保存する。
- 必要なライブラリを go get する。
- 取得した credential.json を使用して、web から token.json を取得する。(初回のみ)
- 取得した token.json を用いて client を生成、検索を実行する
実践
では実際にアクセスしてみましょう。パートを Client 生成までと検索実行で分けています。
ボリュームとしては圧倒的に Client 生成までの方が大きいのですが、ここは公式にサンプルコードが載っていて特に説明することもないのでこの比率にしています。
じゃあ記事にするまでも無いのでは?という疑問は尤もなのですが、クライアントを生成してからの検索で少しつまづいてしまったので、その備忘の為に本記事を執筆しています。
Client 生成まで
基本的に、下記の公式に手順が載っていますのでそれに従って実行しましょう。(丸投げ)
https://developers.google.com/drive/api/v3/quickstart/go
一応手順を確認すると、
- Google Drive API を有効にして、発行された credentials.json を保存する。
- 必要なライブラリを go get する。
- 取得した credential.json を使用して、web から token.json を取得する。(初回のみ)
となっています。サンプルコードをコピペで十分動くので、説明は割愛します。
検索の実行
検索の実行には、上で生成した Client から Service を生成して、List を実行すれば良いだけです。これで Google Drive の root ディレクトリに対して検索を行うことができる。
何で詰まったかと言えば、基本の基本、検索キーワードをどうやって指定すればいいのかということ。
結論から言えば、List を投げる時に Q キーワードを指定して、そこで検索ワードを指定してやれば良いです。ネットになかなかサンプルが落ちてなくて、迷ってしまった…。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// searchFileInGoogle Drive print file name which filename matching specified keyword func searchFileInGoogleDrive(client *http.Client, mimeType string, name string) { srv, err := drive.New(client) if err != nil { log.Fatalf("Unable to retrieve Drive client: %v", err) } // specify keyword in Q. Q allows using "and". r, err := srv.Files.List().Q(fmt.Sprintf(`mimeType="%s" and name contains "%s"`, mimeType, name)).OrderBy("name").PageSize(10). Fields("nextPageToken, files(id, name)").Do() if err != nil { log.Fatalf("Unable to retrieve files: %v", err) } fmt.Println("Search File:") if len(r.Files) == 0 { fmt.Println("No files found.") } else { for _, f := range r.Files { fmt.Printf("\t%s (%s)\n", f.Name, f.Id) } } } |
1 2 3 4 5 6 7 8 |
package main func main() { gDriveClient := serveGoogleDriveClient() searchFileInGoogleDrive(gDriveClient, "image/jpeg", "1234") } |
1 2 3 4 5 |
$ go run *.go Search File: 1234_1.jpeg (147xYrXjdQeZGc1ucj3N3DUY0t59vcISK) 1234_2.jpg (1t2SZEw79McnS0T_uKE8PjMyg_Jc4GhWS) 1234_3.jpeg (1Zn6xodVlL-giow_xRiZ95AN85YWh3n11) |
・name contains %s で、前方一致の名前検索をかけることが出来ます。検索対象は root 以下全域のようです。
・他の検索条件を指定する場合 (mimeType など)は、Q キーワードの中で and を使ってやれば良いです。または Q キーワードを複数使っても良いようです。
まとめ
・Google Drive へのアクセスの為には、credential.json と token.json を用意する必要がある。
・上記の json を使用して client を生成するが、そこまでのやり方は公式にあるのでコピペで良い。また類似サンプルもネットにたくさんある。
・client を用いて service を生成したら、List で Google Drive に対する検索を実行できる。
・名前検索を行いたい時には、Q キーワードを使用する。
それだけー。今回は本当にメモレベルでしたー。
ここまでご覧いただき、ありがとうございました!
今回使用した src
https://github.com/NanairoMegane/access-to-gdrive-test
参考
https://developers.google.com/drive/api/v3/about-sdk
https://developers.google.com/drive/api/v3/quickstart/go
https://developers.google.com/drive/api/v3/search-shareddrives
おすすめ書籍
Google Cloud Platform エンタープライズ設計ガイド
Google Cloud Platform 実践Webアプリ開発 ストーリーで学ぶGoogle App Engine
プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで