--- title: 'Google drive Api quick-start' disqus: hackmd --- ###### tags: `Google drive api` Google drive api quickstart === [TOC] ## 筆記目的 完成串接 Google drive api 的串接部分,具體來說可以執行官網上的 GetCampaigns.java範例 具體請參考: * [Google drive api Java Quickstart ](https://developers.google.com/drive/api/v3/quickstart/java) ## 先備條件 1. [Create a project and enable the API](https://developers.google.com/workspace/guides/create-credentials) 2. [Create credentials](https://developers.google.com/workspace/guides/create-credentials) ## 程式碼部分 ### 檔案架構 ![](https://i.imgur.com/XEze1kX.png) ### 撰寫的步驟 1. 把東西下載下來後改名成credentials(json檔案,不要取名叫做credentials.json會出現兩個json) ![](https://i.imgur.com/8yrrwfC.png) 2. 把相關的套件放入pom.xml檔案裏面 3. 要有個觀念,因為我們都會用到oauth認證,所以不要傻傻的只有放入drive api,還有oauth 跟 client要放入 4. 把quickstart的程式碼複製下來,有些錯誤,所以要改進,並且要讀懂他的邏輯,最好把他改寫成一個class,可以呼叫,這樣日後再作測試的時候,就可以不需要這麼多程式碼。 ### pom.xml 官網上的範例是gradle,但是這裡比較習慣是使用maven 從官網上可以看出需要以下三個套件 ![](https://i.imgur.com/xXooMG5.png) 相依套件不會自動下載,一定得手動加,所以下面三個套件都要自己加入pom.xml ```xml= <!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client --> <dependency> <groupId>com.google.api-client</groupId> <artifactId>google-api-client</artifactId> <version>1.23.0</version> </dependency> <dependency> <groupId>com.google.apis</groupId> <artifactId>google-api-services-drive</artifactId> <version>v3-rev173-1.25.0</version> </dependency> <dependency> <groupId>com.google.oauth-client</groupId> <artifactId>google-oauth-client-jetty</artifactId> <version>1.30.1</version> </dependency> ``` 如果不加入上面這個的話,下面這個會爆出錯誤,因為我們有用到**oauth2** ```java= import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; ``` ![](https://i.imgur.com/1KcfhvG.png) ```xml= <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.3</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>GoogleDriveApi</artifactId> <version>0.0.1-SNAPSHOT</version> <name>GoogleDriveApi</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-drive --> <!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-drive --> <dependency> <groupId>com.google.apis</groupId> <artifactId>google-api-services-drive</artifactId> <version>v3-rev173-1.25.0</version> </dependency> <dependency> <groupId>com.google.oauth-client</groupId> <artifactId>google-oauth-client-jetty</artifactId> <version>1.30.1</version> </dependency> <!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client --> <dependency> <groupId>com.google.api-client</groupId> <artifactId>google-api-client</artifactId> <version>1.23.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ``` ### QuickStart 直接複製官網的會有問題,所以請用這裡的code ```java= package com.example.demo; import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.client.util.store.FileDataStoreFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.FileList; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.security.GeneralSecurityException; import java.util.Collections; import java.util.List; public class DriveQuickstart { private static final String APPLICATION_NAME = "Google Drive API Java Quickstart"; private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); private static final String TOKENS_DIRECTORY_PATH = "tokens"; /** * Global instance of the scopes required by this quickstart. * If modifying these scopes, delete your previously saved tokens/ folder. * 這邊可以控制呼叫Drive API 的使用權限 */ private static final List<String> SCOPES = Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY); /* * 此份檔案得從Google Api console 後台 開啟Google Drive服務後就可以取得該份檔案 * 將此份檔案放在 /src/main/resources 即可 */ private static final String CREDENTIALS_FILE_PATH = "/credentials.json"; /** * Creates an authorized Credential object. * @param HTTP_TRANSPORT The network HTTP Transport. * @return An authorized Credential object. * @throws IOException If the credentials.json file cannot be found. */ private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException { // Load client secrets. InputStream in = DriveQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH); if (in == null) { throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); } GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); // Build flow and trigger user authorization request. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) .setAccessType("offline") .build(); // LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); // return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user"); return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); } public static void main(String... args) throws IOException, GeneralSecurityException { // Build a new authorized API client service. final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) .setApplicationName(APPLICATION_NAME) .build(); // Print the names and IDs for up to 10 files. FileList result = service.files().list() .setPageSize(10) .setFields("nextPageToken, files(id, name)") .execute(); List<com.google.api.services.drive.model.File> files = result.getFiles(); if (files == null || files.isEmpty()) { System.out.println("No files found."); } else { System.out.println("Files:"); for (com.google.api.services.drive.model.File file : files) { System.out.printf("%s (%s)\n", file.getName(), file.getId()); } } } } ``` ## Quickstart compile error [Google Drive Api Java Quickstart compile error](https://stackoverflow.com/questions/41552557/google-drive-api-java-quickstart-compile-error)