2016-06-28 11 views
4

EDITEDSlack API (files.upload) mit NodeJS

Ich versuche, die files.upload() API über Slack vorgesehen zu strukturieren, aber eine harte Zeit zu verstehen, das richtige Format habe. Momentan kann ich die API verwenden, um eine Textdatei hochzuladen, kann aber nicht für mein Leben herausfinden, wie man ein Bild hochlädt.

Hier ist mein Problem: Ich habe ein Bild auf meinem Entwicklungsserver, nennen wir es image.png. Ich möchte die files.upload() - API verwenden, um dieses Bild in einem #general Slack-Kanal zu veröffentlichen. Unten ist der Code habe ich das erfolgreich das Bild erzeugt, aber zur Zeit nur sendet den Text:

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

Wenn betreibe ich den Code I eine der folgenden Fehlermeldung erhalten:

„invalid_array_arg“ die Slack Details wie: "Die Methode wurde ein Array-Argument im PHP-Stil (zB mit einem Namen wie foo [7]) übergeben. Diese sind niemals gültig mit der Slack API."

Ich bin nicht ganz sicher, was ich von diesem Fehler machen soll, da ich weder PHP noch irgendetwas, das ich identifizieren kann, PHP-ähnlich wäre.

Ich habe mit verschiedenen Ansätzen experimentiert, um den Dateipfad einzubeziehen, ob mit dem 'fs' Modul, in einer Variablen zu speichern oder einfach auf seinen absoluten Pfad (und sogar einen relativen Pfad) zu verweisen. Ich bin ein wenig verloren und suche nur nach einer Anleitung.

Ich verstehe, dass diese bestimmte API Multipart/Form-Daten verwendet, aber ich habe kein Formular. Diese App ist ausschließlich eine NodeJS-App. Es gibt kein Framework (wie Express), das mit dem Skript des Hauptknotens zusammenarbeitet.

Jede und alle Hilfe wird wirklich geschätzt. Wiederum, nur auf der Suche nach einer Einsicht/Anleitung, was ich vermisse oder was ich falsch mache.

Vielen Dank im Voraus!

+0

Können Sie uns sagen, was 'bot.api' ist? Ich rate nur basierend auf Variablennamen, aber vielleicht verwenden Sie [Botkit] (https://github.com/howdyai/botkit)? – smarx

+1

Wenn es in der Tat Botkit ist, denke ich, dass 'file: fs.createReadStream (" path/to/image/file ")' den Trick machen könnte. (Botkit verwendet [request] (https://github.com/request/request), das 'multipart/form-data' über [form-data] (https://github.com/form-data/form- Daten)). – smarx

+0

Ich benutze Botkit! Ich werde das ausprobieren, danke für den Vorschlag! – dannyk

Antwort

7

Es sieht so aus, als müssten Sie sich hier außerhalb von Botkits API bewegen, da Botkit das Senden von multipart/form-data nicht zu unterstützen scheint.

das Probieren Sie, request direkt mit (bereits von Botkit selbst):

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

Ich kann dir nicht genug für deine Hilfe danken. Ihre vorgeschlagene Antwort funktionierte einwandfrei. Vielen Dank, ich schätze es sehr! – dannyk

+0

Ist es möglich, direkt an einen Benutzer anstatt an einen Kanal zu senden? Ich sehe, dass Docs nur über das Senden an Kanal – dimirc

+0

FYI sprechen ... Ich habe nur die ursprüngliche Anfrage (mit bot.api.files.upload) zu arbeiten. Es scheint, dass in Botkit v0.4.1 ein Fehler aufgetreten ist. Siehe https://github.com/howdyeai/botkit/commit/2bde51ff5326ccc44b8764ecc3110dac6696ef6c für Details –

-1

Ich empfehle Ihnen, die nodejslack verwenden. Es verwendet das Promises-Muster, unterstützt von Bluebird. Es ist ein Code-Beispieldatei in seinen Dokumentationen für das Hochladen, hier ist sie:

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