Google Calendar APIで祝日を取得する


記事の概要

  • MavenでGoogle Calendar APIを利用して祝日を取得する方法
  • 公式のサンプルコードをいじれば使える
  • トークンは定期的にリセット

背景

Google Calendar APIは有名なので利用方法はすぐに見つかるが、PHPやPythonばかりで少し手こずったので自分と同じような人のために書く。

目的

公式に載っているサンプルコードをMaven向けに書き換えて祝日を取得する。その内容を新卒半年の情弱エンジニアがわかりやすく書く。

手順

1. Mavenのプロジェクトを作成する(このあたりを参考)

  • プロジェクト内にsrcフォルダとpom.xmlができるはず
$ mvn archetype:generate \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DinteractiveMode=false \
  -DgroupId={com.ikeponias} \
  -DartifactId={google-calendar-sample}

2. Credentialファイルをダウンロード

  1. "ENABLE GOOGLE CALENDAR API"をクリック


2. "Select or create project"をクリック

3. すでに存在するプロジェクトを選択するか"Create a new project"を選択してプロジェクト名を入力
4. "DOWNLOAD CLIENT CONFIGURATION"をクリック


5. ダウンロードしたjsonファイルをプロジェクト内のsrc/main/resourcesフォルダ内に配置(おそらくresourcesフォルダは存在しないので新規作成)
6. 配置したjsonファイルをcredentials.jsonという名前にリネーム

3. ソースをコピー

  1. src/main内のApp.javaファイルをCalendarQuickstart.javaへリネーム
  2. CalendarQuickstart.java公式サンプルCalendarQuickstart.javaの中身を丸コピ

4. ソースファイルを編集

  1. src/main/CalendarQuickstart.javaの先頭行にパッケージ名を追加(フォルダ階層変更の有無にもよるが、基本的に最初に生成した際のgroupId。自分はpackage com.ikeponias;と追加)
  2. src/main/CalendarQuickstart.javamainメソッド内のservice.events().list()に渡す引数をprimaryから[email protected]にする(あくまでカレンダーのイベントを取得するAPIなのでこれやらないと自分のイベントが出てくる、参考)

5. pom.xmlを編集

  1. 以下のdependencyを追加
  • google-api-client
  • google-oauth-client-jetty
  • google-api-services-calendar
  1. pluginexec-maven-pluginを追加
  • コマンドラインからmain関数を呼び出すため
  • goaljavaを指定
  • mainClassにはCalendarQuickstart.javaの場所を指定(自分の場合はcom.ikeponias.CalendarQuickstart

以下自分の例(junitはプロジェクト生成時に書かれている)

  <dependencies>
    <!-- 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.26.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client-jetty -->
    <dependency>
      <groupId>com.google.oauth-client</groupId>
      <artifactId>google-oauth-client-jetty</artifactId>
      <version>1.26.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-calendar -->
    <dependency>
      <groupId>com.google.apis</groupId>
      <artifactId>google-api-services-calendar</artifactId>
      <version>v3-rev355-1.25.0</version>
    </dependency>

    <!-- プロジェクト生成時にすでに存在するはず -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <!-- https://mvnrepository.com/artifact/org.codehaus.mojo/exec-maven-plugin -->
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.6.0</version>
        <executions>
          <execution>
            <goals>
              <goal>java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>com.ikeponias.CalendarQuickstart</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>

6. 実行する

  1. ターミナルでmvn clean installを実行
  2. mvn exec:javaを実行
  3. 実行日以降の祝日の一覧が10件出力される(詳しくはソースや公式ドキュメントを読むこと)


4. 以降ソースの変更を反映する場合はmvn compileを行ってからmvn exec:javaを実行

ハマった点

以下自分がハマった点を書く

401 Unauthorized Errorがでる

com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized

理由

トークンの有効期限が切れているため

対策

tokensフォルダを削除して再実行(実行時にtokensフォルダを削除する処理を入れておくと良いかも)

No upcoming events found.でイベントが見つからない

理由

src/main/CalendarQuickstart.javamainメソッド内のservice.events().list()に渡す引数がprimaryになっている

対策

primary[email protected]にする