PHPでGoogleカレンダーから日本の祝日一覧を取得する

ブログ

Blog
  1. ホームページ制作・運営はアウラ:ホーム
  2. ブログ
  3. PHPでGoogleカレンダーから日本の祝日一覧を取得する

PHPでGoogleカレンダーから日本の祝日一覧を取得する

PHPでGoogleカレンダーから日本の祝日一覧を取得する

こんにちは!エンジニアの仁木です。

最近は雨が続いていたこともあり、少し暑さが和らいできましたね。
眠る時にもエアコンをつけなくても眠れるようになってきました。

さて、本日は日本の祝日一覧をGoogleカレンダーを使って、PHPで取得するための方法をご紹介したいと思います。
カレンダーのようなスケジュール機能のあるアプリケーションで、祝日の表示は必要になる場面は多くなると思います。そんな時にどうやって祝日を取得するのか、その方法を見ていきましょう。

祝日は誰が決めている?

いきなり余談となりますが、そもそも祝日って、誰がどのようにして決めているのでしょうか?

祝日は「国民の祝日に関する法律」に基づいて決められています。ちゃんと法律が制定されているんですね。
例えば、「成人の日1月の第2月曜」であったり、「憲法記念日5月3日」というように法律で定められています。
また、法律に明記されてはいませんが、祝日が日曜になった場合、振替休日として一番近い平日を休日になります。

ちなみに内閣府のHPには今年の祝日の一覧が掲載されています。

内閣府 – 「国民の祝日」について

Google Calendarから日本の祝日一覧を取得する

Google Calendar

上記のように、祝日は毎年決まった日にちで固定されているわけではなく、年ごとに変わるのでプログラムで真っ向から対応するのはおそらく大変でしょう。もっと簡単に別のリソースから手に入るのであればそうしたいです。

実は先程の内閣府のページには祝日の一覧を記載したCSVファイルも用意されています。
このCSVファイルをプログラムで取得して祝日一覧を取得する方法もあるようですが、今回はこの方法ではなく、Google Calendarから取得する方法にします。

Google Calendar APIを使う

Google Calendarには、日本の祝日をイベントとして登録しているアカウントがあり、そのアカウントのイベント情報をAPIで取得することで、祝日一覧が取得できるようになっているんですね。

Google Calendar APIの設定

では実際にAPIを使えるようにしていきましょう。

Googleアカウントの準備

GoogleのAPI全般の利用にはGoogleアカウントが必須です。
Googleアカウントを持っていない方は先にアカウントを作成してください。

Google Cloud Platformで新規プロジェクトを作成

Googleアカウントにログインした状態で「Google Cloud Platform」のページにアクセスして新規プロジェクトを作成します。既存のプロジェクトで新たにGoogle Calendar APIを利用する場合は、作成済みのプロジェクトを選択してください。

※APIはリクエスト数に応じて課金が発生するので、プロジェクトの作成時に請求先アカウントの紐付けが必要になります。請求先アカウントの作り方については本記事では割愛させていただきます。

Google Calendar APIでプロジェクトで有効化する

ナビゲーションメニューの「APIとサービス」から「ライブラリ」の画面を開き、検索フォームに「Google Calendar API」と入力・検索して有効化します。

API検索画面

APIの利用に認証情報を設定する

プログラム上でAPIにリクエストを送信するためには「認証情報」を設定し、APIキーを取得しなければいけません。
認証情報では、APIをリクエストできるサーバーやドメインを制限し、特定の環境でのみリクエストを認証するよう設定します。

APIの制限を行わないと、万が一APIキーが不正に使用されてしまった場合、リクエスト回数に応じて課金が発生してしまったりとトラブルの原因となるので、しっかりと制限はしておきましょう。

認証情報画面の上部にある「認証情報を作成」から新たに認証情報を作成します。

認証情報の新規作成

