LoginSignup
17
26

More than 3 years have passed since last update.

Microsoft Teamsでチャネルのメッセージの取得、ユーザメッセージの送信

Last updated at Posted at 2020-04-06

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とか使えっていうことなんだろうけど...)

とりあえず
image.png
ここまで権限がもらえたら、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 のエンドポイントで取得したアクセストークンのみ利用可能ということ。

貼り付けた画像_2020_04_07_2_26.png

手でAPIを直接たたくには間違わないだろうけど、たとえばRailsでomniauthを使うときには要注意。

ということで、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はどこを見たらわかるのか?

そんなときはここを見ればいい
貼り付けた画像_2020_04_07_2_44.png

チーム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できました。
貼り付けた画像_2020_04_07_2_56.png

まとめ

Microsoft Teamsなんて使わずにSlack使いましょう。

17
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
26