Slack API (files.upload) 使用 NodeJS
Slack API (files.upload) using NodeJS
已编辑
我正在尝试构建通过 Slack 提供的 files.upload() API,但我很难理解正确的格式。目前,我可以使用 API 上传文本文件,但我一辈子都不知道如何上传图片。
这是我的问题:我的开发服务器上有一个图像,我们称之为 image.png。我想使用 files.upload() API 将该图像 post 放入#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)。
非常感谢您提供的任何帮助。同样,只是寻找一些 insight/guidance 关于我遗漏或做错的事情。
提前致谢!
看来您必须在此处离开 Botkit 的 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));
});
我推荐你使用nodejslack。
它使用由 Bluebird 提供支持的 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;
});
已编辑
我正在尝试构建通过 Slack 提供的 files.upload() API,但我很难理解正确的格式。目前,我可以使用 API 上传文本文件,但我一辈子都不知道如何上传图片。
这是我的问题:我的开发服务器上有一个图像,我们称之为 image.png。我想使用 files.upload() API 将该图像 post 放入#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)。
非常感谢您提供的任何帮助。同样,只是寻找一些 insight/guidance 关于我遗漏或做错的事情。
提前致谢!
看来您必须在此处离开 Botkit 的 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));
});
我推荐你使用nodejslack。 它使用由 Bluebird 提供支持的 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;
});