2

您好
,我正在尝试获取 Facebook 用户的专辑封面图片。
正如 API 页面中所说,它在获取时返回“带有专辑封面图片 URL 的 HTTP 302”:
http s://graph.facebook.com/[album_id]}/picture?access_token=blahblahblah...
这里的文件:http: //developers.facebook.com/docs/reference/api/album

我已经尝试过 HTTParty、Net:HTTP 以及 RedirectFollower 类
HTTParty 返回图片图像本身,并且在任何地方都没有“位置”(URL)信息
NET:HTTP 和 RedirectFollower 有点棘手......
如果我不使用 URI .encode 将 URL 传递给 get 方法时,会导致“bad uri”错误
,但如果我使用 URI.encode 传递编码的 URI,则会导致 EOFError(到达文件末尾)
令人惊奇的是我可以看到位置 URL使用 apigee 的 FB API 时

这是 Net:HTTP 文档中推荐的重定向方法:
有什么需要修改的吗?或者有没有更简单的方法来做到这一点?谢谢你!!

def self.fetch(uri_str, limit = 10)
  response = Net::HTTP.get_response(URI.parse(uri_str))
  case response
    when Net::HTTPSuccess     then response
    when Net::HTTPRedirection then fetch(response['location'], limit - 1)
  else
    response.error!
  end
end
4

2 回答 2

3

如果您不介意使用宝石,curb将为您执行此操作。这都是关于使用follow_location参数的:

gem 'curb'
require 'curb'

# http://www.stackoverflow.com/ redirects to http://stackoverflow.com/

result = Curl::Easy.http_get("http://www.stackoverflow.com/") do |curl|
 curl.follow_location = true
end

puts result.body_str

不过,这不是唯一具有此功能的库。

需要注意的是,很多时候你会在标题中得到一个无效的位置,并且它必须由用户代理解释以将其呈现为有用的东西。像这样的标头Location: /需要在被获取之前被重写。其他时候你会得到一个像这样的标题Location: uri=...,你必须从那里拉出位置。最好把它留给你的图书馆,而不是自己重写。

于 2010-12-07T18:38:21.443 回答
2

这是我经过反复试验后得到的结果:

uri_str = URI.encode(https://graph.facebook.com/[album_id]}/picture?access_token=blahblahblah...)

result = Curl::Easy.http_get(uri_str) do |curl|
  curl.follow_location = false
end
puts result.header_str.split('Location: ')[1].split(' ')[0]

返回的 header_str 看起来像
“HTTP blah blah blah Location: http://xxxxxxx/xxxx.jpg blah blah blah”
所以我设法通过使用 2 split() 获取 URL
最终结果是一个干净的 URL
,也是 curl.follow_location应该是假的,所以它不会返回该页面的正文

于 2010-12-08T15:58:25.040 回答