概要
PowerAutomateを介してAPIを使用し、Chatworkの任意のルームにPDFファイルを自動送信するアクションを作成しました。
APIを用いてメッセージのみのPOSTに関しては既に別記事で紹介されていましたが、ファイル送信を行おうとした際、躓いたのでここに共有します。
(Chatwork関連の文献が少ないということと、自分自身PowerShellの経験が少なく、自分用というのも兼ねて記事に起こしてみた次第です)
手順
フロー内に"PowerShell スクリプトを実行"アクションを用意し、以下のコードを貼り付けます。
# ファイルパスを指定
$filePath = "C:\Users\sample\sample.pdf"
# メッセージを指定
$message = "ファイルがアップロードされました。"
#メッセージは必要に合わせて変更してください
# API URLを指定
$url = "https://api.chatwork.com/v2/rooms/00000000/files" # 00000000の部分を実際のルームIDに置き換える
# ヘッダーの設定
$headers = @{
"X-ChatWorkToken" = "ChatWorkToken" # 実際のトークンに置き換える
"Accept" = "application/json"
}
# フォームデータ作成
$boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW"
# ファイルのバイナリデータを読み込み
$fileBytes = [System.IO.File]::ReadAllBytes($filePath)
$fileContent = [System.Text.Encoding]::GetEncoding("iso-8859-1").GetString($fileBytes)
# 日本語メッセージのUTF-8エンコード
$messageBytes = [System.Text.Encoding]::UTF8.GetBytes($message)
$messageContent = [System.Text.Encoding]::GetEncoding("iso-8859-1").GetString($messageBytes)
# 日本語ファイル名のUTF-8エンコード
$fileName = [System.IO.Path]::GetFileName($filePath)
$fileNameEncoded = [System.Text.Encoding]::UTF8.GetBytes($fileName)
$fileNameUtf8 = [System.Text.Encoding]::GetEncoding("iso-8859-1").GetString($fileNameEncoded)
$formData = @"
--$boundary
Content-Disposition: form-data; name="message"
$messageContent
--$boundary
Content-Disposition: form-data; name="file"; filename*="utf-8''$fileNameUtf8"
Content-Type: application/pdf
$fileContent
--$boundary--
"@
# HTTPリクエストの送信
$response = Invoke-RestMethod -Uri $url -Method Post -Headers $headers -Body $formData -ContentType "multipart/form-data; boundary=$boundary"
# レスポンスの出力
$response | ConvertTo-Json
躓いた点
-
ヘッダーの境界は2本のダッシュで始まり、最後の境界には最後にも2本のダッシュが入る
-
改行を余分に挟むと上手く送信できない
-
日本語を扱うときは適切にエンコードを行うこと
お役に立てたら幸いです。