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

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

たとえば・・・
![2020-12-11_22h34_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/0993d39a-5270-6e27-5cce-99e47b6b6146.png)
こんな感じで毎日の作業報告をプリザンターで行っていて、当日中にかならず作成して報告する必要がある。

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

#前提条件

- OS：Windows
- プリザンター：.NetFrameWork版

#APIキー作成

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

#準備

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

プログラム作成はWindows標準のISEが便利です
ファイル名を指定して実行で ISE と打つと実行できます
![2020-12-11_22h59_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/9f11999c-31a4-7736-5c34-ea79a2a9c246.png)

#サンプルソース

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

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




```PowerShell

#リクエスト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
}

```

実行すると

![2020-12-12_00h58_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/8cb64394-5ecd-bee2-5d75-645cc5fce2e9.png)
といった形で通知がとどきます

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

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

Windowsタスクスケジューラから「タスクの作成」を選んで作成します
![2020-12-12_00h46_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/c68569e3-be2d-0623-3ab9-b1934823e9c0.png)

###全般タブ

タスクに適当な名前をつけます
![2020-12-12_00h45_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/17940962-4026-8fa3-5f1f-7122cf0c5d6a.png)

###トリガータブ

16:00～17:00まで10分おきに監視する場合の設定例です
![2020-12-12_00h42_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/318ab26d-7b9b-42b8-a673-c14a654311fc.png)

###操作タブ

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

![2020-12-12_00h41_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/f99d2833-4f8d-72c0-9a8f-0632b453f3eb.png)


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


###確認

タスクが作成されているか確認
![2020-12-12_00h49_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/c30ba6f8-c7a6-175c-3145-e0bada312cb4.png)

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

#さいごに

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

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