ryoakg
4/1/2017 - 1:14 AM

google-drive-lister.clj

;;; translation of https://developers.google.com/drive/v3/web/quickstart/java
;;; from Java into Clojure

(set-env! :dependencies '[
                          ;; https://mvnrepository.com/artifact/com.google.api-client/google-api-client
                          [com.google.api-client/google-api-client "1.22.0"]
                          ;; https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client
                          [com.google.oauth-client/google-oauth-client "1.22.0"]

                          [com.google.apis/google-api-services-drive "v3-rev65-1.22.0"]

                          ;; https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client-java6
                          [com.google.oauth-client/google-oauth-client-java6 "1.22.0"]

                          ;; https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client-jetty
                          [com.google.oauth-client/google-oauth-client-jetty "1.22.0"]
                          ;; ブラウザで認証した権限を、ブラウザを使ってアプリケーションに委譲するのに使う。
                          ;; ブラウザ操作を促す為に jetty でサーバを立てるという使い方
                          ])

(require '[clojure.java.io :as io])

(def APPLICATION-NAME "Drive API Java Quickstart")

(def DATA-STORE-DIR
  "Directory to store user credentials for this application."
  (io/file (System/getProperty "user.home")
           ".credentials/drive-java-quickstart"))

(def client-id-file
  "Id and secret.

  You can get this file from https://console.developers.google.com/start/api?id=drive"
  (io/file (System/getProperty "user.home") "Workspace" "client_id.json"))


(let [^com.google.api.client.json.jackson2.JacksonFactory json-factory
      (com.google.api.client.json.jackson2.JacksonFactory/getDefaultInstance)

      ^java.util.List scopes
      (java.util.Arrays/asList (into-array [com.google.api.services.drive.DriveScopes/DRIVE_METADATA_READONLY]))

      ^com.google.api.client.http.HttpTransport http-transport
      (com.google.api.client.googleapis.javanet.GoogleNetHttpTransport/newTrustedTransport)

      ^com.google.api.client.util.store.FileDataStoreFactory data-store-factory
      (com.google.api.client.util.store.FileDataStoreFactory. DATA-STORE-DIR)

      ^com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets secret
      (com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets/load
       json-factory (io/reader client-id-file))

      ^com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow flow
      (-> (com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow$Builder.
           http-transport json-factory secret scopes)
          (.setDataStoreFactory data-store-factory)
          (.setAccessType "offline")
          .build)

      ^com.google.api.client.auth.oauth2.Credential credential
      (-> (com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp.
           flow (com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver.))
          (.authorize "user"))

      ^com.google.api.services.drive.Drive drive
      (-> (com.google.api.services.drive.Drive$Builder. http-transport json-factory credential)
          (.setApplicationName APPLICATION-NAME)
          .build)]
  (let [files (-> drive
                  .files
                  .list
                  (.setPageSize (int 10))
                  (.setFields "nextPageToken, files(id, name)")
                  .execute
                  .getFiles)]
    (if (and files (pos? (.size files)))
      (map (juxt #(.getName %) #(.getId %)) files)
      :no-files)))