はじめに
お堅い会社でSlackとか使えず、でもみんなで使えるチャットが欲しく今更ながら担当でMattermostを導入してみた
で、今更お気に入りのPowershellでAPIをたたいてみた時のメモ。コピペしてIPアドレスとかを変更すれば試せるかと思います
(いい加減な人間なのでエラーハンドリングとかは適当です)
ユーザ情報を取得する
ログインIDとパスワードを使ってトークンを取得し、さらに/usersの情報をGET
ConvertFrom-Jsonを使えば、取得したデータの利活用がめっちゃラク
$ipaddress = "<Mattermostサーバ>"
$port = "<Mattermostサーバポート番号>"
$apiversion = "v4"
$loginid = "<ログインID>"
$password = "<パスワード>"
$uri = "http://" + $ipAddress + ":" + $port + "/api/" + $apiversion
$loginendpoint = $uri + "/users/login"
$usersendpoint = $uri + "/users"
$logindata = @{"login_id" = $loginid; "password" = $password}
# ログイン
$json_login = ConvertTo-Json $logindata
$res = Invoke-WebRequest -Uri $loginendpoint -Method Post -Body $json_login
if($res.StatusCode -ne "200"){
Write-Debug "Statusが" + $res.StatusCode + "のため終了"
exit
}
# トークンを取得
$token = $res.Headers.Token
$res = ""
# 現在の状況を確認する
$res = Invoke-WebRequest -Uri $usersendpoint -Method Get -Headers @{"Authorization" = "Bearer $token"}
# 文字コード変換
$con = [System.Text.Encoding]::Utf8.GetString([System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($res.Content))
# PSCustomObjectに変換
$users = ConvertFrom-Json $con
# 1人目のIDを抽出する
Write-output $users[0].id
動かしてみてわかったこと
- APIリファレンス読めばすぐわかるが、APIアクセス負荷を軽減するため、同時アクセス制限(RateLimit)が設定されているので注意
途中でStatus500のInternal Server Errorが返って???となっていた - これもAPIリファレンス読めばすぐわかるが、一度に取得可能なユーザ数はデフォルトで60となっている。
各ユーザのステータスを表示させる
各ユーザのステータス(プレゼンス情報)を取得して、大型ディスプレイに在席一覧を表示させるなどに使えそう
$ipaddress = "<Mattermostサーバ>"
$port = "<Mattermostサーバポート番号>"
$apiversion = "v4"
$loginid = "<ログインID>"
$password = "<パスワード>"
$uri = "http://" + $ipAddress + ":" + $port + "/api/" + $apiversion
$loginendpoint = $uri + "/users/login"
$usersendpoint = $uri + "/users"
$logindata = @{"login_id" = $loginid; "password" = $password}
# ログイン
$json_login = ConvertTo-Json $logindata
$res = Invoke-WebRequest -Uri $loginendpoint -Method Post -Body $json_login
if($res.StatusCode -ne "200"){
Write-Debug "Statusが" + $res.StatusCode + "のため終了"
exit
}
# トークンを取得
$token = $res.Headers.Token
# 現在の状況を確認する
$res = Invoke-WebRequest -Uri $usersendpoint -Method Get -Headers @{"Authorization" = "Bearer $token"}
# 文字コード変換
$con = [System.Text.Encoding]::Utf8.GetString([System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($res.Content))
# PSCustomObjectに変換
$users = ConvertFrom-Json $con
# ユーザのステータスを抽出する
$usersstatus = @{}
foreach($user in $users){
$statusendpoint = $usersendpoint + "/" + $user.id + "/status"
$res = Invoke-WebRequest -Uri $statusendpoint -Method Get -Headers @{"Authorization" = "Bearer $token"}
$con = [System.Text.Encoding]::Utf8.GetString([System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($res.Content))
$status = ConvertFrom-Json $con
$usersstatus.Add($user.username, $status.status)
}
# ユーザのステータスを表示する
$usersstatus
動かしてみてわかったこと
- 同じく高頻度でアクセスするとRateLimitに引っかかるので適度にスリープを入れる必要がある
おわりに
POST、PUT、DELETE系もいくつか試したので、落ち着いたら更新します