Chatworkに対し、メッセージやファイルを投稿したいというリクエストがあったので、調査。
カスタムコネクタを作ってもよかったんだけど、まずは簡単に試せるHTTPアクションから実行。
必要な情報
今回使用するChatworkのAPIに必要な情報は以下2つ。
- Room ID
- APIトークン
RoomID
メッセージやファイルを投稿するチャット(ルーム)のID、これはチャットを開いたときのURLから確認が可能。
APIトークン
続いてAPIトークン。これは右上のアイコンの[サービス連携]から、
[APIトークン]タブを選択すれば確認可能。
メッセージを投稿する
まずはメッセージの投稿から。使用するのはこのAPI。
Chatwork APIドキュメント
クラウド型ビジネスチャットツール「Chatwork」における開発者向けAPIの仕様詳細について記載しています
Power Automateのリクエストアクションをこのように設定する。
■URI
【Room ID】/messages
https://api.chatwork.com/v2/rooms/
■Headers
{ "Accept": "application/json", "Content-Type": "application/x-www-form-urlencoded", "X-ChatWorkToken": "【APIトークン】" }
■Queries
{ "body": "【送りたいメッセージ】", "self_unread": 0 }
このフローを実行するとメッセージが投稿できる。
ファイルを投稿する
ファイルの投稿では以下のAPIを使用して、multipart/form-dataとしてファイルを送信する。
Chatwork APIドキュメント
クラウド型ビジネスチャットツール「Chatwork」における開発者向けAPIの仕様詳細について記載しています
まずはトリガーの引数などからファイルを取得し、
拡張子をもとに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" } ] }