Как взять этот URL-адрес http://t.co/yjgxz5Y и получить целевой URL-адрес, который http://nickstraffictricks.com/4856_how-to-rank-1-in-google/
Как получить целевой URL-адрес сокращенного URL-адреса с помощью Ruby?
Ответы (4)
Я использовал open-uri
для этого, потому что это красиво и просто. Он получит страницу, но также будет следовать нескольким переадресациям:
require 'open-uri'
final_uri = ''
open('http://t.co/yjgxz5Y') do |h|
final_uri = h.base_uri
end
final_uri # => #<URI::HTTP:0x00000100851050 URL:http://nickstraffictricks.com/4856_how-to-rank-1-in-google/>
В документации показан хороший пример использования низкоуровневого 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-адрес из мета-тега, но это другой вопрос.
open(url).base_uri
- person lulalala; 27.11.2013
Net::HTTP
должна быть принятым ответом, потому что она обрабатывает SSL, а также рекурсивные перенаправления (большинство примеров, похоже, обрабатывают только одно или другое). Отличная работа!
- person Abe Voelker; 04.04.2015
Для разрешения перенаправлений вы должны использовать запрос HEAD
, чтобы избежать загрузки всего тела ответа (представьте, что вы разрешаете URL-адрес аудио- или видеофайла).
Рабочий пример с использованием драгоценного камня Фарадея:
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