2015年6月30日火曜日

Drive REST APIを使ってJavaでGoogle Driveにファイルをアップロードする方法

こんにちは

鷲尾です。
このブログ記事、一度消えてしまって倒れそうになりました。
こんなことあるんですね・・・


さ、気を取り直してもう一度書きましょうか!


突然ですが、みなさんGoogleDrive使ってますか?
Google Driveが有名になる前は、Dropboxを使っていたという方も結構多いのではないでしょうか(Dropboxももちろん現役バリバリです!)

私もGoogle Driveは日々の業務で使いますし、私の周りではとりあえずドライブにあげておいたり、スマホからもファイルを確認したいといった場合によく使われてるようです。

そんなGoogle Driveですが、実は様々な言語でGoogle Drive内のファイルを操作できるAPIがGoogleから提供されています。

私もJava用のAPIを使って試してみようと思ったのですが、何箇所かひっかかかってしまった箇所がありました。

そこで今回は、Google Drive上にファイルをアップロードすることを目標に、APIの導入から実行確認までを整理していきたいと思います。



それでは、以下の流れで順に説明していきたいと思います。


1.目標
2.使用するAPI
3.Drive REST APIを実行するための準備
4.開発環境での準備
5.動作確認



1.目標
今回は、ローカル環境にある"LocalDocument.txt"というテキストファイルを"DriveDocument : 作成日時"という名前でGoogle Drive上にアップロードすることを目標とします。


2.使用するAPI
ここまでAPIの正式名称が出てきていませんでしたね。
今回使用するAPIの名称は、「Drive REST API」というものです。このDrive REST APIを使用すると、Google Drive上のファイルの一覧を取得したり、ファイルをアップロードしたりといったことが出来ます。Drive REST APIは様々な言語に対応していますが、今回はJavaを使って開発を行います。他の言語を確認したい方は、こちらから確認してください。
https://developers.google.com/drive/web/about-sdk
https://developers.google.com/drive/web/manage-downloads


3.Drive REST API実行をするための事前準備
Drive REST APIIを使用するためには、事前にいくつかの準備が必要です。まずは、APIを使用するための準備を行います。

■必要なもの
・Google アカウント
・開発環境
・プログラム実行用の外部Jarファイルのダウンロード
・Drive REST APIの使用許可設定
・認証情報

3-1.Googleアカウント
当然ですが、Googleアカウントが必要です。Google Driveを使用している方は既にお持ちだと思いますが、まだGoogleアカウントを作成していない場合は、作成しておきます。

3-2.開発環境
この記事では、Eclipse 4.4を使用しています。他のバージョンでも動作するかとは思いますが、開発環境の違いで動作しない場合もあるかと思いますので、その際はEclipse 4.4でお試しください。

なお、Javaのバージョンは1.7以上である必要がありますので、ご自身の環境のJavaのバージョンを事前に確認しておいてください。

3-3.プログラム実行用の外部Jarファイルのダウンロード
Drive REST APIを使用するためのJarファイルが必要です。事前にリンク①から「google-api-java-client.zip」をダウンロードし、解凍しておいてください。

なお、「google-api-java-client.zip」内には含まれていない、Jarファイル(google-api-services-drive-v2-rev174-1.20.0.jar)がありますので、そちらはリンク②からダウンロードしてください。


リンク①:https://github.com/google/google-api-java-client
リンク②:http://mvnrepository.com/artifact/com.google.apis/google-api-services-drive/v2-rev174-1.20.0


3-4.Drive REST APIの使用許可設定
さて、ここまでダウンロードしたりアカウントを作成したりという作業が多かったと思いますが、
ここからは「Google Developers Console」という、Google が開発者向けに提供しているサイトから、操作を行います。

Google Developers Consoleでは、認証情報の発行や削除、APIの使用許可設定などを管理します。AWSやAzureを触ったことがある方は、なんとなくああいった管理画面と近いイメージです。

Google Developers Consoleには、ここからアクセスします。
https://console.developers.google.com

