プリザンターをPowerShellで監視してslackに通知してみる


概要

プリザンターでレコードの作成忘れを防止するためにpowershellでサイトを監視して、slackに通知してみました。

たとえば・・・

こんな感じで毎日の作業報告をプリザンターで行っていて、当日中にかならず作成して報告する必要がある。

作成忘れを防止するためになにかしらの通知がほしい・・・
といったときを想定します

前提条件

  • OS:Windows
  • プリザンター:.NetFrameWork版

APIキー作成

あらかじめAPIキーを作成しておきます
https://pleasanter.net/fs/publishes/422358/edit

準備

プリザンターは.NetFrameWork版を使っている人が多いと思うので
今回はPowerShellで作成してみました。

プログラム作成はWindows標準のISEが便利です
ファイル名を指定して実行で ISE と打つと実行できます

サンプルソース

このソースではプリザンターの日付A(DateA)が当日のものをAPIで検索しています

PowerShellからslackの投稿についてはこちらを参考にさせていただきました。
https://qiita.com/suo-takefumi/items/738793e2e426f52d7d42


#リクエストURL
$requestUrl = "http://[プリザンターのサイトアドレス]/api/items/[チェックしたいサイトID]/get"
$apiKey = "[作成したAPIキー]"

#現在の日付を取得
$ndate = Get-Date -Format "yyyy/MM/dd"

#日付の検索条件(当日0:00:00~23:59:59)
$datehash = "[`"" + $ndate + " 0:00:00," + $ndate + " 23:59:59.997" + "`"]"

#プリザンターAPIでサイトのレコードを検索
trap [Net.WebException] { continue; }
try
{   
    $json = @{
        ApiKey = $apiKey
        View = @{
        ColumnFilterHash = @{
            DateA = $datehash
            }
        }
    }

    $requestBody = $json | ConvertTo-Json -Depth 3
    $res = Invoke-RestMethod -Uri $requestUrl -ContentType "application/json" -Method POST -Body ${requestBody}
}
catch
{
    Write-Output $_.Exception
}

#レコードが作成されていたらここで終了
if ($res.Response.TotalCount -gt 0 ) {
    exit
}

#投稿したいメッセージ
$postmsg = "http://[プリザンターのサイトアドレス]/pleasanter/items/[チェックしたいサイトID]/index" + "
作業報告がおわっていません!";

#slackへメッセージ投稿
trap [Net.WebException] { continue; }
try
{   
    $webhook = "[slackのwebhookURL]"
    $slackmsg = @{ 
        channel = "[slackのチャンネル]"
        text = $postmsg
    }
    $json = ConvertTo-Json $slackmsg
    $requesttBody = [System.Text.Encoding]::UTF8.GetBytes($json)
    $res = Invoke-RestMethod -Uri $webhook -Method Post -Body ${requestBody}
}
catch
{
    Write-Output $_.Exception
}

実行すると


といった形で通知がとどきます

タスクスケジューラで監視

.ps1形式でソースを保存して、Windowsのタスクスケジューラで定時実行します・・・が、
ポリシーの設定などが面倒です。こちらを参考にさせていただきました。
https://qiita.com/happy_packet/items/bb952626aef7323f49b2
https://www.atmarkit.co.jp/ait/articles/1412/03/news125.html

Windowsタスクスケジューラから「タスクの作成」を選んで作成します

全般タブ

タスクに適当な名前をつけます

トリガータブ

16:00~17:00まで10分おきに監視する場合の設定例です

操作タブ

以下のように設定するとうまくいくようです。
参考元の記事に感謝します。

項目 設定値
プログラム/スクリプト %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加 -ExecutionPolicy RemoteSigned -File "[ps1のファイルフルパス]"
開始 空白

確認

タスクが作成されているか確認

これで 16:00~17:00 まで10分間隔でサイトを監視して
日付Aが当日のレコードが作成されていない場合にslackに通知が来ます。

さいごに

いかがでしたでしょうか?

プリザンターにはリマインダーや通知といった素敵な機能が盛り込まれていますが
こうやってAPIを使って外から簡単に監視できるのも魅力の1つだと思います。