根据Facebook图形API,我们可以使用此示例请求用户个人资料图片:
https://graph.facebook.com/1489686594/picture
但上一个链接的真实图片网址是:
http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs356.snc4/41721_1489686594_527_q.jpg
如果您在浏览器上输入第一个链接,它会将您重定向到第二个链接。
有没有办法通过知道第一个URL来获取Ruby / Rails的完整URL(第二个链接)?
(这是this question的重复,但对于Ruby)
答案 0 :(得分:37)
这已经得到了正确回答,但有一种更简单的方法:
res = Net::HTTP.get_response(URI('https://graph.facebook.com/1489686594/picture'))
res['location']
答案 1 :(得分:13)
您可以使用Net :: Http并从响应中读取Location:
标头
require 'net/http'
require 'uri'
url = URI.parse('http://www.example.com/index.html')
res = Net::HTTP.start(url.host, url.port) {|http|
http.get('/index.html')
}
res['location']
答案 2 :(得分:9)
你有HTTPS网址,所以你会处理......
require 'net/http'
require 'net/https' if RUBY_VERSION < '1.9'
require 'uri'
u = URI.parse('https://graph.facebook.com/1489686594/picture')
h = Net::HTTP.new u.host, u.port
h.use_ssl = u.scheme == 'https'
head = h.start do |ua|
ua.head u.path
end
puts head['location']
答案 3 :(得分:3)
我知道这是一个老问题,但我会为后代添加这个答案:
我见过的大多数解决方案只遵循一次重定向。就我而言,我必须遵循多个重定向才能获得实际的最终目标网址。我使用Curl(通过Curb gem)像这样:
result = Curl::Easy.perform(url) do |curl|
curl.head = true
curl.follow_location = true
end
result.last_effective_url
答案 4 :(得分:2)
您可以检查响应状态代码并使用get_final_redirect_url
方法递归获取最终网址:
require 'net/http'
def get_final_redirect_url(url, limit = 10)
uri = URI.parse(url)
response = ::Net::HTTP.get_response(uri)
if response.class == Net::HTTPOK
return uri
else
redirect_location = response['location']
location_uri = URI.parse(redirect_location)
if location_uri.host.nil?
redirect_location = uri.scheme + '://' + uri.host + redirect_location
end
warn "redirected to #{redirect_location}"
get_final_redirect_url(redirect_location, limit - 1)
end
end
我遇到了同样的问题。我解决了它并围绕它构建了一个宝石final_redirect_url,这样每个人都可以从中受益。
您可以找到有关使用here的详细信息。
答案 5 :(得分:0)
是的,“位置”响应标题会告诉您实际的图片网址。
但是,如果您在网站上将图片用作用户的个人资料图片,我建议您使用“https://graph.facebook.com/:user_id/picture”样式网址而不是实际图片网址。 否则,您的用户将来会看到大量“未找到”的图片或过时的个人资料图片。
您只需将“https://graph.facebook.com/:user_id/picture”作为“img”标记的“src”属性。 他们浏览器获取用户的更新图像。
PS。 Twitter和我在我的网站上遇到了这样的麻烦。雅虎OpenID现在..
答案 6 :(得分:0)
如果您想要的解决方案是:
require 'net/http'
require 'uri'
def follow_redirections(url)
response = Net::HTTP.get_response(URI(url))
until response['location'].nil?
response = Net::HTTP.get_response(URI(response['location']))
end
response.uri.to_s
end
# EXAMPLE USAGE
follow_redirections("https://graph.facebook.com/1489686594/picture")
# => https://static.xx.fbcdn.net/rsrc.php/v3/yo/r/UlIqmHJn-SK.gif