初めてアクセスする方は、プロジェクトを作成する必要があります。お好きな名前でプロジェクトを作成してください。ここでは例として、"PYPROTEST"というプロジェクトを作成しています。
プロジェクトを作成すると、以下の様な画面になると思います。




 画面左のメニューから、「APIと認証」→「API」を開くと、以下のようにAPIの一覧が表示されると思います。その中から、Drive APIを選択します。




画面ではDrive APIが既に有効になっているのでこのようになっていますが、有効になっていない場合は"APIを有効にする"をクリックしてください。




これでDrive REST APIの使用許可設定が完了しました。
続いて、認証情報の発行と取得です。


3-5.認証情報
認証情報は、「認証情報」画面から発行します。
初めに、APIの使用設定と同じく画面左メニューから「APIと認証」→「認証情報」を開きます。


そうすると、以下の様な画面になるかと思います。ここで「新しいクライアントIDを作成」を選択すると、アプリケーションの種類を聞いてきますので、"インストールされているアプリケーション"を選択します。インストールされているアプリケーションの種類は"その他"に設定します。





「クライアントIDを作成」を選択すると、新しくクライアントIDが作成されます。
(同じ画像に見えるのは気のせいです。)




ここで表示されている、"クライアントID""クライアントシークレット""リダイレクトURI"は、後ほど使用しますので、メモ帳などにメモしておくと楽です。


これで、Drive REST APIの実行に必要な準備が完了しました。





4.開発環境での事前準備
さて、ここからはEclipse上での説明になります。

まずは適当な名前でJavaプロジェクトと、Javaクラスを作成します。
なお、ここでは例としてプロジェクト名:DriveTestクラス名:DriveTestMainとしています。

それでは、プログラムのソースコードを作成します。

プログラムのソースは、以下のサンプルをコピペしてください。
なお、今回動かすプログラムはこちらの記事の中のプログラムを参考にしています。
引用:http://qiita.com/pollseed/items/44e99481500c4be0e912


DriveTestMain.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.HttpTransport;
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.services.drive.Drive;
import com.google.api.services.drive.Drive.Files;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.FileList;

public class DriveTestMain {

     private static String CLIENT_ID = "クライアントID";
     private static String CLIENT_SECRET = "クライアントシークレット";
     private static String REDIRECT_URL = "リダイレクトURL";

    public static void main(String[] args) throws IOException {

     HttpTransport httpTransport = new NetHttpTransport();
     JsonFactory jsonFactory = new JacksonFactory();
     GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                      httpTransport,
                      jsonFactory,
                      CLIENT_ID,
                      CLIENT_SECRET,
                      Arrays.asList(DriveScopes.DRIVE)
                                                                               ).setAccessType("online").setApprovalPrompt("auto").build();

     String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URL).build();
     System.out.println("以下のアドレスをブラウザに貼り付けて実行し、認証コードを入力してください");
     System.out.println(" " + url);
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     System.out.print("認証コード:");
     String code = br.readLine();

     GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URL).execute();
     GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response);

// 新規認証APIクライアントを作成
     Drive service = new Drive.Builder(httpTransport, jsonFactory, credential).build();

// ファイルを挿入
     File body = new File();

//タイムスタンプをファイル名に押すように追記
     Date date = new Date();

     SimpleDateFormat sdf = new SimpleDateFormat("yyyy'-'MM'-'dd' 'HH':'mm':'ss");
     body.setTitle("DriveDocument:" + sdf.format(date));
     body.setDescription("A test document");
     body.setMimeType("text/plain");

     java.io.File fileContent = new java.io.File("ファイルパス");
     FileContent mediaContent = new FileContent("text/plain", fileContent);
     File file = service.files().insert(body, mediaContent).execute();
     System.out.println("File ID: " + file.getId());

