在我的应用中,我让用户发布到Twitter。现在我想让他们用媒体更新他们的状态。
在twython.py
我看到一个方法update_status_with_media
,它从文件系统读取图像并上传到twitter。我的图像不在文件系统中,而是在S3存储桶中。
如何使用S3存储桶网址进行此操作?
在file_
变量中传递url,IO错误失败,没有这样的文件或目录。
在UnicodeDecode错误上传递StringIO失败。
传递urllib.urlopen(url).read()
会file() argument 1 must be encoded string without NULL bytes, not str
。
我也尝试使用post
方法,从twitter api获得403 Forbidden,创建状态时出错。
刚刚解决了
呸,终于让它上班了!也许它会帮助别人节省几个小时的费用。
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))})
答案 0 :(得分:1)
很高兴看到你找到了答案!我们最近在 repo issue 中处理了类似的问题 - 基本上,您可以使用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))
})
这不是你问题的直接答案,所以我不期待任何投票或任何事情,但认为它对某些人来说似乎有用,而且有些相关,所以我会删掉一张便条。