Google Meetに(ちょっとだけ)楽にアクセスできるRaycastの拡張機能をつくった
はじめに
随分前にRaycastというランチャーがReactで拡張機能を作れると知って、ランチャーをRaycastに乗り換えたが、結局拡張機能を作ることはせずに時間が過ぎてしまっていた。 とりあえずなにか作ってみようと思い、普段の業務で該当時間になったらミーティングのたびにgoogleカレンダーをブラウザで開いてそこからアクセスするのが面倒だったので、キーボード操作のみでアクセスできるようにした。 (目的からすると時間になったらURLをpush通知してクリックすればよいだけなのでわざわざraycastでというのはある)
Raycastとは
Raycastは、ランチャーアプリケーションで、ショートカットキーを使って素早くアプリやファイルにアクセスすることができます。また、Raycastでは、Reactを使用して独自の拡張機能を作成することができます!
拡張機能の作り方
- Raycastを開き、「create」と入力します。
- 「Create Extension」を選択します。
- 拡張機能作成画面で必要な項目を選択します。ここでは、Templateを選択することができます。Templateに応じて、Locationで設定したディレクトリに必要なコードが自動生成されます。
- 生成されたコードはReactで書かれていて、npm run devで開発サーバーを起動できます。
実際に作った拡張機能
概要
現在時刻から前後15分の間にGoogleカレンダーに設定されているGoogle Meetにアクセスするようにした。
認証
Googleアカウントの認証には以下の3つの方法があります。
APIキー
OAuth2.0
サービスアカウント
今回の目的としてOAuth2.0での認証が一番使い勝手が良さそうだったのでそちらで実装していたのですが、一通り動いた数日後に
Token has been expired or revoked.
というエラーが発生し、調べたところ、該当のアプリケーションの公開ステータスが「テスト」のものに関しては7日で更新期限が切れるとのことで、サービスアカウントでの認証方式を利用しました。
サービスアカウントとは
サービスアカウントは、Google Cloud Platformでアプリケーションの認証やアクセス制御を提供するアカウントです。サービスアカウントを作成すると、特定のサービスアカウントに関連付けられるキーペアが生成されます。このキーペアは、Google Cloud APIの利用時の認証に使用されるプライベートキーと公開キーです。
サービスアカウントの作成方法や利用方法は以下を参照してください。
JSON形式で取得できるので、そのJSONを手元に保管してください。
ただし、サービスアカウントでの認証を利用する際に、認証したサービスアカウントもカレンダーに追加する必要がある点に注意してください。毎回追加するのが面倒であれば、公開可能なアプリの場合はOAuth2.0で認証するか、ライトな使い方であればAPIキーベースでの認証にした方が良いと思います。
googleapisの利用について
Raycastは拡張機能のヒープ領域が制限されているらしく、googleapisをインポートするとheap out of memoryのエラーが発生します。この問題を解決するために、分割インポートを使用しました。 このエラーで多少ハマって調べていたらこちらの記事を見つけることができ、上記解決方法に至りました。
利用方法
Raycastを開いて「Import Extension」を起動し、gitから一式格納したディレクトリを指定してください。
その後、以下のkeyFileにサービスアカウントのjsonを格納したpathを設定してください。
const auth = new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/calendar.readonly', keyFile: '/path/to/serviceaccount.json', });
上記設定後npm run dev
で起動します。
googleカレンダーの参加者にサービスアカウントのメールアドレスを追加してください。サービスアカウントのメールアドレスの確認は左のナビゲーションメニューから「IAMと管理」→「サービスアカウント」で確認できます。
実際にRaycastから起動すると以下のように現在時刻を基準に前後15分のカレンダー情報を取得できていると思います。
参考
Raycast で作業スピードを爆速化 ! Google カレンダー連携 拡張機能の作り方 - Goodpatch Tech Blog