最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Twitter image upload error : media parameter is missing - Stack Overflow

programmeradmin2浏览0评论

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 not media[]? – mscdex Commented Oct 13, 2014 at 13:17
  • Yes, I did. Same result. – Methuz Kaewsai-kao Commented Oct 13, 2014 at 13:43
Add a ment  | 

2 Answers 2

Reset to default 6

Here 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);
发布评论

评论列表(0)

  1. 暂无评论