Slack API(files.upload)使用NodeJS

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的东西。

我已经尝试了几种不同的方法来包含文件path,无论是使用“fs”模块,将其存储在一个variables中,还是仅仅引用它的绝对path(甚至相对path)。 我有点失落,只是寻求一些指导。

我明白,这个特定的API使用multipart / form-data,但我没有一个表单。 这个应用程序是严格的NodeJS应用程序。 没有框架(如Express)与主节点脚本协同工作。

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

提前致谢!

看起来你不得不在Botkit的API之外,因为Botkit似乎不支持发送multipart/form-data

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

 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)); }); 

我build议你使用nodejslack 。 它使用蓝鸟支持的Promises模式。 在文档中有一个用于上传文件的示例代码,在这里是:

  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; });