1. Google Calendar API v3 その3 取得編

    前回はGoogle認証までできました。今回はいよいよカレンダーリストを取得します。



    前回のコードに追加します。

    public class GoogleCalendar {

    private static final String APPLICATION_NAME = "GoogleCalendarSample";

    private static HttpTransport HTTP_TRANSPORT;
    private static final JsonFactory JSON_FACTORY = JacksonFactory
    .getDefaultInstance();

    // リダイレクトURL
    private static final String REDIRECT_URL = "http://localhost:8080/google/callback";

    public GoogleCalendar() {
    }

    /**
    * google flow 認証のためのオブジェクト取得
    */
    public GoogleAuthorizationCodeFlow getFlow() throws IOException,
    GeneralSecurityException {

    HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

    // スコープの設定
    Set<String> scopes = new HashSet<String>();
    scopes.add(CalendarScopes.CALENDAR);
    scopes.add(CalendarScopes.CALENDAR_READONLY);

    GoogleClientSecrets clientSecrets = getClientSecrets();

    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
    HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, scopes)
    .setAccessType("offline").setApprovalPrompt("force").build();

    return flow;
    }

    /**
    * JSONファイル取得
    */
    public GoogleClientSecrets getClientSecrets() throws IOException {
    Reader SECRET_FILE = new InputStreamReader(
    GoogleCalendar.class.getResourceAsStream("/client_secrets.json"));
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(
    JSON_FACTORY, SECRET_FILE);

    return clientSecrets;
    }

    /**
    * 認証URL取得
    */
    public String getGoogleOAuthURL() throws IOException,
    GeneralSecurityException {
    GoogleAuthorizationCodeFlow flow = getFlow();
    return flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URL).build();
    }

    /**
    * コールバック後、レスポンス取得
    */
    public GoogleTokenResponse getGoogleResponse(String code)
    throws IOException, GeneralSecurityException {
    GoogleAuthorizationCodeFlow flow = getFlow();
    return flow.newTokenRequest(code).setRedirectUri(REDIRECT_URL)
    .execute();
    }

    /**
    * 認証オブジェクト取得
    */
    public GoogleCredential getGoogleCredential(String refresh_token)
    throws GeneralSecurityException, IOException {

    if (HTTP_TRANSPORT == null) {
    HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    }

    GoogleClientSecrets secrets = getClientSecrets();
    GoogleCredential credential = new GoogleCredential.Builder()
    .setClientSecrets(secrets.getDetails().getClientId(),
    secrets.getDetails().getClientSecret())
    .setJsonFactory(JSON_FACTORY).setTransport(HTTP_TRANSPORT)
    .build();

    credential.setRefreshToken(refresh_token);
    credential.refreshToken();

    return credential;
    }

    /**
    * カレンダーにアクセスするためのオブジェクト取得
    */
    public com.google.api.services.calendar.Calendar getCalendarClient(
    GoogleCredential credential) throws GeneralSecurityException,
    IOException {
    if (HTTP_TRANSPORT == null) {
    HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    }

    return new com.google.api.services.calendar.Calendar.Builder(
    HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();.build();
    }

    }

     

    Googleからコールバックしてきたら以下のような流れでカレンダーリストを取得します。
    //callbackパラメータ
    String code = request.getParameter("code");

    GoogleCalendar googleCalendar = new GoogleCalendar();
    //レスポンス取得
    GoogleTokenResponse response = googleCalendar.getGoogleResponse(code);

    //リフレッシュトークンとアクセストークン
    System.out.println(response.getRefreshToken());
    System.out.println(response.getAccessToken());

    //カレンダーにアクセスするためのオブジェクト取得
    GoogleCredential credential = googleCalendar.getGoogleCredential(response.getRefreshToken());
    com.google.api.services.calendar.Calendar client = googleCalendar.getCalendarClient(credential);

    //カレンダーリスト取得
    CalendarList feed = client.calendarList().list().execute();

    feedにはカレンダーの一覧が入っています。詳しくはこちら

    今後認証フローをはさまずカレンダーにアクセスするためにはリフレッシュトークンが必須となりますのでデータベース等に保存しておきます。ちなみにこのリフレッシュトークンは認証フロー時にしか発行されませんので注意が必要です。そしてリフレッシュトークンを取得するためには、アクセスタイプをオフラインに設定する必要があります(必須)。そのあとのsetApprovalPromptは認証URLに遷移した時に毎回Google認証をさせるかを設定しています。必須ではありませんが、デフォルトでは一度認証すると認証フローはスルーされるためリフレッシュトークンは発行されないことになります。
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
    HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, scopes)
    .setAccessType("offline").setApprovalPrompt("force").build();

    リフレッシュトークンを使用してカレンダーの一覧を取得する場合は以下のようにします。
    String refresh_token = "USER_RIFRESH_TOKEN";

    GoogleCalendar googleCalendar = new GoogleCalendar();

    //カレンダーにアクセスするためのオブジェクト取得
    GoogleCredential credential = googleCalendar.getGoogleCredential(refresh_token);
    com.google.api.services.calendar.Calendar client = googleCalendar.getCalendarClient(credential);

    //カレンダーリスト取得
    CalendarList feed = client.calendarList().list().execute();

    認証オブジェクト取得時の
    credential.refreshToken();

    で新しいアクセストークンを取得しています。

    またまた長くなったのでカレンダー別の予定の取得、書き込み等は次回にします。

     

    Posted by Shunsuke Hayashi on 2014年05月01日
    Categories Google API Java