2013-05-13 61 views
3

在我的應用程序中,我讓用戶發佈到twitter。現在我想讓他們更新媒體的狀態。Twython - 如何使用媒體網址更新狀態

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方法,並得到了403禁止從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))}) 

回答

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

這不是直接回答你的問題,所以我沒有期待任何投票或任何事情,但認爲它對一些人看起來有用,並且有點相關,所以我會放下一張紙條。

+0

實際上這是什麼給了我想法如何解決它。我在回答問題的過程中看到了它。但是我使用'urllib.urlopen()。read()'和'StringIO'一起出現問題,在UnicodeDecodeError失敗。首先同樣發生了請求,因爲我使用'requests.get(...).text'的時候,我應該使用'requests.get(...)。content'。 – Neara 2013-05-14 06:43:13