LoginSignup
7
8

More than 5 years have passed since last update.

PowershellでMattermost APIを使ってみた時のメモ

Posted at

はじめに

お堅い会社で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系もいくつか試したので、落ち着いたら更新します

7
8
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
7
8