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

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74571/5746e807-3381-1d53-7c13-80721f62f35c.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 のエンドポイントで取得したアクセストークンのみ利用可能**ということ。

<img width="842" alt="貼り付けた画像_2020_04_07_2_26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74571/31d91deb-2244-9147-7bd0-4f41055cfe84.png">

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

* https://github.com/jeffcarbs/omniauth-office365 →シングルテナントのエンドポイントに対応していない
* https://github.com/KonaTeam/omniauth-azure-oauth2 →シングルテナントのエンドポイントには対応しているが、v2.0のエンドポイントに対応していない

ということで、2020年４月現在はまともに使えるライブラリがない。
（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はどこを見たらわかるのか？

そんなときはここを見ればいい
<img width="1073" alt="貼り付けた画像_2020_04_07_2_44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74571/823208a2-d5b8-efc9-62e1-f90cab93dc58.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できました。
<img width="1013" alt="貼り付けた画像_2020_04_07_2_56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74571/1affa811-9657-dd9f-4d74-d6a732ef6d57.png">


## まとめ

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