In the new twitter media upload api said
First, use POST multipart/form-data or base64 encoded files to .1/media/upload.json.
but get error : code 38 "media parameter is missing."
here is my code
var Twitter = require('./twitter.js');
var request = require('request');
var fs = require('fs');
var path = require('path');
var FormData = require('form-data');
var utf8 = require('utf8');
var base64_encode = require('base64').encode;
var oauth = {
consumer_key: '',
consumer_secret: '',
token: '',
token_secret: ''
};
var form = new FormData();
fs.readFile(__dirname + '/image.jpg', function(err, data) {
if (err) {
throw err;
}
var encoded = base64_encode(data);
form.append('media[]', encoded); // I've also tried media instead of media[]
form.getLength(function(err, length) {
var r = request.post({
url: '.1/media/upload.json',
oauth: oauth,
}, function(error, response, body) {
if (error) {
console.error(error);
return;
}
console.dir(body);
});
r._form = form;
r.setHeader('content-length', length);
});
});
I reuse code from this topic : Upload images to twitter API from node.js
Any suggestion? Thank you
In the new twitter media upload api said
First, use POST multipart/form-data or base64 encoded files to https://upload.twitter./1.1/media/upload.json.
but get error : code 38 "media parameter is missing."
here is my code
var Twitter = require('./twitter.js');
var request = require('request');
var fs = require('fs');
var path = require('path');
var FormData = require('form-data');
var utf8 = require('utf8');
var base64_encode = require('base64').encode;
var oauth = {
consumer_key: '',
consumer_secret: '',
token: '',
token_secret: ''
};
var form = new FormData();
fs.readFile(__dirname + '/image.jpg', function(err, data) {
if (err) {
throw err;
}
var encoded = base64_encode(data);
form.append('media[]', encoded); // I've also tried media instead of media[]
form.getLength(function(err, length) {
var r = request.post({
url: 'https://upload.twitter./1.1/media/upload.json',
oauth: oauth,
}, function(error, response, body) {
if (error) {
console.error(error);
return;
}
console.dir(body);
});
r._form = form;
r.setHeader('content-length', length);
});
});
I reuse code from this topic : Upload images to twitter API from node.js
Any suggestion? Thank you
Share Improve this question edited May 23, 2017 at 12:30 CommunityBot 11 silver badge asked Oct 13, 2014 at 13:05 Methuz Kaewsai-kaoMethuz Kaewsai-kao 1,2762 gold badges12 silver badges23 bronze badges 2-
Did you try just
media
and notmedia[]
? – mscdex Commented Oct 13, 2014 at 13:17 - Yes, I did. Same result. – Methuz Kaewsai-kao Commented Oct 13, 2014 at 13:43
2 Answers
Reset to default 6Here is what I use to upload media :
(I only use OAuth to create Oauth authentification)
I also add /statuses/update.json to link a new post to your media.
var oauth = require('oauth');
var fs = require('fs');
var a = new oauth.OAuth("https://twitter./oauth/request_token",
"https://twitter./oauth/access_token",
config.consumerKey,
config.consumerSecret,
"1.0",
config.callbackUrl,
"HMAC-SHA1");
a.post("https://upload.twitter./1.1/media/upload.json", oauth_access_token, oauth_access_token_secret, {media:fs.readFileSync(file_path).toString("base64")} ,"" , function (e, data, res){
if (e) {
console.error(e);
}else {
try{
data = JSON.parse(data);
}catch (e){
console.error("Error Json : " + e);
}
console.log(data.media_id);
a.post("https://api.twitter./1.1/statuses/update.json", oauth_access_token, oauth_access_token_secret, {status:message,media_ids:[data.media_id_string]}, "", function (e, data, res){
if (e) {
console.error(e);
}else {
console.log("Success");
}
});
}
});
Have Fun
PHP solution
Libraries taken from here: https://github./abraham/twitteroauth Check your image limit here: https://dev.twitter./rest/reference/get/help/configuration
The glitch is to send base64_encode data and the size to not exceed the image limitation (default is 3MB) otherwise you will receive "not recognized." error.
Here is the code (only the image upload thing) which worked for me: require_once('includes/twitter/twitteroauth.php');
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_SECRET);
$filePath = '/absolute path to the file/';
$url = 'https://upload.twitter./1.1/media/upload.json';
$method = 'POST';
$parameters = array(
'media' => base64_encode(file_get_contents($filePath)),
);
$request = OAuthRequest::from_consumer_and_token($connection->consumer, $connection->token, $method, $url, $parameters);
$request->sign_request($connection->sha1_method, $connection->consumer, $connection->token);
$response = $connection->http($request->get_normalized_http_url(), $method, $request->to_postdata());
if ($connection->format === 'json' && $connection->decode_json) {
$response = json_decode($response);
}
print_r($response);