Twython - Как обновить статус с помощью URL-адреса мультимедиа

В моем приложении я разрешаю пользователям публиковать сообщения в твиттере. Теперь я хотел бы позволить им обновить свой статус с помощью средств массовой информации.

В twython.py я вижу метод update_status_with_media, который считывает изображение из файловой системы и загружает его в твиттер. Мои изображения находятся не в файловой системе, а в корзине S3.

Как заставить это работать с URL-адресами корзины S3?

Передача URL-адреса в переменной file_ завершается ошибкой ввода-вывода, такого файла или каталога нет.

Передача StringIO завершается ошибкой UnicodeDecode.

Прохождение urllib.urlopen(url).read() дает file() argument 1 must be encoded string without NULL bytes, not str.

Я также пытался использовать метод post и получил 403 Forbidden from twitter api, Ошибка при создании статуса.

Просто решил

Ба, наконец-то заработало! Может быть, это поможет кому-то еще сэкономить несколько часов, которые стоили мне.

twitter = Twython(
        app_key=settings.TWITTER_CONSUMER_KEY, app_secret=settings.TWITTER_CONSUMER_SECRET,
        oauth_token=token.token, oauth_token_secret=token.secret
    )
img = requests.get(url=image_obj.url).content
tweet = twitter.post('statuses/update_with_media',
                                 params={'status': msg},
                                 files={'media': (image_obj.url,
                                                  BytesIO(img))})

person Neara    schedule 13.05.2013    source источник


Ответы (1)


Рад видеть, что вы нашли ответ! Есть аналогичная проблема, которую мы недавно обрабатывали в выпуске репо. - в принципе, вы можете сделать следующее с StringIO и передать его непосредственно в twitter.post, как вы это сделали:

from StringIO import StringIO
from twython import Twython

t = Twython(...)
img = open('img_url').read()
t.post('/statuses/update_with_media', params = {'status': 'Testing New Status'}, files = {
    'media': StringIO(img)
    # 'media': ('OrThisIfYouWantToNameTheFile.lol', StringIO(img))
})

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

person Ryan McGrath    schedule 14.05.2013
comment
на самом деле это то, что дало мне идею, как решить эту проблему. Я видел это во время моего поиска после ответа. Но у меня возникли проблемы с использованием urllib.urlopen().read() вместе с StringIO, и я продолжал терпеть неудачу на UnicodeDecodeError. То же самое произошло сначала с запросами, потому что я выбрал requests.get(...).text, когда должен был использовать requests.get(...).content. - person Neara; 14.05.2013