3

在我的应用程序中,我让用户在 Twitter 上发帖。现在我想让他们通过媒体更新他们的状态。

twython.py我看到一种update_status_with_media从文件系统读取图像并上传到 twitter 的方法。我的图像不在文件系统中,而是在 S3 存储桶中。

如何使用 S3 存储桶 url 进行这项工作?

在变量中传递 url file_,在 IO 错误时失败,没有这样的文件或目录。

由于 UnicodeDecode 错误,传递 StringIO 失败。

传球urllib.urlopen(url).read()file() argument 1 must be encoded string without NULL bytes, not str.

我也尝试使用post方法并从 twitter api 获得 403 Forbidden,Error 创建状态。

刚刚解决了

呸,终于开始工作了!也许它会帮助其他人节省我花费的几个小时。

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))})
4

1 回答 1

1

很高兴看到你找到了答案!我们最近在一个repo 问题中处理了一个类似的问题- 基本上,您可以使用 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))
})

这不是您问题的直接答案,所以我不期待任何投票或任何事情,但认为它对某些人似乎有用并且有些相关,所以我会记下。

于 2013-05-14T05:41:01.127 回答