Home > Windows にまつわる e.t.c.

PowerShell で Slack にメッセージを送信する


自作スクリプトで、エラーとかのイベントログをメールで通知していたのですが、メールサーバーのダウン対策で Slack にもメッセージ送信するようにしました

その際の設定についてまとめました

 

今回は、「message-test」チャンネルに PowerShell でメッセージを送信してみます

 

トークンの生成は Web UI で操作するので、まずは Web ブラウザで Slack にログインします

参考までに、Windows デスクトップアプリメインでを使用していて Web 版 Slack を使っていない方向けに Web 版 Slack の URL 取得方法です
URL は「右肩のハンバーガーメニュー > コピー > リンクをコピー」で URL がコピーできますので、こちらから Web 版の Slack にアクセスしてください
(スマデ アプリからの URL は調べていません)

 

アプリケーションの作成

Web ブラウザで Slack にログインしたら、Slack API にアクセスし、Slack にアプリケーションを作成します

Slack API: Applications
https://api.slack.com/apps

 

Create New App でアプリケーションを作成

 

From scratch を選択

 

アプリケーション名と、メッセージを送信するワークスペースを指定し Create App

 

トークンの生成

アプリケーションが作成出来たら、トークンの生成をします

OAuth & Permissions を開き...

 

スクロールダウンして Scopes セクションを開き Bot Token Scopes の Add an OAuth Scope

 

chat:write の権限を付与

 

スクロールアップして、先頭にある Advanced token security via token rotation でワークスペースにインストールします

 

許可するとトークンが生成されます

 

生成されたトークンを Copy

 

アプリケーションをチャンネルに登録

作成されたアプリケーションをチャンネルに登録して、メッセージを送信を許可します

アプリを右クリックしてアプリの詳細を表示する

 

チャンネルにこのアプリを追加する

 

チャンネルを選択し追加

 

チャンネルにアプリが追加された

 

■ PowerShell でメッセージを送信する

PowerShell でメッセージ送信するには以下のようにします

# リクエストボディの作成
$body = @{
    token = 'Youre token'
    channel = '#message-test'
    text = 'Hello world !!'
}

# メッセージ送信
Invoke-RestMethod -Method Post -Uri 'https://slack.com/api/chat.postMessage' -Body $body

 

メッセージが送信できました

 

関数にする

関数にすると、こんな感じになります

トークンファイル「TokenFile.txt」をスクリプトディレクトに作成し、1行目にトークン、2行目にチャンネルを書いてください

必要であれば、エラー処理とかチューニングすると良いと思います

####################################
# Slack にメッセージを送る
####################################
function SendSlackMessage([string]$Message){

    # トークンファイル
    $TokenFileName = "TokenFile.txt"

    # API URI
    $ApiUri = "https://slack.com/api/chat.postMessage"

    # トークンファイルの取得
    $TokenFileFullPath = Join-Path $PSScriptRoot $TokenFileName
    if( -not (Test-Path $TokenFileFullPath)){
        return
    }

    # トークンファイルの読み込み
    try{
        [array]$TokenData = Get-Content -Path $TokenFileFullPath
    }
    catch{
        return
    }

    # トークンとチャンネルの取得
    $Token = $TokenData[0]
    $Channel = $TokenData[1]
    if(( $Token -eq $null ) -or ( $Channel -eq $null )){
        Write-Output "[ERROR] !!!!!!!! $TokenFileFullPath format error. !!!!!!!!"
        return
    }

    # リクエストボディの作成
    $body = @{
        token = $Token
        channel = $Channel
        text = $Message
    }

    # メッセージ送信
    Invoke-RestMethod -Method Post -Uri $ApiUri -Body $body
}

 

大きなメッセージをスレッドに格納する

(2025年9月16日 Update)

イベントログを Slack 通知するようにしたのですが、イベントログの XML もメッセージに出力するようにしていたので、メッセージサイズが大きくなり、複数のエラーが起き時(通常この状態)に、エラーの見通しが悪くなるので、メールみたいに Subject と body みたいな表示ができないかと模索してみました

当初折りたたみ表示ができるのではないかと思ったのですが、実現する方法が見つからず...

こんな時はと ChatGPT さんに相談したら、メッセージ本体をスレッドに入れるアイディアをもらいました

実装すると、こんな感じのメッセージになったので、目的達成できたようです

 

という事で、こんな感じに関数をアップデート
($Message を省略すると、普通にメッセージ送れます)

####################################
# Slack メッセージを送る
####################################
function SendSlackMessage([string]$Summary, [string]$Message){

    # トークンファイル
    $TokenFileName = "TokenFile.txt"

    # API URI
    $ApiUri = "https://slack.com/api/chat.postMessage"

    # トークンファイルの取得
    $TokenFileFullPath = Join-Path $PSScriptRoot $TokenFileName
    if( -not (Test-Path $TokenFileFullPath)){
        return
    }

    # トークンファイルの読み込み
    try{
        [array]$TokenData = Get-Content -Path $TokenFileFullPath
    }
    catch{
        return
    }

    # トークンとチャンネルの取得
    $Token = $TokenData[0]
    $Channel = $TokenData[1]
    if(( $Token -eq $null ) -or ( $Channel -eq $null )){
        Write-Output "[ERROR] !!!!!!!! $TokenFileFullPath format error. !!!!!!!!"
        return
    }

    # リクエストボディの作成
    $body = @{
        token = $Token
        channel = $Channel
        text = $Summary
    }

    # メッセージ送信
    $Response = Invoke-RestMethod -Method Post -Uri $ApiUri -Body $body
    if($Response.ok -ne $true){
        Write-Output "[ERROR] !!!!!!!! Slack API error. (body) !!!!!!!!"
        return
    }

    if($Message -ne [string]$null){
        # スレッド用リクエストボディの作成
        $ThreadTs = $Response.ts
        $body = @{
            token = $Token
            channel = $Channel
            thread_ts = $ThreadTs
            text = $Message
        }

        # スレッドメッセージ送信
        $Response = Invoke-RestMethod -Method Post -Uri $ApiUri -Body $body
        if($Response.ok -ne $true){
            Write-Output "[ERROR] !!!!!!!! Slack API error. (thread) !!!!!!!!"
            return
        }
    }
}

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.