IT技術関連Slack

Slack:Web APIを利用してファイルを投稿する(old)

Slack

はじめに

こんにちは、シルです。
今回は、SlackのWeb APIを利用してチャンネルにファイルを投稿してみます。
前提として、基本的なSlackの操作に関する知識やSlackのアカウントが必要です。

こちらで紹介している「files.upload」メソッドについては、2025年3月11日に廃止されます。
詳細は、「4. まとめ」を確認して下さい。
新たな方法についての紹介は後ほど実施いたします。

ファイル投稿の概要

「files.upload」というAPIメソッドを利用し、チャンネルにファイルを投稿してみます。

files.uploadについて

Slack公式の解説ページの内容を簡単にまとめます。

参考:Slack:よく使うWeb API一覧
   Slack | files.upload method

エンドポイント

  • POST https://slack.com/api/files.upload

スコープ

  • Bot User OAuth Tokens:files:write
    ⇨今回はBot User OAuth Tokensを利用
  • User OAuth Tokens :files:write, files:write:user

Content types

  • application/x-www-form-urlencoded 
  • multipart/form-data

Rate Limites

Feature/APILimitNotes
Web API Tier 220+ per minuteMost methods allow at least 20 requests per minute, while allowing for occasional bursts of more requests.
参考:Slack | Rate Limites
Limit(制限)について

Web API Tier 2に該当します。
1分間に20以上のリクエスト制限があります。この制限を超えるリクエストを送信すると、SlackのAPIはエラーを返します。

Notes(注意事項)について

1分間に少なくとも20件のリクエストが許可されます。
通常、この制限内でのリクエストが可能ですが、多くのリクエストが必要な場合には、一時的にその制限を超えることができます。

ファイルを投稿する

アプリを作成する

今回は、アプリにScopeを追加するところから実施します。
詳細なアプリの作成手順は、「Slack | Web APIを使用してメッセージを投稿する」を参照して下さい。

① https://api.slack.com/apps/にアクセスし、アプリを選択します。

② 以下の画面が開いたら、左サイドメニューから「OAuth&Permissions」をクリックします。

③ 以下の画面が開いたら、少し下にスクロールします。

④ 「Scopes」内の「Bot Tokens Scopes」項目の「Add an OAuth Scope」ボタンをクリックします。
  その後、必要なスコープを入力し、選択します。
  今回は、「files:write」を選択します。

⑤ Scopeの追加が完了すると、アプリのreinstallを求められます。
  黄色いエリア内の「reinstall your app」リンクをクリックします。

⑥ 以下の画面で内容を確認し、「許可する」ボタンをクリックします。

⑦ これでファイルのアップロードに必要なScopeの設定が完了しました。

チャンネルに作成したアプリを参加させる

詳細なアプリの作成手順は、「Slack | Web APIを使用してメッセージを投稿する」を参照して下さい。
以下の通り、投稿したいチャンネルにアプリを追加する必要があります。

ファイルを投稿する

それでは、メッセージを投稿していきます。
今回は、以下の方法で実行してみたいと思います。

  • 「curl」コマンドで投稿
  • 「JavaScript」で投稿

「curl」コマンドで投稿

① ターミナルを開きます。

② 以下のコマンドを実行します。
  「channel」には、投稿したいチャンネルのチャンネルIDを入力してください。
  「Authorization」には、Bot User OAuth Tokenを入力してください。
  「file」には、投稿したいファイルのパスを入力して下さい。
  「initial_comment」には、投稿したいファイル名など適当なテキストを入力して下さい。

curl -F file=@files.png -F "initial_comment=files.png" -F channels=CXXXXXXXXXX -H "Authorization: Bearer xoxb-xxxxxxxxx-xxxx" https://slack.com/api/files.upload

③ チャンネルを確認すると、メッセージが投稿されていることを確認できました。
  「initial_comment」に設定したテキストも、表示されていることがわかります。

参考:Slack | files.upload method

「JavaScript」で投稿

