IT技術関連Slack

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

Slack

はじめに

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

今まで使用されていた「files.upload」メソッドについては、2025年3月11日に廃止されます。
詳細については、「https://api.slack.com/changelog/2024-04-a-better-way-to-upload-files-is-here-to-stay」を参照ください。

ファイル投稿の概要

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

files.getUploadURLExternalについて

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

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

エンドポイント

  • GET https://slack.com/api/files.getUploadURLExternal

スコープ

  • 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 

Rate Limites

Feature/APILimitNotes
Web API Tier 4
100+ per minute
Enjoy a large request quota for Tier 4 methods, including generous burst behavior.
参考:Slack | Rate Limites
Limit(制限)について

Web API Tier 4に該当します。
1分間に100回以上のリクエストを行うことができます。

Notes(注意事項)について

Tier 4のメソッドでは、多くのリクエストを1分間に処理できます。一時的に制限を超えたリクエストについても可能です。

files.completeUploadExternalについて

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

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

エンドポイント

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

スコープ

  • 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 
  • application/json

Rate Limites

Feature/APILimitNotes
Web API Tier 4
100+ per minute
Enjoy a large request quota for Tier 4 methods, including generous burst behavior.
参考:Slack | Rate Limites
Limit(制限)について

Web API Tier 4に該当します。
1分間に100回以上のリクエストを行うことができます。

Notes(注意事項)について

Tier 4のメソッドでは、多くのリクエストを1分間に処理できます。一時的に制限を超えたリクエストについても可能です。

ファイルを投稿する

アプリを作成する

今回は、アプリに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を使用してメッセージを投稿する」を参照して下さい。
以下の通り、投稿したいチャンネルにアプリを追加する必要があります。

ファイルを投稿する

それでは、メッセージを投稿していきます。

「JavaScript」で投稿

① Node.jsでAxiosを使用する方法で紹介します。
  「npm install axios」でパッケージをインストールし、実行コマンド「node xxxx.js」を実行します。

  • token」にはボットトークンを指定
  • channelId」には投稿したいチャンネルのチャンネルIDを指定
  • fileLength」にはアップロードしたいファイルのサイズを指定(バイト単位)
  • fileName」には投稿するファイル名を指定
const axios = require("axios");
const fs = require("fs");
const FormData = require("form-data");

// トークン
const token = "xoxb-your-slack-tokenhere";
// チャンネルID
const channelId = "CXXXXXXXXXX";
// アップロードしたいファイルのサイズ(バイト単位)
const fileLength = 592114;
// ファイル名
const fileName = "files.png";

// アップロードURLを取得する関数
async function getUploadURL() {
  try {
    const param = {
      filename: fileName,
      length: fileLength,
    };
    // Slack APIにリクエストを送信してアップロードURLを取得
    const response = await axios.post(
      "https://slack.com/api/files.getUploadURLExternal",
      param,
      {
        headers: {
          "Content-Type": "application/x-www-form-urlencoded",
          Authorization: `Bearer ${token}`,
        },
      }
    );
    return response.data;
  } catch (error) {
    console.error("Error getting upload URL:", error);
  }
}

// ファイルをアップロードする関数
async function uploadFile(uploadURL, filePath) {
  // フォームにファイルを追加
  const form = new FormData();
  form.append("file", fs.createReadStream(filePath));
  try {
    // 取得したアップロードURLにファイルをアップロード
    const response = await axios.post(uploadURL, form, {
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
        Authorization: `Bearer ${token}`,
      },
    });
    return response.data;
  } catch (error) {
    console.error("Error uploading file:", error);
  }
}

// アップロード完了を通知する関数
async function completeUploadExternal(fileId, title, channelId) {
  try {
    // Slack APIにリクエストを送信してアップロード完了を通知
    const param = {
      files: [
        {
          id: fileId,
          title: title,
        },
      ],
      channel_id: channelId,
    };
    const response = await axios.post(
      "https://slack.com/api/files.completeUploadExternal",
      param,
      {
        headers: {
          "Content-Type": "application/json",
          Authorization: `Bearer ${token}`,
        },
      }
    );
    return response.data;
  } catch (error) {
    console.error("Error uploading file:", error);
  }
}

async function main() {
  try {
    // 以下の2行でファイルのバイト数を取得
    // var stat = fs.statSync(`/your/upload/file/path/here.png`);
    // console.log(stat.size);

    // アップロードURLを取得する
    const uploadURLData = await getUploadURL();
    const uploadURL = uploadURLData.upload_url;
    const fileId = uploadURLData.file_id;

    // 取得したURLをポストする
    await uploadFile(uploadURL, "/your/upload/file/path/here.png");
    // ファイルアップロードを完了する
    await completeUploadExternal(fileId, fileName, channelId);
  } catch (error) {
    console.error("Main function error:", error);
  }
}

main();

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

まとめ

今回は、「files.getUploadURLExternal」と「files.completeUploadExternal」を使用してファイルをアプロードしてみました。
手順としては、以下の通りです。

①「files.getUploadURLExternal」メソッドを呼び出す
 ⇨「ファイルのアップロードURL」と「ファイルID」を取得する

②手順①で取得したファイルのアップロードURLに、POSTリクエストを送信して、アップロードをする
 ⇨非同期的に処理される

③「files.completeUploadExternal」メソッドを呼びだし、アップロードを完了する
 ⇨呼び出さない場合は、アップロードは中止される

今までファイルのアップロードに使用できていた「files.upload」メソッドは、廃止となるようです。
概要は以下の通りです。

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

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

コメント

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