
Slack: ファイルアップロード (Bots)
この工程は、Bots 機能を使って Slack にファイルをアップロードします。
Basic Configs
- 工程名
- メモ
Configs for this Auto Step
- conf_OAuth2
- C1: OAuth2 設定 *
- conf_ChannelId
- C2: Slack チャンネル ID *
- conf_Files
- C3: アップロードするファイルが保存されているデータ項目 *
Notes
- Slack チャンネル ID は、URL に含まれています https://app.slack.com/client/(ワークスペース ID)/(チャンネル ID)
- Slack チャンネル ID は、チャンネルの詳細にも表示されます
Capture

See Also
Script (click to open)
- 次のスクリプトが記述されている XML ファイルをダウンロードできます
- slack-file-upload-bots-v2.xml (C) Questetra, Inc. (MIT License)
- Professional のワークフロー基盤では、ファイル内容を改変しオリジナルのアドオン自動工程として活用できます
const main = () => {
//// == 工程コンフィグ・ワークフローデータの参照 / Config & Data Retrieving ==
const oauth2 = configs.getObject('conf_OAuth2');
const channelId = configs.get('conf_ChannelId');
const files = engine.findData(configs.getObject('conf_Files'));
////// == 演算 / Calculating ==
if (files === null) { // ファイル添付なしの場合、何もせず正常終了
engine.log('No File to upload');
return;
}
// ファイル毎に 2 回、最後に 1 回の HTTP リクエストを行う
const requiredHttpRequestNum = files.length * 2 + 1;
if (requiredHttpRequestNum > httpClient.getRequestingLimit()){
throw new Error('The number of files exceeds the limit.');
}
// ファイルをアップロード
const fileIds = [];
files.forEach((file) => {
const {uploadUrl, fileId} = getUploadUrl(oauth2, file);
upload(uploadUrl, file);
fileIds.push(fileId);
});
completeUpload(oauth2, fileIds, channelId);
};
/**
* Get Upload Url
* @param {AuthSettingWrapper} oauth2 OAuth2 認証設定
* @param {QfileView} file
* @returns {Object} {uploadUrl: String, fileId: String}
*/
const getUploadUrl = (oauth2, file) => {
const url = 'https://slack.com/api/files.getUploadURLExternal';
const response = httpClient.begin()
.authSetting(oauth2)
.queryParam('filename', file.getName())
.queryParam('length', file.getLength().toString())
.get(url);
const status = response.getStatusCode();
const responseTxt = response.getResponseAsString();
let responseJson;
try {
responseJson = JSON.parse(responseTxt);
} catch(e) {
engine.log('failed to parse as json');
engine.log(`status: ${status}`);
engine.log(responseTxt);
throw new Error(`Failed to get upload URL. status: ${status}`);
}
if (responseJson.ok !== true) {
const error = `Failed to get upload URL\n filename: ${file.getName()} error: ${responseJson.error}`;
engine.log(`status: ${status}`);
engine.log(responseTxt);
throw new Error(error);
}
return {uploadUrl: responseJson.upload_url, fileId: responseJson.file_id};
};
/**
* Upload File
* @param {String} uploadUrl
* @param {QfileView} file
*/
const upload = (uploadUrl, file) => {
const response = httpClient.begin()
.multipart('file', file)
.post(uploadUrl);
const status = response.getStatusCode();
if (status !== 200) {
engine.log(response.getResponseAsString());
throw new Error(`Failed to upload. status: ${status} filename: ${file.getName()}`);
}
};
/**
* Complete File Uploads
* @param {AuthSettingWrapper} oauth2 OAuth2 認証設定
* @param {Array<String>} fileIds
* @param {String} channelId
*/
const completeUpload = (oauth2, fileIds, channelId) => {
const url = 'https://slack.com/api/files.completeUploadExternal';
const payload = {
channel_id: channelId,
files: fileIds.map(fileId => ({id: fileId}))
};
const response = httpClient.begin()
.authSetting(oauth2)
.body(JSON.stringify(payload), 'application/json')
.post(url);
const status = response.getStatusCode();
const responseTxt = response.getResponseAsString();
let responseJson;
try {
responseJson = JSON.parse(responseTxt);
} catch(e) {
engine.log('failed to parse as json');
engine.log(`status: ${status}`);
engine.log(responseTxt);
throw new Error(`Failed to complete upload. status: ${status}`);
}
if (responseJson.ok !== true) {
const error = `Failed to complete upload\n error: ${responseJson.error}`;
engine.log(`status: ${status}`);
engine.log(responseTxt);
throw new Error(error);
}
};