ElectronでGoogleカレンダーの日本の祝日を取得する

とあるアプリで、祝日判定をする為に祝日データが必要になったのですが、Googleには公開カレンダーとして日本の祝日というものが用意されています。このデータを取得してデータベースに格納しておけば、手動で祝日登録を行う必要がなくなるので便利です。

ということで、このデータをElectron(Node.js)で取得し、SQLiteのデータベースに格納してみようと思います。

また、今回はいい加減Deprecatedになったrequestモジュールを卒業し、node-fetchモジュールで社内Proxy超えを設定して取得を試みます・

事前準備

API Keyを取得する

Googleカレンダーにアクセスする為には、Cloud ConsoleよりAPI Keyを生成して取得する必要があります。以下の手順で取得をしておきましょう。予めプロジェクトは作っておいてください。

  1. Google Cloud Consoleにログインする
  2. サイドバーを開き、「APIとサービス」を開く
  3. 上部にある「APIとサービスの有効化」をクリックする
  4. calendarで検索し、Google Calendar APIをクリックし、有効化をクリックする
  5. そのまま認証情報を作成するのではなく、一旦APIとサービスに戻り、認証情報をクリックする
  6. 上部にある「認証情報を作成」をクリックする
  7. APIキーをクリックする
  8. すぐにAPIキーが生成されるので、控えておく。
  9. キーを制限をクリックする
  10. 今回はAPIの制限にて、キーを制限をクリックし、Google Calendar APIでだけ利用できるようにします。
  11. 最後に保存するで完了です。

図:APIキーを生成する画面

モジュールを追加する

旧来のrequestモジュールに変わって、node-fetchモジュールを追加します。しかし、node-fetch自身はProxyに対応していないので、追加でさらにproxy-agentモジュールも追加します。ターミナルから以下のモジュールをElectronのプロジェクトに追加しましょう。

もちろん、Proxyの無い環境であれば不要なので、ここではnode-fetchだけをインストールすればOKです。

ソースコードとレスポンス

index.js側コード

  • Google CalendarのIDはja.japanese#holiday@group.v.calendar.google.comで、リクエストURLに指定する場合はencodeURIComponentでURLエンコードする必要があります。
  • startdayとenddayで日付の範囲を指定しますが、Google Calendarの場合、2年後以降の祝日データは入っていないので注意。
  • node-fetchでproxyを透過するには、optionsの中のagentにて指定する必要があります。投稿を表示
  • レスポンスはres.json()で取得され、これはBody部分のデータが入っています。
  • ステータスはres.statusで取得し判定することが可能です。
  • sqlitedeleteとsqliteinsertは自前で用意したSQLiteのデータ削除とデータ追加の為の関数です。
  • async.eachSeriesにて1レコードずつ追加しています。
  • node-fetch以外にaxiosというリクエストモジュールがあるのですが、自分の環境ではどう頑張ってもproxy関係で躓いてNGだったのでスルーしました。(2021/08/04 - なんかProject Deadという不穏なスレッドが立っています。利用者多いはずなのですが大丈夫かな?)

レスポンスデータ

  • itemsの中に複数の祝日データが入っています。
  • res.json()で取得する中身になります
  • 通常は、itemsのsummarystartのdateの値だけで十分です。それぞれ祝日名と日付になります。

図:無事に取得出来ました。

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)