記事の概要
- 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ファイルをダウンロード
- 公式サンプルのページで
- "ENABLE GOOGLE CALENDAR API"をクリック
3. ソースをコピー
-
src/main
内のApp.java
ファイルをCalendarQuickstart.java
へリネーム -
CalendarQuickstart.java
へ公式サンプルのCalendarQuickstart.java
の中身を丸コピ
4. ソースファイルを編集
-
src/main/CalendarQuickstart.java
の先頭行にパッケージ名を追加(フォルダ階層変更の有無にもよるが、基本的に最初に生成した際のgroupId。自分はpackage com.ikeponias;
と追加) -
src/main/CalendarQuickstart.java
のmain
メソッド内のservice.events().list()
に渡す引数をprimary
からjapanese__ja@holiday.calendar.google.com
にする(あくまでカレンダーのイベントを取得するAPIなのでこれやらないと自分のイベントが出てくる、参考)
5. pom.xml
を編集
- 以下の
dependency
を追加
- google-api-client
- google-oauth-client-jetty
- google-api-services-calendar
-
plugin
にexec-maven-plugin
を追加
- コマンドラインからmain関数を呼び出すため
-
goal
にjava
を指定 -
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. 実行する
- ターミナルで
mvn clean install
を実行 -
mvn exec:java
を実行 - 実行日以降の祝日の一覧が10件出力される(詳しくはソースや公式ドキュメントを読むこと)
ハマった点
以下自分がハマった点を書く
401 Unauthorized Error
がでる
com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized
理由
トークンの有効期限が切れているため
対策
tokens
フォルダを削除して再実行(実行時にtokens
フォルダを削除する処理を入れておくと良いかも)
No upcoming events found.
でイベントが見つからない
理由
src/main/CalendarQuickstart.java
のmain
メソッド内のservice.events().list()
に渡す引数がprimary
になっている
対策
primary
をjapanese__ja@holiday.calendar.google.com
にする