Microsoft Teamsのプレゼンスから部下がサボってないか監視しよう!~ 永続的なアクセストークンの取得 ~

【目次】Teamsプレゼンス可視化ツール

0. プロローグ 1. 永続的なアクセストークンの取得 2. プレゼンスの取得 3. エクセルで可視化
4. PowerAutomate Desktopで定期実行 5. Pythonで実装 6. 完全自動化Pythonプログラム  

Teamsプレゼンスを定期的に取得するためにはMicrosoft Graph APIを利用します。Microsoft Grap APIは認証にAzure ADが発行したアクセストークンを利用します。アクセストークンには有効期限があり、有効期限が切れた場合はリフレッシュトークンを使用してアクセストークンを再発行する必要があります。

Microsoft IDプラットフォームで構成可能なトークンの有効期限

アクセス トークンは取り消すことはできず、有効期限まで有効です。 アクセス トークンの既定の有効期間は、変数です。 発行されると、アクセス トークンの既定の有効期間には、60 分から 90 分 (平均 75 分) の範囲のランダムな値が割り当てられます。

Microsoft IDプラットフォームの更新トークン

クライアントは保護されたリソースにアクセスするためのアクセス トークンを取得するときに、更新トークンも受け取ります。 更新トークンを使用して、現在のアクセス トークンの有効期限が切れたときに、新しいアクセス トークンと更新トークンのペアを取得します。

さて、ここで早速、壁にぶち当たります。リフレッシュトークンを利用した永続的なトークンの発行はその組織の管理者がAzure Portalからアプリとして登録をする必要があります。

Microsoft IDプラットフォームにおけるOAuth2.0プロトコルとOpen ID Connectプロトコル

個人用アカウントと職場や学校のアカウントの両方を受け付けるアプリはすべて、Azure portal のアプリの登録 エクスペリエンスを通じて登録する必要があります。登録後、OAuth 2.0 または OpenID Connect を使用して、それらのユーザーをサインインさせることができます。

今回作りたいのはこっそりTeamsのプレゼンスを取得してサボってないかの監視です。通常、Azure Portalにアプリを登録できるのは情報システム部であり且つ、会社としてオフィシャルなアプリだけです。いくら組織長だからといって社員を監視したいので独自のアプリを登録することは出来ません。

永続的なアクセストークンの取得はGraphエクスプローラーを使用

Microsoft Graph APIはブラウザから簡単にお試し利用が出来るGraphエクスプローラーというのが用意されています。よくREST APIが提供されているサービスのSwagger UIのマイクロソフト版といったところです。

このGraphエクスプローラーは以下の画面から有効なアクセストークンを表示することができます。このアクセストークンをコピーして再利用することで永続的なMicrosoft Graph APIへのアクセスを実現するわけです。

右上の「Access token」をクリックすると現在有効なアクセストークンが表示されるのでこれをもらってきます。

アクセストークンはPower Automate Desktopのブラウザ自動操作で取得

ブラウザの決まった動作はPower Automate Desktopで実現します。実装手順は以下の通りです。

Power Automate Desktopを起動して「新しいフローを作成」をクリックします。すると上の画面になりますので適当に名前を付けます。今回は「presence_flow」とします。作成をクリック。

続いて左のアクションの中から「新しいMicrosoft Edgeを起動する」を選択します。

各項目はこのようにします。初期URLはGraphエクスプローラーのURLにします。

続いてGraphエクスプローラーに表示されているアクセストークンをコピーします。この動作はPower Automate Desktopのレコーダー機能を使用します。このレコーダー機能はかなりコツが必要で、この画像のようにレコーダー機能画面とブラウザを並べて操作を記録していくと比較的うまくいきます。

まず初めにレコーダーの記録ボタンを押します。

 

続いて「Acces token」タブをクリックします。レコーダーにはこの動作のまま記録されていきます。

続いてアクセストークンが表示されている領域をクリックします。すると自動で要素を特定して選択状態になります。

この状態で右クリック→「要素の値を抽出」→「テキスト:」をクリックします。

するとアクセストークンが「innertext」という変数に格納されます。

最後に「Webブラウザを閉じる」アクションを入れて終了です。この例ではアクセストークンは変数に入れているだけですが、ファイルに保存することで使いまわしも可能です。

出来上がった一連のアクションを「get_token」という名前でサブフローとして登録します。

今回はここまで。次回はMicrosoft Graph APIを使用して部下のプレゼンスを取得します。