Tweeting w / media терпит неудачу при использовании облачных функций Firebase - PullRequest
0 голосов
/ 07 июня 2018

Мой веб-проект Firebase работает уже несколько месяцев.Но в воскресенье 3 июня 2018 года мое приложение перестало отправлять твиты с прикрепленными медиа-файлами (изображениями).До этого он работал несколько месяцев.Я не изменил код ошибки до 3-го, и я даже вернулся к коду, который работал до этой даты, но приложение все еще не работает: (

версии SDK: Я использую больше всегона сегодняшний день версии инструментов Firebase (3.18.6) и облачных функций (1.0.3). Наряду с twit (2.2.10) библиотека javascript для Twitter API. Обратите внимание, что мой проект также работал над старыми версиями выше, в том числедо v1.0 облачных функций. Также обратите внимание, что я все еще могу отправлять обычные текстовые твиты, но не с любым медиа (image, gif, mp4).

Это в основном относится к API Twitter, но я не могу управлятьчто-то необычное в среде Firebase Node.js.

Как воспроизвести: Для простоты я сошлюсь на код в учебнике, который я изначально использовал при запуске проекта.

Настройте учетную запись в Твиттере и получите все необходимые токены, как описано в учебном пособии, а затем просто вызовите облачную функцию ниже, и она попытается написать в ТвиттереИзображение дня НАСА.

Функция может загрузить изображение на сервер Twitter, и ожидается ответ, который я получу:

{ media_id: 1004461244487643100,
  media_id_string: '1004461244487643136',
  media_key: '5_1004461244487643136',
  size: 92917,
  expires_after_secs: 86400,
  image: { image_type: 'image/jpeg', w: 960, h: 1318 } }

Однако, как только он попытается опубликовать твитс подключенным носителем я получаю сообщение об ошибке

код 324: «Неподдерживаемая категория необработанного носителя»

, которого нет в документах Twitter: https://developer.twitter.com/en/docs/basics/response-codes.html

Теперь, код 324 существует, но в документации Twitter есть другое описание:

"Проверка идентификаторов медиа не удалась"

Что у меня еще естьполучить.Итак, мой медиа-идентификатор действителен, значит, что-то еще не так?Где бы в Интернете я не мог найти кого-то с этой точной ошибкой.

Ссылка на учебный код: https://medium.freecodecamp.org/how-to-build-and-deploy-a-multifunctional-twitter-bot-49e941bb3092

Javascript код, который воспроизводит проблему: ** index.js

'use strict';
const functions = require('firebase-functions');
const request = require('request');
const path = require('path');
const os = require('os');
const fs = require('fs');
const tmpDir = os.tmpdir(); // Ref to the temporary dir on worker machine

const Twit = require('twit');

const T = new Twit({
    consumer_key: 'your twitter key'
    ,consumer_secret: 'your twitter secret'
    ,access_token: 'your twitter token'
    ,access_token_secret: 'your twitter token secret'
});

exports.http_testMediaTweet = functions.https.onRequest((req, res) => {

    function getPhoto() {
        const parameters = {
            url: 'https://api.nasa.gov/planetary/apod',
            qs: {
                api_key: 'DEMO_KEY'
            },
            encoding: 'binary'
        };
        request.get(parameters, (err, response, body) => {
            if (err) {console.log('err: ' + err)}
            body = JSON.parse(body);
            var f = path.join(tmpDir, 'nasa.jpg');
            saveFile(body, f);
        });
    }

    function saveFile(body, fileName) {
        const file = fs.createWriteStream(fileName);
        request(body).pipe(file).on('close', err => {
          if (err) {
            console.log(err)
          } else {
            console.log('Media saved! '+body.title)
            const descriptionText = body.title
            uploadMedia(descriptionText, fileName);
          }
        })
    }

    function uploadMedia(descriptionText, fileName) {
        const filePath = path.join(__dirname, `../${fileName}`)
        console.log(`uploadMedia: file PATH ${fileName}`)
        T.postMediaChunked({
          file_path: fileName
        }, (err, data, respone) => {
          if (err) {
            console.log(err)
          } else {
            console.log(data)
            const params = {
              status: descriptionText,
              media_ids: data.media_id_string
            }
            postStatus(params);
          }
        })
    }

    function postStatus(params) {
        T.post('statuses/update', params, (err, data, respone) => {
          if (err) {
            console.log(err)
            res.status(500).send('Error: ' + err);
          } else {
            console.log('Status posted!')
            res.status(200).send('success');
          }
        })
    }

    // Do thing
    getPhoto();

});

Я надеялся запустить свое приложение на следующей неделе, но это стало для меня серьезной проблемой.Я перепробовал все, что мог придумать, и просмотрел документы для Twitter и библиотеки js, но, похоже, все делаю правильно.Надеюсь, кто-то может пролить свет на это, спасибо.

...