簡體   English   中英

從node.js將圖像上傳到Twitter API

[英]Upload images to twitter API from node.js

我正在嘗試將圖像發布到twitter api v1.1上,我已經嘗試了幾乎所有示例,但似乎沒有任何內容可以發布。 包括使用Oauth在Node.js中將圖像發布到Twitter

我正在使用那里提到的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;
}
 }

如果無法完成,請解釋一下原因嗎? 否則,任何可以引導我朝正確方向發展的事情都會很棒。

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”問題和其他字符。

我尚未測試過這些代碼。它來自我的同事。請確保代碼正在運行。 也許這會有所幫助。

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

                            }
                        }
                    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM