首页 文章

Slack API(files.upload)使用NodeJS

提问于
浏览 171
5

EDITED

我正在尝试构建通过Slack提供的files.upload() API,但我很难理解正确的格式 . 目前,我可以使用API上传文本文件,但在我的生活中无法弄清楚如何上传图像 .

这是我的问题:我的开发服务器上有一个图像,我们称之为image.png . 我想使用files.upload()API将该图像发布到#general Slack通道 . 下面是我成功生成图像的代码,但目前只是发送文本:

var myBarChart = new Chart(ctx).Bar(barChartData, barChartOptions);
        var myBarChartDataURL = leaderboardBarChart.toBase64Image();

        canvas.toBuffer(function(err, buf) {
          if (err) throw err;
          fs.writeFile(__dirname + "/leaderboard.png", buf);
        });

        bot.api.files.upload({
          token: process.env.token,
          title: "Image",
          filename: "image.png",
          filetype: "auto",
          //content: "Posted with files.upload API",
          file: fs.createReadStream("path/to/image_file.png"),
          channels: filtered[0].id
        }, function(err, response) {
          if (err) {
            console.log("Error (files.upload) " + err);
          } else {
            console.log("Success (files.upload) " + response);
          };
        });

当我运行代码时,我收到以下错误之一:

"invalid_array_arg" Slack的详细信息如下:“该方法被传递了一个PHP样式的数组参数(例如,使用类似foo [7]的名称) . 这些对于Slack API永远无效 . ”

我不完全确定该错误是什么,因为我没有使用PHP,也没有任何我能识别出类似PHP的东西 .

我已经尝试了几种不同的方法来包含文件路径,无论是使用'fs'模块,将其存储在变量中,还是只引用它的绝对路径(甚至是相对路径) . 我有点迷茫,我只是在寻找一些指导 .

我知道这个特殊的API使用multipart / form-data但我没有表单 . 这个应用程序严格来说是NodeJS应用程序 . 没有框架(如Express)与主节点脚本协同工作 .

任何和所有帮助真的很感激 . 再一次,只是寻找一些关于我错过或做错的见解/指导 .

提前致谢!

2 回答

  • 9

    我建议你使用nodejslack . 它使用Promises模式,由Bluebird提供支持 . 在其文档中有一个用于上传文件的示例代码,这里是:

    var Slack = require('nodejslack');
        var fs = require('fs');
        var SLACK_TOKEN = process.env.SLACK_TOKEN || 'YOUR_GENERATED_SLACK_TOKEN';
    
        var slack = new Slack(SLACK_TOKEN);
    
        var form = {
          file: fs.createReadStream('test.csv'), // Optional, via multipart/form-data. If omitting this parameter, you MUST submit content 
          // content: 'Your text here', // Optional, File contents. If omitting this parameter, you must provide a `file`  
          filename: 'test.csv', // Required  
          fileType: 'post', // Optional, See more file types in https://api.slack.com/types/file#file_types 
          title: 'Title of your file!', // Optional 
          initial_comment: 'First comment about this file.', // Optional 
          channels: 'general' //Optional, If you want to put more than one channel, separate using comma, example: 'general,random' 
        };
    
        slack.fileUpload(form)
        .then(function(response){
    
            // Slack sends a json with a boolean var ok.  
            // Error example : data = { ok: false, error: 'user_not_found'         } 
            // Error example : data = { ok: true, file: 'user_not_found' } 
            if(!response || !response.ok){
                return Promise.reject(new Error('Something wrong happened during the upload.'));
            }
            console.log('Uploaded Successfully:',response);
    
            return Promise.resolve(response);
        })
        .catch(function(err){
            return err;
        });
    
  • -1

    它看起来像你这里的API,因为Botkit似乎不支持发送 multipart/form-data .

    尝试一下,直接使用 request (已经被Botkit本身使用):

    var request = require('request');
    
    ...
    
    request.post({
        url: 'https://slack.com/api/files.upload',
        formData: {
            token: bot.config.token,
            title: "Image",
            filename: "image.png",
            filetype: "auto",
            channels: filtered[0].id,
            file: fs.createReadStream('test.png'),
        },
    }, function (err, response) {
        console.log(JSON.parse(response.body));
    });
    

相关问题