今回APIはサーバー上でPHPでリクエストを送るので、「キーの制限」はIPアドレスで制限します。
PHPのプログラムが実行されるWebサーバーのIPアドレスを追加します。
テスト環境や開発環境でも利用する場合はそれぞれのIPアドレスも追加しておきます。

認証情報の設定

また、使用できるAPIも制限できます。今回だと使用するのはGoogle Calendar APIのみになるので、このAPIのみ指定することで意図しないAPIの呼び出しを防ぐことができます。

最後に保存を行うとAPIキーが発行されます。
今後の実装でAPIにリクエストを送信する際に、このAPIキーが必要になります。

PHPプログラムの実装

APIの準備ができれば実装になります。

今回はcurlを使ってリクエストを送信して、祝日一覧のデータをJSONで取得します。
まずは完成したソースコードをいきなり載せちゃいます。

上から順番に説明していきます。

祝日の取得範囲を決める

はじめに、今年の1月1日から12月31日までの範囲の祝日を取得するために、取得する開始日と終了日を指定しています。

mktime関数では指定した日時のタイムスタンプを取得できます。
引数は順番に「時」「分」「秒」「月」「日」「年」となります。

$start_monthは1月1日とわかりやすいですが、$end_monthの引数を見ると「日」のパラメーターが0になっていますね。これはmktime関数が、「日」の引数に0を指定すると前月の末日を返すため、このようになっています。
「年」の引数が、(int)$date->format(‘Y’) + 1になっているので、「翌年の1月1日の前日 = 今年の年末」となるわけですね。

APIリクエスト先のURL

ここではAPIにリクエストするURLを作成しています。

‘japanese__ja@holiday.calendar.google.com’は日本の祝日が登録されているアカウントです。

GOOGLE_API_KEYは先程取得したGoogle Calendar APIのAPIキーを指定します。

date(‘Y-m-d’, $start_month).’T00:00:00Z’ date(‘Y-m-d’, $end_month).’T00:00:00Z’は1~4行目で用意した取得開始日と終了日をタイムスタンプから、APIで指定できる日付のフォーマットに変換しています。

curlの設定とリクエスト処理の実行、レスポンスを受け取る

ここから最後までの部分では、curlを使ってAPIにリクエストして、API受け取ったレスポンスから休日一覧のデータを取得しています。

APIからのレスポンスはJSON形式で返されるので、json_decode関数で配列に変換します。
さらに祝日一覧は配列の中の”items“のキーの中に格納されているので、そこから取り出してプログラムで使うことができます。

おまけ 取得した祝日一覧をサーバーに保存する

上記でAPIから日本の祝日一覧が取得できましたね!

しかし、祝日というのは常日頃から変更されるものではありません。
なのに、プログラムが実行されるたびにAPIにリクエストするのは無駄とも言えるでしょう。GoogleのAPIは使用回数に応じて課金も発生するので、できればリクエスト回数は抑えたいものです。

なので、一度取得した祝日一覧はテキストファイルやデータベースなど、サーバー側でデータを保持するようにしておくと最初の1回目以降はAPIにリクエストしなくても祝日一覧のデータを取得できます。

上記のコードの例では年単位で取得した祝日のデータを「hoiday-YYYY.json」ファイルにJSON形式のテキストとして保存しています。

もし今年の祝日一覧のデータが必要になれば次回以降はこのファイルを参照すれば良いですね。

さいごに

かなり短いソースコードで簡単に祝日一覧を取得できましたね。
どちらかというと、APIの使うまでの設定回りの方がややこしいのではないのでしょうか。

エンジニアの人たちはソースコードを書く以外にも、今回使用したGoogle Cloud PlarformやAWS、はたまたGithubなど、SaaSのWebアプリケーションも多く使いこなせる必要性が高くなってきたなと感じます。

前後の記事

お電話でのお問い合わせはこちら:06-6292-8577。受付時間は平日9:30~18:30 インターネットからは24時間受付中!お問い合わせフォームはこちら