尝试在Sinatra中通过POST将图像上传到Twitter的问题

时间:2011-11-18 04:49:04

标签: ruby twitter upload oauth sinatra

我在Ruby 1.8.7中使用Sinatra 1.2.6,我正在编写类似Twitter客户端的东西。我正在使用John Nunemaker编写的Twitter gem版本1.7.2。对于数据库ORM,我正在使用Sequel 3.29.0。

总的来说,事情进展顺利。我有一个很好的Oauth序列工作,任何经过Oauth流程的用户都可以将推文发布到我的应用程序中。

但是,对于我的生活,我不能使用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很新,所以尽可能明确地了解所需的更改会非常有用。

我应该注意,如果可能的话,我想避免将文件放在文件系统上。我真的只是在这里传递上传,然后我不需要在我的场景中访问磁盘上的文件。将文件保存在内存中是首选。

1 个答案:

答案 0 :(得分:0)

您需要检查库HTTP标头的设置方式,并在逻辑上连接到您在此处编写的POST方法。问题是对于upload_with_media,此gem版本中的twitter api要求您使用http://upload.twitter.com上传端点而不是默认的api端点。 gem可能正在强制api站点,因此当基于OAuth的状态更新正常工作时,它会在您使用图像进行尝试时崩溃。您将需要检查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配置也已被删除。