简体   繁体   English

从Twitter媒体的URL读取readFileSync-node.js

[英]readFileSync from an URL for Twitter media - node.js

I need to use an URL to import a media to Twitter. 我需要使用URL将媒体导入Twitter。 But I can't figure out how to use an URL without having to download the image, save it temporarily on the server and deleted after... 但是我无法弄清楚如何使用URL而不需要下载图像,将其临时保存在服务器上并在之后删除...

I'm using Google Cloud to store the images that's why I can't access it directly. 我正在使用Google Cloud存储图像,这就是为什么我不能直接访问它的原因。

That's what I'm trying to do : 那就是我想要做的:

var data = require('fs').readFileSync('https://www.example.com/image.png');

//Create the Twitter client
const client = new Twitter({
  consumer_key: process.env.consumer_key_dev,
  consumer_secret: process.env.consumer_secret_dev,
  access_token_key: user.val().access.token,
  access_token_secret: user.val().access.secret
});

// Make post request on media endpoint. Pass file data as media parameter
return client.post('media/upload', {media: data}, function(error, media, response) {

  if (!error) {

    // If successful, a media object will be returned.
    console.log(media);

    // Lets tweet it
    var status = {
      status: sendTweet,
      media_ids: media.media_id_string // Pass the media id string
    }

    return client.post('statuses/update', status, function(error, tweet, response) {
      if (!error) {
        console.log(tweet);
      }
    });

  }
});

But I get this error : 但是我得到这个错误:

ERROR: { Error: ENOENT: no such file or directory, open 'https://storage.googleapis.com/...

Any idea on how I should do it? 关于我应该怎么做的任何想法?

The problem you have here is that trying you're using the 'File System (fs)' module to access a location not in your file system. 您遇到的问题是,尝试使用“文件系统(fs)”模块访问文件系统中以外的位置。

You would solve the getting of the image using the ' http ' or ' https ' modules. 您可以使用“ http ”或“ https ”模块解决获取图像的问题。 An example of usage would be: 用法示例如下:

const https = require('https');

function getImage(url, callback) {
    https.get(url, res => {
        // Initialise an array
        const bufs = [];

        // Add the data to the buffer collection
        res.on('data', function (chunk) {
            bufs.push(chunk)
        });

        // This signifies the end of a request
        res.on('end', function () {
            // We can join all of the 'chunks' of the image together
            const data = Buffer.concat(bufs);

            // Then we can call our callback.
            callback(null, data);
        });
    })
    // Inform the callback of the error.
    .on('error', callback);
}

// Then you 'get' your image like so:
getImage('https://www.example.com/image.png', function (err, data) {
    // Handle the error if there was an error getting the image.
    if (err) {
        throw new Error(err);
    }

    // Now you can use the rest of your code here:
    const client = new Twitter({ ... });
    // etc.
    // I've removed the rest because of size.
    return client.post(
        'media/upload',
        {media: data},
        function(error, media, response) {
            // ...
        }
    );
})

You cannot do http requests synchronously, and I strongly advise you try to avoid synchronous requests because of blocking ( https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/ ). 您不能同步执行http请求,因此我强烈建议您避免由于阻塞而避免同步请求( https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/ )。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM