Power Automate ChatworkにHTTPアクション経由でメッセージやファイルを投稿する|制限事項あり

Chatworkに対し、メッセージやファイルを投稿したいというリクエストがあったので、調査。

カスタムコネクタを作ってもよかったんだけど、まずは簡単に試せるHTTPアクションから実行。

スポンサーリンク

必要な情報

今回使用するChatworkのAPIに必要な情報は以下2つ。

  • Room ID
  • APIトークン

RoomID

メッセージやファイルを投稿するチャット(ルーム)のID、これはチャットを開いたときのURLから確認が可能。

APIトークン

続いてAPIトークン。これは右上のアイコンの[サービス連携]から、
[APIトークン]タブを選択すれば確認可能。

メッセージを投稿する

Power Automateのリクエストアクションをこのように設定する。
■URI

https://api.chatwork.com/v2/rooms/【Room ID】/messages

■Headers

{
  "Accept": "application/json",
  "Content-Type": "application/x-www-form-urlencoded",
  "X-ChatWorkToken": "【APIトークン】"
}

■Queries

{
  "body": "【送りたいメッセージ】",
  "self_unread": 0
}
このフローを実行するとメッセージが投稿できる。

ファイルを投稿する

まずはトリガーの引数などからファイルを取得し、
拡張子をもとにContent-Typeを取得する。こんな感じで使用する可能性のあるcontent-typeを定義しておいて、
ファイル名から取得できる拡張子をもとに、対応するcontent-typeを定義済みの配列から取得(フィルター)する。

last(split(triggerBody()?['file']?['name'], '.'))

取得したContent-typeとファイルの情報をmultipart/form-dataとして送信する。
■URI

https://api.chatwork.com/v2/rooms/361224277/files

■Headers

{
  "Accept": "application/json",
  "Content-Type": "multipart/form-data",
  "X-ChatWorkToken": "【APIトークン】"
}

■Body

{
  "$content-type": "multipart/form-data",
  "$multipart": [
    {
      "headers": {
        "Content-Disposition": "form-data; name=\"file\"; filename=\"@{triggerBody()?['file']?['name']}\""
      },
      "body": {
        "$Content-type": "@{first(body('アレイのフィルター処理'))['content-type']}",
        "$Content": @{triggerBody()?['file']?['contentBytes']}
      }
    }
  ]
}
このPower Automateを実行するとファイルを送信できる。

ファイルの投稿と一緒にメッセージも送信できるはずだけど。。

ファイル投稿のAPIを見ると、ファイルと一緒にメッセージの投稿もできるらしい。

そこでフローをのBody部分にmessageを追加して、メッセージを送信してみると、
フロー自体は成功するんだけど、
なぜかメッセージとファイルは投稿されない。。

multipart/form-dataの使い方が違う可能性があるが、現時点では解決策見つからず。

{
  "$content-type": "multipart/form-data",
  "$multipart": [
    {
      "headers": {
        "Content-Disposition": "form-data; name=\"file\"; filename=\"@{triggerBody()?['file']?['name']}\""
      },
      "body": {
        "$Content-type": "@{first(body('アレイのフィルター処理'))['content-type']}",
        "$Content": @{triggerBody()?['file']?['contentBytes']}
      }
    },
    {
      "headers": {
        "Content-Disposition": "form-data; name=\"message\""
      },
      "body": "Hello World"
    }
  ]
}
タイトルとURLをコピーしました