SyntaxHighlighter

2022年1月28日金曜日

API による Microsoft Teams のステータスメッセージの取得/設定

API による Microsoft Teams のステータスメッセージの取得/設定

Microsoft Teams では、ステータスメッセージを設定することができます。

今回は、これをスクリプト経由で設定する方法について記載しようと思います。

Graph API でできる範囲

2022年1月現在、 Teams の Microsoft Graph REST API では、 ユーザーのプレゼンス情報の取得/設定ができます。
この API では、 availability, activity の取得/設定がサポートされており、 Python スクリプトなどで自由に設定することができます。

しかし、 beta 版も含め、ステータスメッセージの取得/設定は現状サポートされていないようです。

Teams アプリ、Teams Web アプリと同様の方法でのアクセス

そこで、公開されていない API を用いてアクセスすることになります。

結論としては、下記の情報で OAuth2 のアクセストークンを取得し、後述する URL に POST, PUT することで、ステータスメッセージの取得/設定することができます。
これは、原則として、 Teams アプリや Teams Web アプリが行っている方法と同様と思われます。

OAuth2 情報

OAuth2 のアクセストークンは、下記の情報で取得を行います。

Client ID
1fec8e78-bce4-4aaf-ab1b-5451cc387264
Client Secret
Public Client なので不要
Redirect URI
https://login.microsoftonline.com/common/oauth2/nativeclient
Scope
https://api.spaces.skype.com//.default

なお、上記の Client ID は、 Teams のデスクトップアプリの ID になっています。
また、 Client Secret, Redirect URI は、いずれも Public Client の設定になっています。
Scope の .default の前にスラッシュが二つありますが、 Microsoft のページによると、これで正しいようです。
(ただ、スラッシュが一つでも問題なく動いてはいるようでした。)

ステータスメッセージの取得

ステータスメッセージの取得は、下記の URL に JSON データを POST することで実現できます。

送信するデータの中の "mri" に設定している GUID は、 Graph API で取得できるユーザー情報の中の id のことです。
8:orgidPublicDirectoryParticipantPrefix と呼ばれるもののようで、固定値でよいようです。

URL
https://presence.teams.microsoft.com/v1/presence/getpresence/
HTTP Method
POST
Body として送信する JSON データ
1
2
3
4
[
    {"mri": "8:orgid:01234567-89ab-cdef-0123-456789abcdef"},
    {"mri": "8:orgid:76543210-89ab-cdef-0123-456789abcdef"}
]

上記を送ると、指定したユーザー分のステータスメッセージを含むユーザー情報が返ってきます。

ステータスメッセージの設定

自分のステータスメッセージの設定は、下記の URL に JSON データを PUT することで実現できます。

メッセージと有効期限を指定し、設定することができます。

URL
https://presence.teams.microsoft.com/v1/me/publishnote
HTTP Method
PUT
Body として送信する JSON データ
1
{"message":"Status Message","expiry":"2022-01-28T14:59:59.999Z"}

なお、 "message" の末尾に <pinnednote></pinnednote> を追加すると、「他のユーザーが自分にメッセージを送るときに表示する」にチェックした状態になるようです。

Python での実装例

最後に、 Python を用いてステータスメッセージを設定する例を書いておこうと思います。

Windows 上で簡易的に OAuth2 を扱えるようにした msal-interactive-token-acquirer と、 HTTP アクセスで広く使われている requests を用いた場合、以下のようになります。

なお、これは個人の Microsoft アカウントではなく、組織の Microsoft アカウントで行う必要があります。
個人で試す場合は、 Microsoft 365 開発者プログラムなどを活用するとよいと思います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from datetime import date
from msal_interactive_token_acquirer import MsalInteractiveTokenAcquirer
from msal_interactive_token_acquirer.requests import MsalSession
 
tenant = "common"
client_id = "1fec8e78-bce4-4aaf-ab1b-5451cc387264"
msal = MsalInteractiveTokenAcquirer(tenant, client_id, scopes)
msal.acquire_token_interactively()
session = MsalSession(msal)
expiry = date.today().strftime("%Y-%m-%dT14:59:59.999Z"# This means YYYY-MM-DDT23:59:59.999+09:00
message = "Sample Message"
# message += "<pinnednote></pinnednote>"  # 「他のユーザーが自分にメッセージを送るときに表示する」にチェック
data = {"message": message, "expiry": expiry}
res = session.put(url, json=data)
print(res)