//IDを取得
     List<File> result = new ArrayList<File>();
     Files.List request = service.files().list();

    do {
            try {
                     FileList files = request.execute();
                     result.addAll(files.getItems());
                     request.setPageToken(files.getNextPageToken());
                  } catch (IOException e) {
                                       System.out.println("An error occurred: " + e);
                                        request.setPageToken(null);
                  }
        } while (request.getPageToken() != null &&
                                                        request.getPageToken().length() > 0);
          System.out.println(file.getTitle());
     }
}

ソースコード内のクライアントID、クライアントシークレット、リダイレクトURIは、先ほど取得した認証情報のものに置き換えてください。
また、ソースコードの下部にあるファイルパスは、今回アップロードしたいファイルを指定してください。例えば、"C:\Users\FileDriveTest\LocalDocument.txt"を指定したい場合、
"C:\\Users\\FileDriveTest\\LocalDocument.txt"のように指定します。

※ 円マーク(\)はエスケープする必要がありますので、パス中の円マーク部分は、円マークが2つ続くように、追記してください。
※ LocalDocument.txtは事前に作成しておいてください。(アップロードのテストに使用するだけなので、中身は任意でかまいません)


これでプログラムの作成は完了です。

プログラムを作成しただけだと、ソースコード中にJarが足りない!とエラーが出ていると思います。そこで事前に準備しておいたJarファイルをプロジェクトに外部Jarファイルとして追加します。

追加するJarファイルは以下のとおりです。
※ 私が動作確認をした環境では以下のJarファイルを追加することで動作しましたが、場合によっては必要なJarファイルに過不足があるようですので、ひとつの参考として見ていただければと思います。

google-api-client-1.20.0.jar
commons-logging-1.1.1.jar
google-http-client-1.20.0.jar
google-oauth-client-1.20.0.jar
google-api-services-drive-v2-rev174-1.20.0.jar
google-api-client-gson-1.20.0.jar
google-http-client-jackson2-1.20.0.jar
google-http-client-jackson-1.20.0.jar
jackson-core-2.1.3.jar


ソースコードからエラーは消えましたでしょうか。
ここまで終われば、あとは実行するだけです。


5.動作確認
それではプログラムを実行します。

まずは普通にプログラムを実行してみてください。
そうすると、このように表示されているはずです。



以下のアドレスをブラウザに貼り付けて実行し、認証コードを入力してください
 https://accounts.google.com/o/oauth2
認証コード:


「認証コード:」が中途半端ですが、問題ありません。

このhttps://~のアドレスをブラウザの検索バーに貼り付けて実行します。



Googleアカウントの選択画面が表示されますので、お好きなアカウントを選択してください。
※ ここで選択したアカウントのGoogle Driveに、先ほどの"LocalDocument.txt"がアップロードされます。

そうすると、先ほどGoogle Developers Consoleで作成したプロジェクトのサービスが、Google Driveへのアクセスをリクエストしてきますので、許可(承諾)します。



そうすると画面が切り替わり、「このコードをコピーし、アプリケーションに切り替えて貼り付けてください」というメッセージとともにランダムな文字列が表示されますので、コピーしてください。


文字列をコピーした状態で、Eclipseに戻ります。
先ほど中途半端になっていた、「認証コード:」のあとに続くように、コピーしてある文字列を貼り付けます。



この状態でエンターを押すとさらに処理が進み、先ほど選択したGoogleアカウントのGoogle Driveのマイドキュメントに、"DriveDocument:作成日時"がアップロードされていれば、成功です。


これでJavaからGoogle Driveへのアクセスを行うことが出来ました。

実際自分で動かしてみて思いましたが、この「アドレス貼って」→「移動して」→「認証情報コピーして」→「コンソールに貼り付けて実行」といった流れ、どうにかなりませんかね・・・

解決方法はあるようですが、手軽にサクっと出来る感じじゃなさそうです。
機会をみて、このあたりをもう少し楽にできれば・・・と思います。

今回はGoogle Driveを操作しましたが、Googleでは他にも様々なAPIを提供しています。
興味のある方はぜひいろいろ試してみてください。


それではまた。

(今回はちゃんと保存されてるはず・・・)





0 件のコメント:

コメントを投稿