我在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很新,所以尽可能明确地了解所需的更改会非常有用。
我应该注意,如果可能的话,我想避免将文件放在文件系统上。我真的只是在这里传递上传,然后我不需要在我的场景中访问磁盘上的文件。将文件保存在内存中是首选。
答案 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配置也已被删除。