2016-06-28 5 views
4

EDITEDスラックAPI(files.upload)私はスラックを介して提供さ<a href="https://api.slack.com/methods/files.upload" rel="nofollow">files.upload() API</a>を構築しようとしているが、正しい形式を理解するに苦労していますNodeJS

を使用。現時点では、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」とスラック以下は、私はそれが成功した画像を生成しているが、現在はテキストだけを送信して持っているコードがあります詳細: "このメソッドには、PHPスタイルの配列引数(foo [7]などの名前)が渡されました。これらはスラックAPIでは有効ではありません。

私はPHPを使用していないため、このエラーの原因を完全には分かりません。

私は、 'fs'モジュールを使用するか、変数に格納するか、または絶対パス(および相対パス)を参照するかを問わず、ファイルパスを含めるためのいくつかの異なるアプローチを試しました。私は少し失われて、ちょうどいくつかの指導を探しています。

この特定のAPIはmultipart/form-dataを使用していますが、フォームはありません。このアプリは厳密にNodeJSアプリです。メインノードスクリプトと連携して動作するフレームワーク(Expressなど)はありません。

すべてのヘルプは本当に感謝しています。繰り返しますが、私が逃していることや間違っていることについてのいくつかの洞察力/指針を探しています。

ありがとうございます!

+0

「bot.api」は何ですか?私は変数名に基づいて推測していますが、おそらくあなたは[botkit](https://github.com/howdyai/botkit)を使っていますか? – smarx

+1

実際にボットキットの場合は、 'file:fs.createReadStream(" path/to/image/file ")がこのトリックを行うかもしれないと思います。 (Botkitは[form-data](https://github.com/form- data/form-data)を介して 'multipart/form-data'を扱う[request](https://github.com/request/request)データ))。 – smarx

+0

私はbotkitを使用しています!私はそれを試してみましょう、提案に感謝! – dannyk

答えて

7

ボットキットはmultipart/form-dataの送信をサポートしていないようですので、ボットキットのAPIの外に出なければならないようです。

は(すでに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)); 
}); 
+0

私はあなたの助けに十分に感謝することはできません。あなたの提案された答えは完璧に働いた。本当にありがとう、本当にありがとう! – dannyk

+0

チャンネルではなくユーザーに直接送信することはできますか?私は文書がチャネル – dimirc

+0

FYIに送信について話すことを参照してください...私はちょうど働くために(bot.api.files.uploadを使用して)元の要求を持っています。 Botkit v0.4.1に修正があったようです。 詳細については、https://github.com/howdyai/botkit/commit/2bde51ff5326ccc44b8764ecc3110dac6696ef6cをご覧ください。 –

-1

私はあなたが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; 
    }); 
関連する問題