Slack: ファイルアップロード (Bots)

Slack: ファイルアップロード (Bots)

Slack: Upload File (Bots)

この工程は、Bots 機能を使って Slack にファイルをアップロードします。

Basic Configs
工程名
メモ
Auto Step icon
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);
    }
};

上部へスクロール

Questetra Supportをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む