[Google Drive API v3] JavaでDrive APIを使う

Googleが提供しているDrive API v3をJavaで使ってみました。

***Drive APIとは***
Googleが提供しているAPIで、
GoogleDrive上のファイルやフォルダ、ユーザーの管理、作成、編集できます。

Drive APIの利用料金は無料です。
ただし、100秒あたりの使用制限があります。
ユーザーごとおよびプロジェクトごとに20,000回/100秒です。

|No|||目次|
|---|---|---|---|
|1|||[Drive APIを使用するための準備](#1-drive-apiを使用するための準備)|
||1||[プロジェクトの作成](#11-プロジェクトの作成)|
||2||[Drive APIの設定](#12-drive-apiの設定)|
||3||[APIを使用するためのキー取得](#13-apiを使用するためのキー取得)|
|||1|[サービス アカウント](#131-サービス-アカウント)|
|||2|[OAuth2.0 クライアントID](#132-oauth20-クライアントid)|
|2|||[Drive APIを使ってみる](#2-drive-apiを使ってみる)|
||1||[googleライブラリの読み込み](#21-googleライブラリの読み込み)|
||2||[Driveインスタンスを取得](#22-driveインスタンスを取得)|
|||1|[サービスアカウントを利用する場合](#221-サービスアカウントを利用する場合)|
|||2|[OAuth 2.0 クライアントIDを利用する場合](#222-oauth-20-クライアントidを利用する場合)|
||3||[プログラムの実行](#23-プログラムの実行)|
|3|||[いろいろとAPIを叩いてみる](#3-いろいろとapiを叩いてみる)|
||1||[about](#31-about)|
||2||[apps](#32-apps)|
||3||[changes](#33-changes)|
||4||[channels](#34-channels)|
||5||[comments](#35-comments)|
||6||[drives](#36-drives)|
||7||[files](#37-files)|
||8||[permissions](#38-permissions)|
||9||[replies](#39-replies)|
||10||[revisions](#310-revisions)|

# 1. Drive APIを使用するための準備
設定は下記から行います。
[⧉Google クラウド プラットフォーム](https://console.cloud.google.com/)

やることは大きく分けて下記の3つです。
[１.GCPプロジェクトの作成](#11-プロジェクトの作成)
[２.Drive APIの有効化](#12-drive-apiの設定)
[３.プログラムで使用するJSONファイルのダウンロード](#13-apiを使用するためのキー取得)

最後の3.は、[サービスアカウント](#131-サービス-アカウント)か[OAuth2.0](#132-oauth20-クライアントid)を利用する2つの方法があります。
利用する方法によりアクセスできるDriveが異なります。
・サービスアカウント
　サービスアカウントのDrive と、 そのサービスアカウントに共有されたファイル
・OAuth2.0
　同意したユーザーのDrive　と、 そのユーザーに共有されたファイル
用途に応じてどちらかを選択してください。

### 1.1. プロジェクトの作成
まずはGCPでプロジェクトを作成します。
詳細はこちらの記事を参照ください
[⧉[Google Sheets API] Google Sheets API v4をJavaで操作する(1.1. プロジェクトの作成)](https://qiita.com/doran/items/3d43f776188b2281044c/#11-プロジェクトの作成)

### 1.2. Drive APIの設定
Drive APIを使えるようにします。

|No|手順||
|---|---|:-:|
|1|メニューの 「APIとサービス」 -> 「ライブラリ」 を選択します。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/2fda7515-ffdf-11d7-4142-fed896cc8413.png">|
|2|Drive APIと入力して「Google Drive API」を検索します。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/893135ae-61f2-567b-c27d-33fd10634323.png">|
|3|「有効にする」ボタンを押して「Google Drive API」を使用可能にします。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/878a6304-6af4-6258-22ba-d7070e74c622.png">|

### 1.3. APIを使用するためのキー取得
プログラムからAPIを実行するための準備を行います。
サービスアカウントを利用する方法と、OAuth2.0を利用する方法があります。

### 1.3.1. サービス アカウント
APIを操作するためにサービスアカウントを作成します。

詳細はこちらの記事を参照ください
[⧉[Google Sheets API] Google Sheets API v4をJavaで操作する(1.3. Googleサービスアカウントの作成)](https://qiita.com/doran/items/3d43f776188b2281044c/#13-googleサービスアカウントの作成)

Google Drive APIを使用するにあたって、権限は必要ありません。

### 1.3.2. OAuth2.0 クライアントID
APIを操作するためにOAuth2.0の設定を行います。
#### 1.3.2.1. 認証情報の作成
まずは認証情報を作成し、JSONファイルをダウンロードします。

|No|手順||
|---|---|:-:|
|1|「APIとサービス」 -> 「認証情報」　を選択すると以下の画面が表示されます。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/d7801ca1-1ac3-21c2-4dc6-22af9a031367.png">|
|2|「認証情報を作成」 -> 「OAuth クライアントID」 を選択します。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/a8ab59dd-9a36-4115-f85e-096ebd87cdf5.png">|
|3|アプリケーションの種類に「デスクトップアプリ」、名前を入力し、「作成」 ボタンを押します。<br><br>アプリケーションの種類は用途に応じて選択してください。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/024a5e32-e842-d651-1276-c71b346a8421.png">|
|4|OAuthクライアントが作成されます。<br>「JSONをダウンロード」 を押してJSONファイルを取得してください。<br><br>このJSONファイルはプログラムで指定します。|<img width=200 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/28670328-79bb-9098-18d5-2cc75afbf5fa.png">|

#### 1.3.2.2. OAuth 同意画面の設定
次に、OAuth同意画面の設定を行います。

プログラムから[1.3.2.1. 認証情報の作成](#1321-認証情報の作成)を使用してAPIを利用しようとすると、
Webブラウザが開かれ、OAuth同意画面が表示されます。
Google関連のサービスを利用しようとすると、この同意画面が開かれるので、
一度は見たことがあると思います。その画面の設定をここで行います。

|No|手順||
|---|---|:-:|
|1|「APIとサービス」 -> 「OAuth 同意画面」　 を選択すると以下の画面が表示されますので、Use Typeに「外部」 を選択し、「作成」 ボタンを押してください。<br><br>Use Typeは用途に応じて選択してください。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/c9967ae4-f94f-e49a-cb43-b34172a30bac.png">|
|2|アプリ登録の編集画面になりますので、アプリ名、ユーザーサポートメールを入力します。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/ce467da1-a36d-1a6c-2fd1-1582094aeb2e.png">|
|3|下の方の出ペロッパーの連絡先情報を入力し、「保存して次へ」 ボタンを押します。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/382bcddf-814e-f8ee-2b6c-1e97ca94d2a4.png">|
|4|アプリ登録の編集 ②スコープ の画面になりますが、ここでは何も設定せずに「保存して次へ」 ボタンを押します。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/492d53fe-2b2e-263f-3aa6-70512d235be5.png">|
|5|アプリ登録の編集 ③テストユーザー の画面になりますので、テストユーザーの「+ ADD USER」 ボタンでユーザーを追加し、「保存して次へ」 ボタンを押します。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/dd2ae4ce-489e-8fdd-d4d4-7b8b5709a8b3.png">|

# 2. Drive APIを使ってみる
### 2.1. googleライブラリの読み込み
Google Drive APIを使用するためにライブラリのパスを設定します。
私の環境はpom.xmlで下記を指定しています。
Javaのバージョンは21を使用しています。

```xml
<dependencies>
....
    <dependency>
        <groupId>com.google.auth</groupId>
        <artifactId>google-auth-library-oauth2-http</artifactId>
	</dependency>
    <dependency>
        <groupId>com.google.apis</groupId>
        <artifactId>google-api-services-drive</artifactId>
        <version>v3-rev20240123-2.0.0</version>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>libraries-bom</artifactId>
            <version>26.31.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
```

### 2.2. Driveインスタンスを取得

#### 2.2.1. サービスアカウントを利用する場合
コード中の「JSONファイルのパス」は、
[⧉[Google Sheets API] Google Sheets API v4をJavaで操作する(1.3. Googleサービスアカウントの作成)](https://qiita.com/doran/items/3d43f776188b2281044c#13-googleサービスアカウントの作成)
で取得したJSONファイルのパスを指定してください。

コード中の「スコープ」は、
実行するAPIによって異なるので適時に変更してください。
```java
private static Drive getDrive() throws Exception {
    HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = GsonFactory.getDefaultInstance();
    
    try(InputStream input = new FileInputStream("JSONファイルのパス")){
        GoogleCredentials credentials = GoogleCredentials
                .fromStream(input)
                .createScoped(Arrays.asList("スコープ"));
        
        return new Drive.Builder(transport, jsonFactory, new HttpCredentialsAdapter(credentials)).build();
    }
}
```
#### 2.2.2. OAuth 2.0 クライアントIDを利用する場合
コード中の「JSONファイルのパス」は、
[1.3.2. OAuth2.0 クライアントID](#1321-認証情報の作成)で取得したJSONファイルのパスを指定してください。

コード中の「認証情報を保存するフォルダパス」は、
認証情報が保存されるフォルダのパスを指定してください。
このコードを実行するとOAuth同意画面が表示されます。
ユーザーが同意をすると認証情報を保存するフォルダにファイルが生成されます。
このファイルが存在した場合は、再度実行してもOAuth同意画面は表示されません。

コード中の「スコープ」は、
実行するAPIによって異なるので適時に変更してください。
途中でスコープを変更した場合は再度のOAuth同意が必要になるので
「認証情報を保存するフォルダパス」にあるファイルを削除するか、パスを変えてください。
```java
private static Drive getDrive() throws Exception {
    HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = GsonFactory.getDefaultInstance();
    
    try(Reader reader = new InputStreamReader(new FileInputStream("JSONファイルのパス"))){
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory,reader);

        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                transport, jsonFactory, clientSecrets, 
                Arrays.asList("スコープ"))
            .setDataStoreFactory(new FileDataStoreFactory(new java.io.File("認証情報を保存するフォルダパス")))
            .build();
        
        LocalServerReceiver receiver = new LocalServerReceiver.Builder().build();
        Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
        
        return new Drive.Builder(transport, jsonFactory, credential).build();
    }
}
```

### 2.3. プログラムの実行
プログラムを動かします。
サンプルではDriveのファイル一覧を取得しています。
```java
public static void main(String[] args) throws Exception{
    Drive drive = getDrive();
    Drive.Files files = drive.files();
    
    Drive.Files.List list = files.list();
    System.out.println(list.execute());
}
```
# 3. いろいろとAPIを叩いてみる
いろいろなAPIを叩いてみます。

### 3.1. about
**Driveに関する情報**を操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|get|ユーザーとドライブ、システムに関する情報を取得|[⧉[Google Drive API v3] Javaでユーザーとドライブ、システムに関する情報を取得する](https://qiita.com/doran/items/85ae9f0d5fdc5ae5d5a1)|

### 3.2. apps
**イントールされているアプリの情報**を操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|get|指定したDriveにインストールされているアプリの情報を取得|[⧉[Google Drive API v3] JavaでDriveにインストールされているアプリの情報を取得する](https://qiita.com/doran/items/8382ce4b572b2e72d19c)|
|list|Driveにインストールされているアプリの情報リストを取得|[⧉[Google Drive API v3] JavaでDriveにインストールされているアプリの情報を取得する](https://qiita.com/doran/items/8382ce4b572b2e72d19c)|

### 3.3. changes
**変更の履歴情報**を操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|getStartPageToken|Driveに格納されているファイルの変更履歴を取得するための開始のトークンを取得|[⧉[Google Drive API v3] Javaでユーザーや共有ドライブ、ファイルの変更履歴を取得する](https://qiita.com/doran/items/aca4993ba3cebff2c3af)|
|list|Driveに格納されているファイルの変更履歴リストを取得|[⧉[Google Drive API v3] Javaでユーザーや共有ドライブ、ファイルの変更履歴を取得する](https://qiita.com/doran/items/aca4993ba3cebff2c3af)|
|watch|ユーザー情報の変更通知(サブスクライブ)を登録|[⧉[Google Drive API v3] Javaでファイル、ユーザー情報の変更通知(サブスクライブ)を受信・停止する](https://qiita.com/doran/items/1cef2154bb1554f82eea)|

### 3.4. channels
**変更通知**を操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|stop|変更通知(サブスクライブ)の登録解除|[⧉[Google Drive API v3] Javaでファイル、ユーザー情報の変更通知(サブスクライブ)を受信・停止する](https://qiita.com/doran/items/1cef2154bb1554f82eea)|

### 3.5. comments
**ファイルのコメント**を操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|create|指定したDriveに置かれているファイルのコメントを追加|[⧉[Google Drive API v3] Javaでファイルのコメントを追加・変更・削除する](https://qiita.com/doran/items/aca99b0fc94cb6ecd4d9)|
|delete|指定したDriveに置かれているファイルのコメントを削除|[⧉[Google Drive API v3] Javaでファイルのコメントを追加・変更・削除する](https://qiita.com/doran/items/aca99b0fc94cb6ecd4d9)|
|get|指定した指定したDriveに置かれているファイルのコメントを取得|[⧉[Google Drive API v3] Javaでファイルのコメントを取得する](https://qiita.com/doran/items/d6d9d5c28a4b4afd08ff)|
|list|Driveに置かれているファイルのコメントリストを取得|[⧉[Google Drive API v3] Javaでファイルのコメントを取得する](https://qiita.com/doran/items/d6d9d5c28a4b4afd08ff)|
|update|指定したDriveに置かれているファイルのコメントを変更|[⧉[Google Drive API v3] Javaでファイルのコメントを追加・変更・削除する](https://qiita.com/doran/items/aca99b0fc94cb6ecd4d9)|

### 3.6. drives
**共有ドライブ**を操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|create|共有ドライブを作成|[⧉[Google Drive API v3] Javaで共有ドライブを作成・更新・削除する](https://qiita.com/doran/items/16b2b690cefef182038e)|
|delete|指定した共有ドライブを削除|[⧉[Google Drive API v3] Javaで共有ドライブを作成・更新・削除する](https://qiita.com/doran/items/16b2b690cefef182038e)|
|get|指定した共有ドライブの情報を取得|[⧉[Google Drive API v3] Javaで共有ドライブの情報を取得する](https://qiita.com/doran/items/3f04743209ed29dd9b13)|
|hide|指定した共有ドライブのビューを表示|[⧉[Google Drive API v3] Javaで共有ドライブのビューを表示・非表示にする](https://qiita.com/doran/items/d0f568b09eb2252f6fce)|
|list|共有ドライブの情報リストを取得|[⧉[Google Drive API v3] Javaで共有ドライブの情報を取得する](https://qiita.com/doran/items/3f04743209ed29dd9b13)|
|unhide|指定した共有ドライブのビューを非表示にする|[⧉[Google Drive API v3] Javaで共有ドライブのビューを表示・非表示にする](https://qiita.com/doran/items/d0f568b09eb2252f6fce)|
|update|指定した共有ドライブの情報を更新|[⧉[Google Drive API v3] Javaで共有ドライブを作成・更新・削除する](https://qiita.com/doran/items/16b2b690cefef182038e)|

### 3.7. files
**ファイル**を操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|copy|指定したDriveのファイルをコピー|[⧉[Google Drive API v3] Javaでファイルをアップロード・生成・コピー・更新・削除する](https://qiita.com/doran/items/4583378c881aec8653a0)|
|create|Driveにファイルを生成|[⧉[Google Drive API v3] Javaでファイルをアップロード・生成・コピー・更新・削除する](https://qiita.com/doran/items/4583378c881aec8653a0)|
|delete|指定したDriveのファイルを削除|[⧉[Google Drive API v3] Javaでファイルをアップロード・生成・コピー・更新・削除する](https://qiita.com/doran/items/4583378c881aec8653a0)|
|emptyTrash|Driveのゴミ箱を空にする|[⧉[Google Drive API v3] JavaでDriveのゴミ箱を空にする](https://qiita.com/doran/items/d554f9114042a19671b3)|
|export|Driveに置かれているファイルをダウンロード|[⧉[Google Drive API v3] JavaでDriveのファイルをダウンロードする](https://qiita.com/doran/items/0e38ce33b8e2a4912c9f)|
|generateIds|Driveにファイルを作成(新規、またはコピーにより作成)するときに使用可能なファイルIDのリストを取得|[⧉[Google Drive API v3] JavaでDriveのファイルの情報を取得する](https://qiita.com/doran/items/95060585b9745a568dcb)|
|get|指定したDriveに置かれているファイルの情報を取得<br><br>指定したDriveに置かれているファイルを形式を指定してダウンロード|[⧉[Google Drive API v3] JavaでDriveのファイルの情報を取得する](https://qiita.com/doran/items/95060585b9745a568dcb)<br><br>[⧉[Google Drive API v3] JavaでDriveのファイルをダウンロードする](https://qiita.com/doran/items/0e38ce33b8e2a4912c9f)|
|list|Driveに置かれているファイルの情報リストを取得|[⧉[Google Drive API v3] JavaでDriveのファイルの情報を取得する](https://qiita.com/doran/items/95060585b9745a568dcb)|
|listLabels|指定したDriveに置かれているファイルのラベル情報リストを取得|[⧉[Google Drive API v3] JavaでDriveのファイルの情報を取得する](https://qiita.com/doran/items/95060585b9745a568dcb)|
|modifyLabels|指定したDriveに置かれているファイルのラベルを更新|[⧉[Google Drive API v3] JavaでDriveのファイルのラベルを更新する](https://qiita.com/doran/items/de27b4b1c3eff0806873)|
|update|Driveにファイルをアップロード|[⧉[Google Drive API v3] Javaでファイルをアップロード・生成・コピー・更新・削除する](https://qiita.com/doran/items/4583378c881aec8653a0)|
|watch|指定したファイルの変更通知(サブスクライブ)を登録|[⧉[Google Drive API v3] Javaでファイル、ユーザー情報の変更通知(サブスクライブ)を受信・停止する](https://qiita.com/doran/items/1cef2154bb1554f82eea)|

### 3.8. permissions
**ファイルの権限**を操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|create|指定したDriveに置かれているファイルのパーミッションを付与|[⧉[Google Drive API v3] Javaでファイルのパーミッションを付与・更新・削除する](https://qiita.com/doran/items/9cfad57d40946f483186)|
|delete|指定したDriveに置かれているファイルのパーミッションを削除|[⧉[Google Drive API v3] Javaでファイルのパーミッションを付与・更新・削除する](https://qiita.com/doran/items/9cfad57d40946f483186)|
|get|指定したDriveに置かれているファイルのパーミッション情報を取得|[⧉[Google Drive API v3] Javaでファイルのパーミッション情報を取得する](https://qiita.com/doran/items/0650753104bdb55f2699)|
|list|Driveに置かれているファイルのパーミッション情報リストを取得|[⧉[Google Drive API v3] Javaでファイルのパーミッション情報を取得する](https://qiita.com/doran/items/0650753104bdb55f2699)|
|update|指定したDriveに置かれているファイルのパーミッションを更新|[⧉[Google Drive API v3] Javaでファイルのパーミッションを付与・更新・削除する](https://qiita.com/doran/items/9cfad57d40946f483186)|

### 3.9. replies
**ファイルのコメントの返信**を操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|create|指定したDriveに置かれているファイルのコメントのリプライを追加|[⧉[Google Drive API v3] Javaでファイルのコメントの返信(リプライ)を追加・変更・削除する](https://qiita.com/doran/items/c1cf6469ade8eb25ee1c)|
|delete|指定したDriveに置かれているファイルのコメントのリプライを削除|[⧉[Google Drive API v3] Javaでファイルのコメントの返信(リプライ)を追加・変更・削除する](https://qiita.com/doran/items/c1cf6469ade8eb25ee1c)|
|get|指定したDriveに置かれているファイルのコメントのリプライを取得|[⧉[Google Drive API v3] Javaでファイルのコメントの返信(リプライ)を取得する](https://qiita.com/doran/items/64ae7fb4651bf8bc0dcf)|
|list|指定したDriveに置かれているファイルのコメントのリプライリストを取得|[⧉[Google Drive API v3] Javaでファイルのコメントの返信(リプライ)を取得する](https://qiita.com/doran/items/64ae7fb4651bf8bc0dcf)|
|update|指定したDriveに置かれているファイルのコメントのリプライを変更|[⧉[Google Drive API v3] Javaでファイルのコメントの返信(リプライ)を追加・変更・削除する](https://qiita.com/doran/items/c1cf6469ade8eb25ee1c)|

### 3.10. revisions
**ファイルのリビジョン**を操作するAPIです。
|メソッド|概要|記事|
|---|---|---|
|delete|指定したDriveに置かれているファイルのリビジョンを削除|[⧉[Google Drive API v3] Javaでファイルのリビジョンを更新・削除する](https://qiita.com/doran/items/a79d7e08090a23073fd1)|
|get|指定したDriveに置かれているファイルの指定したリビジョンを取得|[⧉[Google Drive API v3] Javaでファイルのリビジョンを取得する](https://qiita.com/doran/items/a3123308d5afd66a077b)|
|list|Driveに置かれているファイルのリビジョンリストを取得|[⧉[Google Drive API v3] Javaでファイルのリビジョンを取得する](https://qiita.com/doran/items/a3123308d5afd66a077b)|
|update|指定したDriveに置かれているファイルのリビジョンを更新|[⧉[Google Drive API v3] Javaでファイルのリビジョンを更新・削除する](https://qiita.com/doran/items/a79d7e08090a23073fd1)|

<br>
<br>
おしまい。。