新しいことにはウェルカム

技術 | 電子工作 | ガジェット | ゲーム のメモ書き

Microsoft(Office365)Flowから、Slackにファイルをアップロードする方法

メールが届いたら、そのメールの添付ファイルをSlackにアップロードしたいことがあって、そのタスク実行にMicrosoft(Office365)Flowを使おうとしました。

Microsoft(Office365)FlowにはSlackコネクターがあるので、それを使えば簡単に作れるかなと思ったのですが、 残念ながらFlowのSlackコネクターはテキストメッセージ投稿専用で、Slackへファイルのアップロードはできませんでした。

仕方ないので、FlowのHTTPアクションを使って、SlackのAPIで直接ファイルをアップロードすることにしました。

ここでは、そのMicrosoft(Office365)FlowからSlackにファイルをアップロードする手順をまとめました。

Slackのファイルアップロード方法について

Slackのファイルアップロード方法についての、ざっくりとした要件です。

Slack APIドキュメント

要件

  • URL「https://slack.com/api/files.upload」に「POST」で「multipart/form-data」でファイルをアップロードします。
    • いわゆるhtmlのファイルアップロードフォームと同じ方法です
  • 「file」にファイルの中身を指定します。
  • ファイルの種類に合わせて「contents-type」の指定が必要です。
    • 「contents-type」が無いとファイルをアップロードできても、中身が壊れてしまいます。
  • APIの認証はベアラートークンで、「authorization」ヘッダーにトークンを「Bearer <トークン>」とセットします。
    • 「Beare」とトークンの間にはスペースが1文字必要です。
  • トークンは事前に取得しておきます。
  • ファイルアップロードには「files:write:user」権限が必要です。
  • 投稿先は「channels」でチャンネルIDを指定します。

SlackのAPIの使い方は、これはこれで色々ハマりポイントがあり、別記事にまとめましたので、詳しくはそちらを参照ください。

www.kwbtblog.com

Flowの設定

上記Slack APIの呼び出しを、FlowのHTTPアクションで行います。

  • メソッドを「POST」、URIを「https://slack.com/api/files.upload」にします。
  • 認証は「authorization」ヘッダーに「Bearer <トークン>」と指定します。

後はヘッダー設定で「content-type」を「multipart/form-data」にして、ファイルとSlackのchannnelIDを設定してPOSTすれば終わり…とは行かず、 「multipart/form-data」のPOSTのやり方は少々トリッキーでした。

HTTPアクションで「multipart/form-data」するには、ヘッダーでは「content-type」を設定せず、本文の中に、送信するデータと合わせてJSONで記述する必要があります。

JSONは下記のようなものになり、これを本文に貼り付けます。

{
    "$content-type": "multipart/form-data",
    "$multipart": [
      {
        "headers": {
            "Content-Disposition": "form-data; name=file; filename=@{items('Apply_to_each')?['Name']}"
          },
          "body": {
            "$content-type": "@{items('Apply_to_each')?['ContentType']}",
            "$content": @{items('Apply_to_each')?['ContentBytes']}
        }
      },
      {
        "headers": {
            "Content-Disposition": "form-data; name=channels"
          },
          "body": "xxx"
      }
    ]
}

Microsoft(Office365)Flowから、Slackにファイルをアップロードする方法
本文に貼り付けた結果

補足説明・注意点

ファイルアップロードに必要なパラメータ

ファイルオブジェクトから、「ファイル内容(file)」「ファイル種類(content-type)」「ファイル名(filename)」の3つの値を設定して、ファイルをアップロードしています。

JSON記述内容に関して

「@{items('Apply_to_each')?['Name']}」など、見慣れないオブジェクトがありますが、 本文に貼り付けると、Flowのエディタに「添付ファイル 名前」と表示されることから分かるように、ファイルに関する情報を指しています。

Flowは内部処理では「@{items('Apply_to_each')?['Name']}」の表記の方を使っているのですが、ユーザーには分かりやすいようGUI上では別の「添付ファイル 名前」が表示されるようになっています。

Flowで作業するにあたって、これらの関係性を知らないとハマることが多いので、Flowでのデータの参照方法について別記事にまとめました。

www.kwbtblog.com

ファイルのコンテンツはバイナリーで送る必要があるので、「@{items('Apply_to_each')?['ContentBytes']}」は「"」でくくらないで、直接書く必要があります。

また、サンプルでは、添付ファイル一覧を「Apply to each」に入れて、ファイルを1つ1つ取り出したので、「items('Apply_to_each')」といった表記になりましたが、 「triggerBody()?['Attachments'][0]」で直接取り出す書き方も可能ですし、そもそもアップロードしたいファイルをどこから取得するかによって、何を表記するか変わってきます。

それらの表記の意味や、どういった表記になるかの見つけ方も、上記記事「Microsoft (Office365) Flow のデータの参照方法について整理する」にまとめました。

Slackの設定に関して

Slackの投稿先IDを「channels」に設定して送るのですが、その設定を下記でやっています。

{
  "headers": {
    "Content-Disposition": "form-data; name=channels"
  },
  "body": "xxx"
}

「name=~」が引数名、「body」の値に、投稿したいSlackのチャンネルIDを指定しています。

同様にして「initial_comment」「title」を設定すれば、アップロードした時のコメントやタイトルも指定することができます。

実行

以上を実行すると、無事ファイルがアップされました! Microsoft(Office365)Flowから、Slackにファイルをアップロードする方法

感想など

最初、ヘッダーに「content-type」「multipart/form-data」を設定して、本文にデータをベタ書きして試していました。

Microsoft(Office365)Flowから、Slackにファイルをアップロードする方法

実は、これはこれでファイルのアップができちゃうのですが、ファイルの中身は壊れてしまいます。

Microsoft(Office365)Flowから、Slackにファイルをアップロードする方法
アップはできたがファイルが壊れていて見れない

Flowのアクションのメニューで「コードのプレビュー」とすると、実行されるアクションデータが見れるので見てみます。

すると、本文にデータをベタ書きすると、本文データはStringと判定されるようで、ファイルのコンテンツが「base64ToString()」で強制的にStringに変換されていて、それが原因でファイルが壊れていました。

Microsoft(Office365)Flowから、Slackにファイルをアップロードする方法

しかし、HTTPアクションでStringしか送れない仕様なんて本当なの?と、にわかに信じがたいのでマニュアルみたら、そんなことはなく、そのものズバリ「multipart/form-data」のデータの送り方が載っていました…。

docs.microsoft.com

この方法で渡すと「@{items('Apply_to_each')?['ContentBytes']}」と無事バイナリーで渡されていました。いやぁ~最初に見ておけばよかった……。

Microsoft(Office365)Flowから、Slackにファイルをアップロードする方法

HTTPアクションは汎用的に作られているので、HTTPアクションを使えばあらゆるAPIが叩けそうですね。

でも、有りもののコネクターを使って楽したいので、Slackのファイルアップロードコネクター出して欲しいです!

参考記事

関連カテゴリー記事

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com