2011-11-18 88 views
1

我在Ruby 1.8.7中使用Sinatra 1.2.6,我有一些類似於我正在編寫的Twitter客戶端。我使用John Nunemaker編寫的版本爲1.7.2的Twitter gem。對於數據庫ORM,我使用的是Sequel 3.29.0。嘗試在Sinatra上通過POST將圖片上傳到Twitter的問題

總的來說,事情都很好。我有一個很好的Oauth序列,任何通過Oauth過程的用戶都可以將Tweets發佈到我的應用程序中。

我不能爲我的生活獲得媒體上傳使用update_with_media。我試圖上傳一個多部分的八位字節流圖像文件,將其保存在內存中,然後將其提供給Twitter。

post '/file_upload' do 
    user_name = params[:user] 
    if params[:action] == "FILE-UPLOAD" 
    unless params[:name].match(/\.jpg|png|jpeg/).nil? 

      #Assume these 3 lines work, and properly authorize to Twitter 
     current_user = User[:user_name => user_name, :current_account => "1"] 
     client = current_user.authorize_to_twitter #Handles the Oauth keys/process 
      client.update("Text status updates work properly") 

      #Something incorrect is happening in the next two lines. 
      #I'm either handling the file upload wrong, or posting wrong to Twitter 
     datafile = params[:file] 
     client.update_with_media("File upload from Skype: ", datafile) 
     return "File uploaded ok" 
    end 
    end 
end 

然而,當我嘗試這一點,我越來越:

Twitter::Unauthorized - POST https://upload.twitter.com/1/statuses/update_with_media.json: 401: Could not authenticate with OAuth. 

它說造成這個錯誤的行是client.update_with_media線。

我想使用Rack::RawUpload,但我不知道我是否正確使用它。如果我不需要使用它,我不會,但我現在只是卡住了。這段代碼片段之外唯一使用它的就是我的代碼頂部:

require 'rack/raw_upload' 
use Rack::RawUpload 

對此的任何幫助將得到大量讚賞。我嘗試過使用Tempfile.new(),但是這似乎沒有太大的幫助,而且我得到401或403錯誤。我對Ruby相當陌生,所以儘可能清楚地瞭解所需的更改會非常有幫助。

我應該注意,如果可能的話,我想避免將文件放在文件系統上。我真的只是在這裏傳遞上傳文件,之後我不需要在我的場景中訪問磁盤上的文件。保持內存中的文件是首選。

+0

您的twitter應用程序是否有權上傳圖片的權限? – djd

+0

也許是一個愚蠢的問題,但是raw_upload做多部分POST上傳是正確的嗎? – aitchnyu

+0

如果您只是從簡單的腳本上傳媒體,您的代碼是否可以工作? (與Sinatra應用程序相反)。關於Rack :: RawUpload(我是作者),我想說,你首先嚐試沒有它來簡化事情,用正常的文件上傳。只有然後添加它爲鐘聲和口哨。 – pablobm

回答

0

您需要檢查您的庫HTTP標頭是如何設置的,並在邏輯上連接到您在此處編寫的POST方法。問題是,對於upload_with_media,這個gem版本中的twitter api需要你使用http://upload.twitter.com上傳端點,而不是默認的api端點。 當基於OAuth的狀態更新正常工作時,gem可能會強制api網站,所以當您嘗試使用圖像時,它會崩潰。您將需要檢查gem文檔以瞭解如何強制將上載twitter站點插入此方法的HTTP標頭中。

或者,考慮更新到最新的twitter gem。這是我從http://rdoc.info/gems/twitter

了Twitter的API ::#update_with_media方法不再使用自定義upload.twitter.com端點,所以media_endpoint配置已被刪除。同樣,Twitter :: API#搜索方法不再使用自定義search.twitter.com端點,因此search_endpoint配置也被刪除。

+0

這是與舊的API。在v1.1中,url是api.twitter.com。即使我使用twitter gem,並面臨同樣的錯誤。 當我嘗試發送文件時,它顯示「無法驗證你」。 看來,它發佈此請求時不發送授權/驗證參數。 看到這個,https://github.com/sferik/twitter/issues/306 – Parth