Outlookカレンダー情報を取得する（Laravel）

## 始めに
Outlookのカレンダー情報を取得する機能を、Graph API, Laravel（PHP）を用いて
実装したので、備忘録として残します。

## 環境
| 開発環境    |バージョン |
|-----------|------------|
| __Laravel__ | 8.83.19 |
| __PHP__     | 7.3.10  |

## 準備すること
・Microsoft365アカウントは持っている前提とします。
・お試し開発環境を作成したい方はこちらから作成できます。（たしか期間３か月）
　( https://developer.microsoft.com/en-us/microsoft-365/dev-program )
・HTTPリクエスト等の検証は「Postman」がおすすめ

## 手順概要
__Azureコンソール画面__
__1.__ アプリを登録する
__2.__ アプリ情報を設定する（APIアクセス許可）
__3.__ カレンダー情報取得に必要な情報をメモする

__実装__
__4.__ SDKをインストールする
__5.__ アクセストークンを取得する
__6.__ カレンダー情報（イベント）を取得する

## 1.アプリを登録する

画像に沿ってアプリを登録します。

![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/aca8c064-ef2a-bc40-7466-ddccbac06712.png)

![1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/c02ff890-b5e5-c22d-85f3-bffbff169a57.png)

![1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/7fee49ac-0b6f-4b81-55fa-6ef7380a5a5c.png)

## 2.アプリ情報を設定する（APIのアクセス許可）
画像の手順に沿ってアプリ情報を設定していきます。（APIのアクセス許可）

![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/fa39a893-9a0e-8c3c-ae6d-42ec9b82222d.png)

![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/82cb8216-f93d-e453-719d-ace157702415.png)

![2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/6ebdf9de-ff9a-b55b-8593-7c2d4d2dbde9.png)

![2-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/957ea6ca-9fc0-5ddd-6b1b-b5b3255f7f6e.png)

![2-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/cb283bb0-10e6-6b9b-0aa0-023acae0a3b6.png)

![2-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/96e95e31-548e-33b7-565d-e9b88310f210.png)

## 3.カレンダー情報取得に必要な情報をメモする
画像に沿ってアクセストークン取得に必要な情報をメモします。

![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/3865dc18-0d13-11bb-2406-166a2d62264e.png)

![3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/ffc68602-9166-76e9-40ad-1e7671ce7598.png)

![3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/c9d2e4a3-a92f-cbee-b54f-e8fd98366e55.png)

![3-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/b43fdf71-ba69-6636-8c96-ee29397f8037.png)

![3-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/4e20f3b9-06b5-0588-3b0c-0ee95bd22ebd.png)

__※クライアント シークレットの値は、一度しか表示されませんので注意してください。__
![3-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984846/cfd4a633-c451-be5f-c7d4-04c5eb877ab0.png)

## 4.SDKをインストールする
Microsoft Graph PHP SDK をインストールします。
```ターミナル:
composer require microsoft/microsoft-graph
```
https://learn.microsoft.com/ja-jp/graph/sdks/sdk-installation#install-the-microsoft-graph-php-sdk

## 5.アクセストークンを取得する
```php:CalendarController.php
use Illuminate\Support\Facades\Log;
use Microsoft\Graph\Graph;

/**
* Outlookカレンダーからイベント情報を取得する
*/
public function getOutlookCalendarEvent()
{
    Log::debug(__FUNCTION__);

    // 初期設定
    $tenant_id     = 'テナントID'
    $client_id     = 'クライアントID'
    $client_secret = 'クライアントシークレット'
    $user_id       = 'ユーザー情報';

    // guzzleインスタンス生成
    $guzzle = new \GuzzleHttp\Client();

    // URIを作成する
    $url_access_token = 'https://login.microsoftonline.com/'.$tenant_id.'/oauth2/v2.0/token';

    // アクセストークンを取得する
    $token = json_decode($guzzle->post($url_access_token, [
        'form_params' => [
            'client_id'     => $client_id,
            'client_secret' => $client_secret,
            'scope'         => 'https://graph.microsoft.com/.default',
            'grant_type'    => 'client_credentials',
        ],
    ])->getBody()->getContents());
    $accessToken = $token->access_token;

    // Graphインスタンスを生成する
    $graph = new Graph();
    $graph->setAccessToken($accessToken);

    ーー 省略 ーー
}
```

## 6.カレンダー情報（イベント）を取得する
https://learn.microsoft.com/ja-jp/graph/api/event-get?view=graph-rest-1.0&tabs=java
```php:CalendarController.php
use Illuminate\Support\Facades\Log;
use Microsoft\Graph\Graph;

**
* Outlookカレンダーからイベント情報を取得する
* 
*/
public function getOutlookCalendarEvent()
{

    ーー 省略 ーー

    // Graphインスタンスを生成する
    $graph = new Graph();
    $graph->setAccessToken($accessToken);

    // 取得したい日時範囲を設定する
    $dateTimeStart = "'2023-02-10T00:00:00'";
    $dateTimeEnd   = "'2023-02-10T23:59:59'";
    $url_time_filter = "?".'$filter'."=start/dateTime+ge+"."$dateTimeStart"."+and+end/dateTime+le+".$dateTimeEnd;

    // 取得したい値のキーを設定する
    $url_select      = '$select'."=subject,id,bodyPreview,start,end";

    // URIを作成する
    $url_calendar    = "/users/".$user_id."/events".$url_time_filter."&".$url_select;
    // $url_time_filter, $url_selectは、オプションなので /events まででも取得できます。

    // イベント情報を取得する
    $event  = $graph->createRequest("GET", $url_calendar)->addHeaders(["Prefer" => 'outlook.timezone="Tokyo Standard Time"'])->execute();
    $events = $event->getBody();

    Log::debug($event);
}
```

## 終わりに
テクニカルサポートは外国の方が対応となります。
正直言って、素晴らしい対応をしてくださいます。本当にありがたいです。
テクニカルサポートとのやり取りは基本英語です。
頼めば、メールは日本語に訳してく送ってくれます。
しかし、電話、Teams通話（画面共有あり）の場合は英語のみとなります。

最後まで閲覧ありがとうございます。
ご指摘、意見ありましたら、コメントお願いいたします。