有没有一种使用媒体资源的URL将媒体上传到Twitter API的方法?

时间:2018-08-06 00:49:18

标签: twitter google-cloud-storage google-cloud-functions

我创建了一个应用程序,允许用户将其图像上传到Google Cloud Storage存储桶-然后将其用于社交媒体共享预览。

使用Firebase API,将图像从用户的浏览器直接上传到存储桶。

我还想做的是-保存图像时-自动将该图像发布到我的应用程序的Twitter提要中。

我执行此操作的方法是在Cloud Storage上使用Cloud Function触发器-下载图像,然后通过Twitter API上传。

本质上是不必要的流量双重处理,有没有办法让Twitter API公开文件的公共位置,并让其直接获取文件?

这是当前解决方案的代码:

class Defferred {

  constructor() {

    const that = this;
    this.prom = new Promise((resolve, reject) => {
      that.resolve = resolve;
      that.reject = reject;
    });
  }
}

exports.onNewImage = functions.storage.object().onFinalize((object) => {

  const prom = new Defferred();
  bucket.file(object.name).download((err, file, response) => {

    if (err) {
      return prom.reject(err);
    } else {
      twitterClient.post('media/upload', {
        media: file
      }, (err, media, response) => {
        if (!err) {
          let status = {
            status: "Somebody created this at https://geoplanets.io #geometry #geometricart",
            media_ids: media.media_id_string
          }

          twitterClient.post('statuses/update', status, (error, tweet, response) => {
            if (!error) {
              return prom.resolve(response);
            } else {
              return prom.reject(error);
            }

          });
        } else {
          return prom.reject(err);;
        }
      });

    }

  });
  return prom.prom;

});

是否存在不涉及下载文件的替代方法? -一个好的答案将突出显示API文档的相关部分,这些部分将突出显示我将如何自己解决这个问题。

1 个答案:

答案 0 :(得分:3)

Twitter节点api无法简单地传递URL进行媒体上传。他们给的example显示了您现在正在做什么-随请求一起发送全部内容。

节点客户端只是REST API的包装,如果您read its docs,您将看到必须将文件内容直接提供给POST。