① Node.jsでAxiosを使用する方法で紹介します。
  「npm install axios」でパッケージをインストールし、実行コマンド「node xxxx.js」を実行します。
  「uploadFileToSlack」には以下の値を設定して下さい。
   ・「channel」には、投稿したいチャンネルのチャンネルIDを入力してください。
   ・「filePath」には、投稿したいファイルのパスを入力して下さい。
   ・「initial_comment」には、投稿したいファイル名など適当なテキストを入力して下さい。
  「Authorization」には、Bot User OAuth Tokenを入力してください。

const axios = require("axios");
const fs = require("fs");
const path = require("path");

// Slackのアクセストークンを設定します
const accessToken = "xoxb-your-access-token";

// Slackにファイルをアップロードする関数を定義します
async function uploadFileToSlack(channel, filePath, initialComment) {
  try {
    // ファイルの内容を読み込みます
    const fileData = fs.readFileSync(filePath);

    // ファイル名を取得します
    const fileName = path.basename(filePath);

    // Blob オブジェクトにファイルデータを変換します
    const blob = new Blob([fileData], { type: "application/octet-stream" });

    // Slackに送信するデータを作成します
    const formData = new FormData();
    formData.append("file", blob, fileName); // ファイルデータを直接追加します
    formData.append("channels", channel);
    formData.append("initial_comment", initialComment);

    // Slackのfiles.uploadメソッドを使用してファイルをアップロードします
    const response = await axios.post(
      "https://slack.com/api/files.upload",
      formData,
      {
        headers: {
          Authorization: `Bearer ${accessToken}`,
        },
      }
    );

    console.log("File uploaded successfully:", response.data);
  } catch (error) {
    // エラーハンドリングを修正します
    if (error.response) {
      // サーバーからのレスポンスがある場合
      console.error("Error uploading file to Slack:", error.response.data);
    } else if (error.request) {
      // サーバーへのリクエストが行われ、レスポンスがない場合
      console.error("No response received from server.");
    } else {
      // リクエストすら行われなかった場合
      console.error("Error in request:", error.message);
    }
  }
}

// ファイルをアップロードする
uploadFileToSlack(
  "CXXXXXXXXXX",
  "files.png",
  "files.png"
);

② チャンネルを確認すると、メッセージが投稿されていることを確認できました。

まとめ

【重要】こちらで紹介した「files.upload」メソッドは、廃止となるようです。
概要は以下の通りのようです。

内容は以下のページを参考:
https://api.slack.com/changelog/2024-04-a-better-way-to-upload-files-is-here-to-stay

「files.getUploadURLExternalとfiles.completeUploadExternal」の詳細な解説:
https://api.slack.com/messaging/files#uploading_files

ファイルのアップロードに使用されている元のWeb APIメソッドであるfiles.uploadが、2025年3月11日に廃止されます。2024年5月8日以降、新たに作成されるアプリはこのAPIメソッドを使用できなくなります。

アプリや統合は、files.uploadから移行し、代わりにfiles.getUploadURLExternalとfiles.completeUploadExternalの2つのAPIを活用する必要があります。これらの2つのメソッドを使用することで、特に大きなファイルをアップロードする場合に、より信頼性の高い動作が期待できます。

これら2つのAPIメソッドの使用方法の詳細な解説は、弊社の「ファイルのアップロード」ドキュメントに記載されています。

変更内容は?

  • files.uploadメソッドが廃止され、新しいアプリはこのメソッドを使用できなくなります。

どのように準備すればよいですか?

  • アプリや統合は、files.uploadからfiles.getUploadURLExternalとfiles.completeUploadExternalに移行する必要があります。

何もしない場合はどうなりますか?

  • 2025年3月11日以降、files.uploadメソッドは使用できなくなり、ファイルのアップロード機能が損なわれる可能性があります。したがって、早めの移行が推奨されます。
https://api.slack.com/changelog/2024-04-a-better-way-to-upload-files-is-here-to-stay

今後のためにも、新たな方法への移行を進めていく必要があるようです。
改めて、ファイルをアップロードする方法についてまとめていきたいと思います。

コメント

タイトルとURLをコピーしました