はじめに
こんにちは、シルです。
今回は、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/API | Limit | Notes |
|---|---|---|
| Web API Tier 4 | 100+ per minute | Enjoy a large request quota for Tier 4 methods, including generous burst behavior. |
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-urlencodedapplication/json
Rate Limites
| Feature/API | Limit | Notes |
|---|---|---|
| Web API Tier 4 | 100+ per minute | Enjoy a large request quota for Tier 4 methods, including generous burst behavior. |
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



コメント