PowerShellからSlackに通知する方法が投稿されていたので、出社・退社をログオン・ログオフでSlackに記録したいなー。
手動でSlackに入れていたら見事に3日坊主でした。
PowerShellの準備
動作環境は
【メモ】PowerShell書き始めるまで
使用するプログラムは
PowerShellからSlackに通知する方法
で紹介されているままのプログラムでOK。
最初は固定メッセージで2個作ってましたが、登録時にパラメーターを設定できるので引数でメッセージを変えられます。
ログオン・ログオフ時の登録
調べればすぐに出ますが…
- スタートメニューからポリシーで検索
- グループポリシーの編集
- ユーザーの構成
- Windowsの設定
- スクリプト(ログオン/ログオフ)
- 右窓のログオン/ログオフをダブルクリック
- ログオン/ログオフのプロパティ
- PowerShellスクリプト タブ
- 追加
- スクリプト名:参照から作成したプログラム
- スクリプトのパラメーター:通知したいメッセージ
- Windowsの設定
Slack APIを使用する
Slackに通知はできたが、Incoming WebHooksでは(名前を同じにしても)BOTが行った通知になってしまう。
できれば既存のユーザーが通知したことにしたい。
調べたら2月頃にSlack APIにas_user
なるオプション追加が追加されたらしい。
任意のユーザーではなく、「Slack APIのトークンを発行したユーザー」として通知できるらしい。
全員で使うには全員がトークン発行しなければならない……
トークンの発行は権限に関係なくできるのかな?(未調査)
まぁ、今は一人なので無問題ですが。
トークンのとーろく
Slack APIを使ってプッシュ通知を受け取ろう
を見てその通りに。
- IntegrationsからSlack APIを選択
- 左メニューからWeb APIを選択
- 最下層にトークン発行ボタン「Create token」があるのでおもむろにクリック
Slack APIに飛んだらSlack APIの説明画面でちょっと面食らいます。
トークン発行もその画面で出来ないので慌ててぐぐりました。
TOPIC:chat.postMessage
のテスト
slackに通知する主機能?なchat.postMessage
のドキュメントから動作テストのページに飛べます
トークン発行後なら実際にSlackへ通知することができるので、どんな動作やURLになるかなど、軽い検証ができます。
Slack API PawerShell
Slack APIになり、メソッドがPOST
からGET
になりました。
よって、パラメーターはJSONからURLに付加する形になります。
$utf8Bytes = [System.Text.Encoding]::UTF8.GetBytes($args)
$text = [System.Text.Encoding]::GetEncoding('UTF-8').GetString($utf8Bytes);
$channel = "xxx" # #ramdom
$token = "xxx"
$text = [System.Web.HttpUtility]::UrlEncode($text)
Invoke-RestMethod -Uri "https://slack.com/api/chat.postMessage?token=$token&channel=$channel&as_user=true&text=$text" -Method Get
参考にしたIncoming WebHooks版と比較して、
- 入力をURLエンコードしている
- バイト文字列から文字列への変換時のコードを
ISO-8859-1
からUTF-8
に変更
2に関してはなぜこうしなければならないのか、が最初のUTF-8
バイト文字列での取得から理解していないので調査しておきます。
ISO-8859-1
では文字化けが起こりました。
Slack API版はシェル上では成功してますが、ログオン・ログオフ時の動作は未検証です。明日にでも問題なくこの文章を消せたらいいな。
追記
今さらですが、うまく動いています。
BOT表記もなくなっているので、見た目では自分が発言しているように見えます。
ただし、環境によっては(スタートアップ量?)PowerShellの実行優先度が低いのか、ログインから数分以上あとに発言されることも…
Slack上では遅刻魔に!みたいなこともあるかもしれません。
今は毎回同じメッセージなので、複数のパラメーターを渡してランダムに通知してくれるようにしたい。