Photo upload with facebook-node-sdk Module / (#324) Requires upload file - facebook
I'm trying to send a photo using facebook node sdk module to a page. https://github.com/Thuzi/facebook-node-sdk/
I'm able to post to the page wall or to uplaod from an url. But i have a problem trying to uplaod photo from data.
That is how i connected :
FB.api('oauth/access_token', {
client_id: clientid,
client_secret: clientsecret,
redirect_uri: redirecturi,
code: code,
scope: scope,
fileUpload : true,
}, function (resf) { ...}
I get the good access token like this :
FB.api('/me/accounts', function (resf) {
if (!resf || resf.error) {
console.log(!resf ? 'error occurred' : resf.error);
return;
}
for (var i = 0; i < resf.data.length; i++) {
if (resf.data[i].id == pageid)
{
resf.data[i]. access_token
}
});
And i try to upload the photo :
var buff = "data:image/jpeg;base64,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";
var body = 'My firstdfsfsfd';
FB.api(pageid + '/photos', 'post', { message: body, source: buff, }, function (resf) {
if (!resf || resf.error) {
console.log(!resf ? 'error occurred' : resf.error);
return;
}
console.log( resf);
res.send(resf);
});
And i have this error :
{
"error": {
"message": "(#324) Requires upload file",
"type": "OAuthException",
"code": 324
}
}
This call is working :
var body = 'My firstdfsfsfd';
FB.api(pageid + '/photos', 'post', { message: body, url: 'url_image', }, function (resf) {
if (!resf || resf.error) {
console.log(!resf ? 'error occurred' : resf.error);
return;
}
console.log( resf);
res.send(resf);
});
What did i forget ?
Does multipart upload is allowing with this module : https://github.com/Thuzi/facebook-node-sdk/
It does not appear to support multipart. You could do it manually with the request module:
var request = require('request');
// ....
var access_token = 'abc123',
pageid = 'me',
fburl = 'https://graph.facebook.com/'
+ pageid
+ '/photos?access_token='
+ access_token,
req,
form;
req = request.post(fburl, function(err, res, body) {
if (err)
return console.error('Upload failed:', err);
console.log('Upload successful! Server responded with:', body);
});
form = req.form()
// append a normal literal text field ...
form.append('message', 'My photo!');
// append a file field by streaming a file from disk ...
form.append('source', fs.createReadStream(path.join(__dirname, 'photo.jpg')));
// or append a Buffer ...
form.append('source', someBuffer);
// or append the contents of a remote url ...
form.append('source', request('http://google.com/doodle.png'));
Example (from mscdex) above works for:
form.append('source', requestLib('<imageURL>'));
Gives response:
{"id":"756317401077924","post_id":"100000990137087_756310827745248"}
Also works for:
form.append('source', fs.createReadStream('<imagepath>'));
Gives response:
{"id":"756328687743462","post_id":"100000990137087_756310827745248"}
This is probably all I need. Thanks mscdex, very helpful. But out of curiosity, when I replaced it with an image buffer:
form.append('source', imageBuffer);
It gives the same error as OP (even when using the same image string as OP):
{"error":{"message":"(#324) Requires upload file","type":"OAuthException","code":324}}
Why? My guess is Facebook wants a specific format for an encoded image.
Related
protractor promises - querying an API using "request"
I am trying to use protractor to call an api - it will return some JSON to me and I want to assert against it. I thought I had this working, until I tried to take it further and realised I hadn't got it right, but having a bit of a time trying to work out why. I have placed some console.logs in and expected the sequence to be 1,2,3 however it appears to be 3 (test finished) then 2 and 1. So I suspect a promise issue. code below: 'use strict'; var request = require('request'); var path = require('path'); var info; //var fname = null; var fname = 'joe'; describe("Sample test", function() { var request = require('request'); var options = { method: 'GET', url: 'URL here', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: '{ "pay_load": [] }' }; function callback(error, response, body) { if (!error && response.statusCode == 200) { info = JSON.parse(body); console.log('in the callback now'); //console.log('body :' + body); //var count = Object.keys(info).length; //console.log('body len:' + count); //console.log('info :' + info); fname = info.firstname; console.log('firstname1 : ' + info.firstname); console.log('firstname2 : ' + fname); } else { console.log('there was some error'); } } it("proves the API is alive - firstname is null", function() { request(options, callback); //expect(fname).toBe(null); console.log('firstname3 : ' + fname); //expect(fname).toBe(null); //var common = new Common(); //common.checkForAPI(); }); So in my head I thought I would see "in the callback", then "firstname1", "firstname2" and finally "firstname3"
No, firstname3 will always get printed first, the way you have it. The reason for it as that all http requests in nodejs are async, so while your request is processing (or in flight), firstname3 will be printed. Then console.logs in your request callback. Edit1 - Addressing the comment Simple example which would print firstname1,2,3 in sequence (tested) var request = function(cb) { //basically call your request stuff and then when you are done call cb console.log('firstname 1'); console.log('firstname 2'); cb(); }; request(function() { console.log('firstname 3'); }); This prints firstname 1 firstname 2 firstname 3 Or you can use a third party library called async and use async.tryEach to run tasks in series. async.tryEach([ function getDataFromFirstWebsite(callback) { // Try getting the data from the first website callback(err, data); }, function getDataFromSecondWebsite(callback) { // First website failed, // Try getting the data from the backup website callback(err, data); } ], // optional callback function(err, results) { Now do something with the data. });
Google Cloud Storage File Upload - Requested page not found. [404]
I am trying to upload a file to Google Cloud Storage using Json API. I am posting the request to below url with the file attachment. https://www.googleapis.com/upload/storage/v1/b/mybucket/o?uploadType=media&name=solarsystemlrg.png But I am getting Requested page not found. [404] Error. When I use the below Url, I am able to list the images stored in the bucket (Just to be sure that there are no access issues and bucket name is correct). https://www.googleapis.com/storage/v1/b/mybucket/o I have set the headers. 'Authorization' :'Bearer ' + accessToken, 'Content-Type' : contentType, 'Content-Length' : inputFile.size Please find the code snippet below. $.ajax({ url: targetUrl, headers: reqHeaders, type: 'POST', data: reqFormWithDataFile, async: false, cache: false, dataType: 'jsonp', useDefaultXhrHeader: false, processData: false, success: function (response) { alert('File Upload Successful'); }, error: function (jqXHR, exception) { var msg = ''; if (jqXHR.status === 0) { msg = 'Not connect.\n Verify Network.'; } else if (jqXHR.status == 404) { msg = 'Requested page not found. [404]'; } else if (jqXHR.status == 500) { msg = 'Internal Server Error [500].'; } else if (exception === 'parsererror') { msg = 'Requested JSON parse failed.'; } else if (exception === 'timeout') { msg = 'Time out error.'; } else if (exception === 'abort') { msg = 'Ajax request aborted.'; } else { msg = 'Uncaught Error.\n' + jqXHR.responseText; } alert(msg); } }); Do I need to use a different URL? Or is there any other setting required? Please help.
That's the right URL, so long as you replace mybucket with your actual bucket name. After reading through jquery.ajax(), I emulated what I think is the behavior by adding &callback=foo, due to dataType: 'jsonp' and &_=1474410231688 because cache: false, and issued the request via curl and that produced a valid object with a valid callback. Can you log the entire jqXHR to see more of the status?
Twilio IP Messaging user not found
I'm trying to add a users identity to a channel using the REST API using instructions here: https://www.twilio.com/docs/api/ip-messaging/rest/members#action-create I'm posting to the /Channels/channelId/Members endpoint - I'm certain my request is structured correctly. I get an error back from Twilio IP Messaging saying: {"code": 50200, "message": "User not found", "more_info": "https://www.twilio.com/docs/errors/50200", "status": 400} My understanding was that we can provide our own identity when we want to add someone to a Channel. How can I 'register' the user (with an email) before adding them to the Channel? EDIT - The code: var _getRequestBaseUrl = function() { return 'https://' + process.env.TWILIO_ACCOUNT_SID + ':' + process.env.TWILIO_AUTH_TOKEN + '#' + TWILIO_BASE + 'Services/' + process.env.TWILIO_IPM_SERVICE_SID + '/'; }; var addMemberToChannel = function(memberIdentity, channelId) { var options = { url: _getRequestBaseUrl() + 'Channels/' + channelId + '/Members', method: 'POST', headers: { 'content-type': 'application/x-www-form-urlencoded', }, form: { Identity: memberIdentity, }, }; request(options, function(error, response, body) { if (error) { // Getting the error here } // do stuff with response. }); }; addMemberToChannel('test1#example.com', <validChannelId>);
Twilio developer evangelist here. In order to add a user to be a member of a channel, you do indeed need to register them first. Check out the documentation for creating a user in IP Messaging. With your code you'd need a function like: var createUser = function(memberIdentity) { var options = { url: _getRequestBaseUrl() + 'Users', method:'POST', headers: { 'content-type': 'application/x-www-form-urlencoded', }, form: { Identity: memberIdentity, } }; request(options, function(error, response, body) { if (error) { // User couldn't be created } // do stuff with user. }); } Could I also suggest you take a look at the Twilio helper library for Node.js. It handles the creation of URLs like you're doing for you. The code looks cleaner too, you can create a user with the helper library like this: var accountSid = 'ACCOUNT_SID'; var authToken = 'AUTH_TOKEN'; var IpMessagingClient = require('twilio').IpMessagingClient; var client = new IpMessagingClient(accountSid, authToken); var service = client.services('SERVICE_SID'); service.users.create({ identity: 'IDENTITY' }).then(function(response) { console.log(response); }).fail(function(error) { console.log(error); }); Let me know if this helps at all.
Parse - How to insert data on parse server using REST Api using javascript?
I am integrating parse rest api to insert data on a table using jsp page. and using following code in javascript - var headers = { "X-Parse-Application-Id" : "myparseappid", "X-Parse-REST-API-Key" : "myparserestapi" }; // Variable to store data: var userData = { "name" : "anyname" }; var data = JSON.stringify(userData); // Send data: $.ajax({ type : "POST", url : "https://api.parse.com/1/classes/MyClassName", data : userData, contentType : "application/json", headers : headers, dataType:"json", success : function(data, status, xhr) { alert("data:" + JSON.stringify(data) + " status: "+ status); if (status === "success") { // Show success feedback: alert("Data was saved successfully"); } else { // Show error message: alert("Your data didn't save. Please check that you are online. Status: " + status); } }, error : function(data, status, xhr) { // Show error message: alert("Your data didn't save. Please check that you are online. Status: " + status); } }); and for ajax i called following js - <script src="https://code.jquery.com/jquery-1.10.2.js"></script> Question - It is not saving the records whats wrong with above code. please suggest me? Thanks in advance!
How to make remote REST call inside Node.js? any CURL?
In Node.js, other than using child process to make CURL call, is there a way to make CURL call to remote server REST API and get the return data? I also need to set up the request header to the remote REST call, and also query string as well in GET (or POST). I find this one: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs but it doesn't show any way to POST query string.
Look at http.request var options = { host: url, port: 80, path: '/resource?id=foo&bar=baz', method: 'POST' }; http.request(options, function(res) { console.log('STATUS: ' + res.statusCode); console.log('HEADERS: ' + JSON.stringify(res.headers)); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log('BODY: ' + chunk); }); }).end();
How about using Request — Simplified HTTP client. Edit February 2020: Request has been deprecated so you probably shouldn't use it any more. Here's a GET: var request = require('request'); request('http://www.google.com', function (error, response, body) { if (!error && response.statusCode === 200) { console.log(body) // Print the google web page. } }) OP also wanted a POST: request.post('http://service.com/upload', {form:{key:'value'}})
I use node-fetch because it uses the familiar (if you are a web developer) fetch() API. fetch() is the new way to make arbitrary HTTP requests from the browser. Yes I know this is a node js question, but don't we want to reduce the number of API's developers have to memorize and understand, and improve re-useability of our javascript code? Fetch is a standard so how about we converge on that? The other nice thing about fetch() is that it returns a javascript Promise, so you can write async code like this: let fetch = require('node-fetch'); fetch('http://localhost', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{}' }).then(response => { return response.json(); }).catch(err => {console.log(err);}); Fetch superseeds XMLHTTPRequest. Here's some more info.
Look at http://isolasoftware.it/2012/05/28/call-rest-api-with-node-js/ var https = require('https'); /** * HOW TO Make an HTTP Call - GET */ // options for GET var optionsget = { host : 'graph.facebook.com', // here only the domain name // (no http/https !) port : 443, path : '/youscada', // the rest of the url with parameters if needed method : 'GET' // do GET }; console.info('Options prepared:'); console.info(optionsget); console.info('Do the GET call'); // do the GET request var reqGet = https.request(optionsget, function(res) { console.log("statusCode: ", res.statusCode); // uncomment it for header details // console.log("headers: ", res.headers); res.on('data', function(d) { console.info('GET result:\n'); process.stdout.write(d); console.info('\n\nCall completed'); }); }); reqGet.end(); reqGet.on('error', function(e) { console.error(e); }); /** * HOW TO Make an HTTP Call - POST */ // do a POST request // create the JSON object jsonObject = JSON.stringify({ "message" : "The web of things is approaching, let do some tests to be ready!", "name" : "Test message posted with node.js", "caption" : "Some tests with node.js", "link" : "http://www.youscada.com", "description" : "this is a description", "picture" : "http://youscada.com/wp-content/uploads/2012/05/logo2.png", "actions" : [ { "name" : "youSCADA", "link" : "http://www.youscada.com" } ] }); // prepare the header var postheaders = { 'Content-Type' : 'application/json', 'Content-Length' : Buffer.byteLength(jsonObject, 'utf8') }; // the post options var optionspost = { host : 'graph.facebook.com', port : 443, path : '/youscada/feed?access_token=your_api_key', method : 'POST', headers : postheaders }; console.info('Options prepared:'); console.info(optionspost); console.info('Do the POST call'); // do the POST call var reqPost = https.request(optionspost, function(res) { console.log("statusCode: ", res.statusCode); // uncomment it for header details // console.log("headers: ", res.headers); res.on('data', function(d) { console.info('POST result:\n'); process.stdout.write(d); console.info('\n\nPOST completed'); }); }); // write the json data reqPost.write(jsonObject); reqPost.end(); reqPost.on('error', function(e) { console.error(e); }); /** * Get Message - GET */ // options for GET var optionsgetmsg = { host : 'graph.facebook.com', // here only the domain name // (no http/https !) port : 443, path : '/youscada/feed?access_token=you_api_key', // the rest of the url with parameters if needed method : 'GET' // do GET }; console.info('Options prepared:'); console.info(optionsgetmsg); console.info('Do the GET call'); // do the GET request var reqGet = https.request(optionsgetmsg, function(res) { console.log("statusCode: ", res.statusCode); // uncomment it for header details // console.log("headers: ", res.headers); res.on('data', function(d) { console.info('GET result after POST:\n'); process.stdout.write(d); console.info('\n\nCall completed'); }); }); reqGet.end(); reqGet.on('error', function(e) { console.error(e); });
Axios An example (axios_example.js) using Axios in Node.js: const axios = require('axios'); const express = require('express'); const app = express(); const port = process.env.PORT || 5000; app.get('/search', function(req, res) { let query = req.query.queryStr; let url = `https://your.service.org?query=${query}`; axios({ method:'get', url, auth: { username: 'the_username', password: 'the_password' } }) .then(function (response) { res.send(JSON.stringify(response.data)); }) .catch(function (error) { console.log(error); }); }); var server = app.listen(port); Be sure in your project directory you do: npm init npm install express npm install axios node axios_example.js You can then test the Node.js REST API using your browser at: http://localhost:5000/search?queryStr=xxxxxxxxx Similarly you can do post, such as: axios({ method: 'post', url: 'https://your.service.org/user/12345', data: { firstName: 'Fred', lastName: 'Flintstone' } }); SuperAgent Similarly you can use SuperAgent. superagent.get('https://your.service.org?query=xxxx') .end((err, response) => { if (err) { return console.log(err); } res.send(JSON.stringify(response.body)); }); And if you want to do basic authentication: superagent.get('https://your.service.org?query=xxxx') .auth('the_username', 'the_password') .end((err, response) => { if (err) { return console.log(err); } res.send(JSON.stringify(response.body)); }); Ref: https://github.com/axios/axios https://www.twilio.com/blog/2017/08/http-requests-in-node-js.html
I have been using restler for making webservices call, works like charm and is pretty neat.
To use latest Async/Await features https://www.npmjs.com/package/request-promise-native npm install --save request npm install --save request-promise-native //code async function getData (){ try{ var rp = require ('request-promise-native'); var options = { uri:'https://reqres.in/api/users/2', json:true }; var response = await rp(options); return response; }catch(error){ throw error; } } try{ console.log(getData()); }catch(error){ console.log(error); }
Warning: As of Feb 11th 2020, request is fully deprecated. One another example - you need to install request module for that var request = require('request'); function get_trustyou(trust_you_id, callback) { var options = { uri : 'https://api.trustyou.com/hotels/'+trust_you_id+'/seal.json', method : 'GET' }; var res = ''; request(options, function (error, response, body) { if (!error && response.statusCode == 200) { res = body; } else { res = 'Not Found'; } callback(res); }); } get_trustyou("674fa44c-1fbd-4275-aa72-a20f262372cd", function(resp){ console.log(resp); });
const http = require('http'); const url = process.argv[2]; http.get(url, function(response) { let finalData = ""; response.on("data", function (data) { finalData += data.toString(); }); response.on("end", function() { console.log(finalData.length); console.log(finalData.toString()); }); });
I didn't find any with cURL so I wrote a wrapper around node-libcurl and can be found at https://www.npmjs.com/package/vps-rest-client. To make a POST is like so: var host = 'https://api.budgetvm.com/v2/dns/record'; var key = 'some___key'; var domain_id = 'some___id'; var rest = require('vps-rest-client'); var client = rest.createClient(key, { verbose: false }); var post = { domain: domain_id, record: 'test.example.net', type: 'A', content: '111.111.111.111' }; client.post(host, post).then(function(resp) { console.info(resp); if (resp.success === true) { // some action } client.close(); }).catch((err) => console.info(err));
If you have Node.js 4.4+, take a look at reqclient, it allows you to make calls and log the requests in cURL style, so you can easily check and reproduce the calls outside the application. Returns Promise objects instead of pass simple callbacks, so you can handle the result in a more "fashion" way, chain the result easily, and handle errors in a standard way. Also removes a lot of boilerplate configurations on each request: base URL, time out, content type format, default headers, parameters and query binding in the URL, and basic cache features. This is an example of how to initialize it, make a call and log the operation with curl style: var RequestClient = require("reqclient").RequestClient; var client = new RequestClient({ baseUrl:"http://baseurl.com/api/", debugRequest:true, debugResponse:true}); client.post("client/orders", {"client": 1234, "ref_id": "A987"},{"x-token": "AFF01XX"}); This will log in the console... [Requesting client/orders]-> -X POST http://baseurl.com/api/client/orders -d '{"client": 1234, "ref_id": "A987"}' -H '{"x-token": "AFF01XX"}' -H Content-Type:application/json And when the response is returned ... [Response client/orders]<- Status 200 - {"orderId": 1320934} This is an example of how to handle the response with the promise object: client.get("reports/clients") .then(function(response) { // Do something with the result }).catch(console.error); // In case of error ... Of course, it can be installed with: npm install reqclient.
You can use curlrequest to easily set what time of request you want to do... you can even set headers in the options to "fake" a browser call.
Warning: As of Feb 11th 2020, request is fully deprecated. If you implement with form-data, for more info (https://tanaikech.github.io/2017/07/27/multipart-post-request-using-node.js): var fs = require('fs'); var request = require('request'); request.post({ url: 'https://slack.com/api/files.upload', formData: { file: fs.createReadStream('sample.zip'), token: '### access token ###', filetype: 'zip', filename: 'samplefilename', channels: 'sample', title: 'sampletitle', }, }, function (error, response, body) { console.log(body); });
I found superagent to be really useful, it is very simple for example const superagent=require('superagent') superagent .get('google.com') .set('Authorization','Authorization object') .set('Accept','application/json')
Update from 2022: from node.js version v18 on you can use the globally available fetch API (see https://nodejs.org/en/blog/announcements/v18-release-announce/) There is also an example usage included on their announcement page: const res = await fetch('https://nodejs.org/api/documentation.json'); if (res.ok) { const data = await res.json(); console.log(data); }