Microsoft Teamsは、Slackに比べると、APIドキュメントのレベルが非常に低く、意味不明。
ユーザとしてメッセージを送りたいと思ったときに
https://docs.microsoft.com/ja-jp/graph/api/channel-post-messages?view=graph-rest-beta&tabs=http
こいつにぶち当たると思うんだけど、書いてないことが山ほどあったのでメモ。
認証トークンはどこからもらってこればいいのか?
OAuthアプリケーション登録して、アクセストークンもらってくる必要があるらしい。
パーソナルアクセストークンとかそういうイケてる仕組みは無い。
OAuthアプリケーション登録
https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade
からアプリケーション登録する。
登録の際には、スコープに要注意
| 操作 | 必要な権限 | APIドキュメントURL |
|:---|:-----|:----|:-----|
|チャネル一覧取得|Group.Read.All | https://docs.microsoft.com/ja-jp/graph/api/channel-list?view=graph-rest-beta&tabs=http |
|チャネルのメッセージ一覧取得 |ChannelMessage.Read.All | https://docs.microsoft.com/ja-jp/graph/api/channel-list-messages?view=graph-rest-beta&tabs=http|
|チャネルのメッセージの返信一覧取得 |ChannelMessage.Read.All | https://docs.microsoft.com/ja-jp/graph/api/channel-list-messagereplies?view=graph-rest-beta&tabs=http|
|チャネルにユーザメッセージを送信|Group.ReadWrite.All | https://docs.microsoft.com/ja-jp/graph/api/channel-post-messages?view=graph-rest-beta&tabs=http |
|チャネルのメッセージに返信|Group.ReadWrite.All | https://docs.microsoft.com/ja-jp/graph/api/channel-post-messages?view=graph-rest-beta&tabs=http |
Slackと違って、Microsoft Teamsは気軽にユーザとしてメッセージをPOSTすることはできなくて、管理者の承認が必要だ。
管理者権限なしでできるのは、特定のチャネルのメッセージを取得することだけ。使えね〜〜〜!!
(APIでPOSTするものは基本的にボットとしてIncoming Webhookとか使えっていうことなんだろうけど...)
とりあえず
ここまで権限がもらえたら、TeamsのチャネルのユーザーメッセージをAPIで操作することができる。
Authorize, Token
手っ取り早くトークンだけ欲しい場合には、手動で
https://login.microsoftonline.com/テナントID/oauth2/v2.0/authorize?client_id=クライアントID&client_secret=シークレット&response_type=token&scope=Group.ReadWrite.All%20User.Read
をブラウザに打ち込めばいい。response_type=token を指定してるのがポイント。
アクセストークンやリフレッシュトークンがそのままクエリパラメータとして返される。
由緒正しくOAuthフローを実行したい場合には、 response_type=code 指定する。
ここで、唯一にして最大の気をつけないといけないポイントは、TeamsのAPIはv2.0 のエンドポイントで取得したアクセストークンのみ利用可能ということ。
手でAPIを直接たたくには間違わないだろうけど、たとえばRailsでomniauthを使うときには要注意。
- https://github.com/jeffcarbs/omniauth-office365 →シングルテナントのエンドポイントに対応していない
- https://github.com/KonaTeam/omniauth-azure-oauth2 →シングルテナントのエンドポイントには対応しているが、v2.0のエンドポイントに対応していない
ということで、2020年4月現在はまともに使えるライブラリがない。
(omniauth-azure-oauth2のソースコードをちょっと書き換えて無理やり /v2.0/
にしてやれば動くかもしれないが、未検証)
ちなみに、v1のエンドポイントで発行したアクセストークンを使うと、以下のような何の手がかりもないエラーになる。
{
"error": {
"code": "InvalidAuthenticationToken",
"innerError": {
"date": "2020-04-06T16:34:03",
"request-id": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx"
},
"message": "Access token validation failure. Invalid audience."
}
}
チームIDとチャネルIDはどこを見たらわかるのか?
API自体は比較的きれいなREST APIなんだけど
POST /teams/{id}/channels/{id}/messages/{id}/replies
のidはどこを見たらわかるのか?
チームID: groupId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
っていうパラメータ
チャネルID・メッセージID: https://teams.microsoft.com/l/message/チャネルID/メッセージID?tenantId=...
(チャネルIDは @
を含んでることがある、ごちゃっとした文字列。 メッセージIDは単純な数字)
いざPOST
ここまでくれば、あとはいつもどおり Authorization: Bearer トークン
を指定して、REST APIコールするだけ・・・と思ったが、、
APIドキュメントには
POST /teams/{id}/channels/{id}/messages/{id}/replies
とかいてあるが、そのとおりにPOSTすると
{
"error": {
"code": "ResourceNotFound",
"innerError": {
"date": "2020-04-06T17:46:30",
"request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"message": "Invalid version: teams"
}
}
こんなエラーになる。
正しくは /beta/teams/{id}/channels/{id}/messages/{id}/replies
(ノ`Д´)ノ彡┻━┻ (ノ`Д´)ノ彡┻━┻ (ノ`Д´)ノ彡┻━┻
というわけで、Slackの1000000000000000000000000倍くらい面倒なステップを踏んでようやくユーザメッセージをAPIでPOSTできました。
まとめ
Microsoft Teamsなんて使わずにSlack使いましょう。