如何使用Ruby获取缩短URL的目标URL?

如何获取此URL http://t.co/yjgxz5Y并获取目标urlhttp://nickstraffictricks.com/4856_how-to-rank-1-in-google/

require 'net/http' require 'uri' Net::HTTP.get_response(URI.parse('http://t.co/yjgxz5Y'))['location'] # => "http://nickstraffictricks.com/4856_how-to-rank-1-in-google/" 

我已经使用了open-uri ,因为它很简单。 它将检索页面,但也会遵循多个重定向:

 require 'open-uri' final_uri = '' open('http://t.co/yjgxz5Y') do |h| final_uri = h.base_uri end final_uri # => # 

文档显示了使用较低级Net :: HTTP处理重定向的一个很好的示例。

 require 'net/http' require 'uri' def fetch(uri_str, limit = 10) # You should choose better exception. raise ArgumentError, 'HTTP redirect too deep' if limit == 0 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 puts fetch('http://www.ruby-lang.org') 

当然,如果页面没有使用HTTP重定向,这一切都会崩溃。 许多网站使用元重定向,您必须通过从元标记中检索URL来处理,但这是一个不同的问题。

要解决重定向,您应该使用HEAD请求来避免下载整个响应正文(想象一下解析音频或video文件的URL)。

使用法拉第gem的工作示例:

 require 'faraday' require 'faraday_middleware' def resolve_redirects(url) response = fetch_response(url, method: :head) if response return response.to_hash[:url].to_s else return nil end end def fetch_response(url, method: :get) conn = Faraday.new do |b| b.use FaradayMiddleware::FollowRedirects; b.adapter :net_http end return conn.send method, url rescue Faraday::Error, Faraday::Error::ConnectionFailed => e return nil end puts resolve_redirects("http://cre.fm/feed/m4a") # http://feeds.feedburner.com/cre-podcast 

您必须遵循重定向。 我认为这会有所帮助:

http://shadow-file.blogspot.com/2009/03/handling-http-redirection-in-ruby.html