【PowerShell】Slackに日本語のコメント付きで投稿するPowerShell

 なんか月の作業でSlackに添付ファイル付けて投稿するとかいう定例の作業があるので面倒なので何とかできないかと思ってPowerShellを準備してみました。結構手こずりましたが何とか動きました。

SlackのAPI難しい・・・・。


■PowerShell

# Slack APIのトークンと投稿先チャンネルを設定
$slackToken = "xoxp-"
$channel = "T"  # チャンネルIDを適宜変更
$scriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path

# テキストファイルから日本語メッセージをUTF-8エンコーディングで読み込む
$filePath = Join-Path -Path $scriptPath -ChildPath "work\message.txt"
$message = Get-Content -Path $filePath -Raw -Encoding UTF8

# 月と年を取得
$month = Get-Date -Format "MM"
$year = Get-Date -Format "yyyy"

# $monthを置換してコメントにセット
$message = $message -replace '\$month', $month

# Slack APIに送信するリクエストの組み立て
$apiURL = "https://slack.com/api/files.upload"
$headers = @{
    "Authorization" = "Bearer $slackToken"
}

try {
    # 添付ファイルのパスを設定 (ここでは例として"yyyymm_capture.xlsx"を指定)
    $attachmentFileName = "work\{0}{1}_capture.xlsx" -f $year, $month
    $attachmentPath = Join-Path -Path $scriptPath -ChildPath $attachmentFileName

    # $message = [System.Net.WebUtility]::UrlEncode($message)

	Write-Host $message

    $fileContent = Get-Content -Path $attachmentPath -Raw
    $boundary = [System.Guid]::NewGuid().ToString()
    $LF = "`r`n"

    $multipartContent = @"
--$boundary
Content-Disposition: form-data; name=`"channels`"

$channel
--$boundary
Content-Disposition: form-data; name=`"initial_comment`"

$message
--$boundary
Content-Disposition: form-data; name=`"file`"; filename=`"$attachmentFileName`"
Content-Type: application/octet-stream

$fileContent
--$boundary--
"@

    $contentType = "multipart/form-data; boundary=$boundary; charset=utf-8"
    $headers.Add("Content-Type", $contentType)
	# ↓ここがミソ
	$byteArray = [System.Text.Encoding]::UTF8.GetBytes($multipartContent)
    $response = Invoke-RestMethod -Uri $apiURL -Headers $headers -Method Post -Body $byteArray -ContentType $contentType
    if ($response.ok -eq $true) {
        Write-Host "success"
    } else {
        Write-Host "error: $($response.error)"
    }
} catch {
    Write-Host "not posted: $_"
}

# 最後に一時的に入力を待つ
Read-Host "Press Enter to exit"  


まぁバッチでも似たの組んでたかないずれにしてもcurl使えないのでかなり苦労したのと、そこですかいというところで嵌りました。

メッセージはファイル読み込んできて月を可変にできる様にしてるので添付ファイルをスクリプトと同階層に所定のフォルダ作成してそこに放り込めばPowerShell実行するだけでいい塩梅でSlackに投稿してくれます。

後は日本語添付ファイルの件はあったけどinitial_commentの件は文字化けのことなんも書いていないのでググりまくってようやく解決できた。

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)