Open3

Google カレンダーでアプリのスケジュール管理部分をやってもらいたいんだが

niisanniisan

Google Calendar APIの導入

とりあえず、Google Calendar APIを導入するやり方はこの辺を参考にしてる。

Google APIを利用するためのサービスアカウントの設定(認証)
Google CalendarをLaravelから操作

APIリファレンスはこれを見る

Google Calendar API リファレンス

とりあえず、やり方まとめると

  • GCPのプロジェクト作って、Google Calendar APIを有効にする
  • サービスアカウントを作って、鍵ファイルをダウンロードする
  • composer require spatie/laravel-google-calendarでパッケージ導入
  • php artisan vendor:publish --provider="Spatie\GoogleCalendar\GoogleCalendarServiceProvider"で設定ファイルを持ってくる
  • 鍵ファイルを適当なところに設置して、設定ファイルを編集する
<?php

return [

    'default_auth_profile' => env('GOOGLE_CALENDAR_AUTH_PROFILE', 'service_account'),

    'auth_profiles' => [

        /*
         * Authenticate using a service account.
         */
        'service_account' => [
            /*
             * Path to the json file containing the credentials.
             */
            'credentials_json' => resource_path('credential/google_key.json'),
        ],

        /*
         * Authenticate with actual google user account.
         */
        'oauth' => [
            /*
             * Path to the json file containing the oauth2 credentials.
             */
            'credentials_json' => resource_path('credential/google_secret.json'),

            /*
             * Path to the json file containing the oauth2 token.
             */
            'token_json' => resource_path('token/oauth-token.json'),
        ],
    ],

    /*
     *  The id of the Google Calendar that will be used by default.
     */
    'calendar_id' => env('GOOGLE_CALENDAR_ID'),
];
niisanniisan

動作確認

カレンダーを取得するコマンド作る
calendar_app/app/Console/Commands/Calendar/EventGet.php

<?php

namespace App\Console\Commands\Calendar;

use Carbon\Carbon;
use Illuminate\Console\Command;
use Spatie\GoogleCalendar\Event;

class EventGet extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'calendar:event-get';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $events = Event::get(
            Carbon::now(),
            Carbon::now()->addWeek(),
            [],
            '**********@example.com'
        );
        foreach ($events as $key => $event) {
            echo "$key 個目-------------\n";
            echo $event->startDateTime . '~' . $event->endDateTime ."\n";
            echo $event->name . "\n";
            echo "----------------------\n";
        }
        return 0;
    }
}

ちゃんと動くことを確認してみる

# php artisan calendar:event-get
0 個目-------------
2021-01-07 10:00:00~2021-01-07 11:00:00
おしごとしちゃうよー
----------------------
1 個目-------------
2021-01-07 15:00:00~2021-01-07 16:00:00
おやつの時間
----------------------
niisanniisan

やりたいこと

  • ユーザのGoogle Calendar と連携して、予定を確認したい
  • アプリ内で決まった予定を、カレンダーに突っ込みたい

課題

  • ユーザはサービスアカウントに自分の予定を公開できるように設定しないといけない
  • 普通、別の人のカレンダーを見たり編集したりすると、申請が相手に飛んで、その申請から設定画面に行ける
  • 現状、サーバから申請を飛ばす方法がわからん。ないかも?

OAuth使って許可してもらえばいいんか?
これ、やったことないからわからんのよね。