从node.js将图像上传到twitter API

时间:2014-05-15 06:03:29

标签: javascript node.js http twitter

我正试图将图片发布到twitter api,v1.1上 我已经尝试了所有的例子,似乎没有任何东西可以发布它。 包括Posting images to twitter in Node.js using Oauth

我正在使用那里提到的oauth库,我也有jsOauth,我认为我会根据https://gist.github.com/lukaszkorecki/1038408给出一个镜头

什么都没有奏效,此时我开始对是否能做到这一点失去希望。

 function postStatusWithMedia(status, file) {
var err = new Object();
if(fs.existsSync(file) === false) {
    err.message = "File not found :(";
    parseTwitterError(err);
} else {
    var oauth = OAuth(options = {
        "consumerKey": consumer_key,
        "consumerSecret": consumer_secret,
        "accessTokenKey": access_token,
        "accessTokenSecret": access_token_secret
    });

    callbacks = {
                onSuccess : function() {
                    console.log('upload worked!')
                },
                onFailure : function() {
                    console.log('upload failed!');
                    console.dir(arguments);
                }
    },

    uploadData = {
        'status' : status,
        'media' : Base64.encode(fs.readFileSync(file))
    };

        oauth.post('https://api.twitter.com/1.1/statuses/update_with_media.json',uploadData, callbacks.onSuccess, callbacks.onFailure);

    return false;
}
 }

如果无法完成,请解释为什么? 否则,任何能够引导我走向正确方向的事情都会很棒。

2 个答案:

答案 0 :(得分:2)

var fs = require('fs');
var request = require('request');
var FormData = require('form-data');
var utf8 = require('utf8');

// Encode in UTF-8
status = utf8.encode(status);

var form = new FormData();
form.append('status', status)
form.append('media[]', fs.createReadStream(file));

// Twitter OAuth
form.getLength(function(err, length){
    if (err) {
        return requestCallback(err);
    }
    var oauth = { 
            consumer_key: consumer_key,
            consumer_secret: consumer_secret,
            token: access_token,
            token_secret: access_token_secret
    };
    var r = request.post({url:"https://api.twitter.com/1.1/statuses/update_with_media.json", oauth:oauth, host: "api.twitter.com", protocol: "https:"}, requestCallback);
    r._form = form;
    r.setHeader('content-length', length);
});

function requestCallback(err, res, body) {
    if(err) {
        throw err;
    } else {
        console.log("Tweet and Image uploaded successfully!");
    }
}

我最终使用requestnode-form-data手动构建multipart / form-data请求,并使用状态请求发送它,utf8用于将状态编码为UTF-8 ,没有这样做导致问题与'< 3'和其他人物。

答案 1 :(得分:0)

我没有测试过这些代码。来自我的同事。该代码正在运行。 也许这会有所帮助。

// twitter_update_with_media.js

   (function() {
    var fs, path, request, twitter_update_with_media;

    fs = require('fs');

    path = require('path');

    request = require('request');


    twitter_update_with_media = (function() {
        function twitter_update_with_media(auth_settings) {
            this.auth_settings = auth_settings;
            this.api_url = 'https://api.twitter.com/1.1/statuses/update_with_media.json';
        }

        twitter_update_with_media.prototype.post = function(status, imageUrl, callback) {
            var form, r;
            r = request.post(this.api_url, {
                oauth: this.auth_settings
            }, callback);
            form = r.form();
            form.append('status', status);
            return form.append('media[]', request(imageUrl));
        };

        return twitter_update_with_media;

    })();

    module.exports = twitter_update_with_media;
}).call(this);

下一个文件                //upload_to_twitter.js

            var tuwm = new twitter_update_with_media({
                consumer_key: TWITTER_OAUTH_KEY,
                consumer_secret: TWITTER_OAUTH_SECRET,
                token: access[0],
                token_secret: access[1]
            });

    media_picture.picture = imageURL;

                if (media_picture.picture) {
                    console.log('with media upload');

                    request.head(media_picture.picture,
                        function (error, response, body) {
                        if (!error && response.statusCode == 200) {
                            var image_size = response.headers['content-length'];
                            if (image_size > 2000000) { // 2mb max upload limit
                                console.log('greater than 2mb');
                                sendMessageWithoutImage(err, req, res, next, twit, wallpost, access);

                            } else {
                                console.log('less than 2mb');
                                console.log('twitter text', content);
                                tuwm.post(content, media_picture.picture, function(err, response) {
                                    if (err) {
                                        console.log('error', err);
                                        return next(err);
                                    }
                                    error_parse = JSON.parse(response.body);
                                    console.log('with media response', response.body);

                                    if (error_parse.errors) {
                                        console.log('have errors', error_parse);
                                        res.json({
                                            status: 500,
                                            info: error_parse.errors[0].code + ' ' + error_parse.errors[0].message

                                        });
                                    } else {
                                        res.json({
                                            status: 200,
                                            info: "OK",
                                            id: response.id
                                        });
                                    }
                                });

                            }
                        }
                    });