使用Ruby,我想检查图像以查看是否可热链接。我拥有的代码在很多情况下都可以使用,但有时不起作用。
代码:
class Hotlinkable
def self.is_hotlinkable? url
return if url.blank?
begin
res = get_response_with_redirect URI.parse(url)
res.code == '200'
rescue => e
puts e.inspect
false
end
end
def self.get_response_with_redirect(uri)
r = Net::HTTP.get_response(uri)
if r.code == "301"
r = Net::HTTP.get_response(URI.parse(r.header['location']))
end
r
end
end
例如,通过上面的代码运行时,此图像返回403: https://searchengineland.com/figz/wp-content/seloads/2019/08/IMG_20190808_104849.jpg
但是当我将其放入图像标签中时,它加载就很好了。
您知道上面的代码为什么返回403吗?
答案 0 :(得分:0)
这里发生了很多事情。 首先,您不提供任何请求标头。这样服务器可以告诉请求不是来自浏览器,并以403响应。 添加任何User-Agent即可解决此问题。为了获得最佳结果,请检查浏览器发送的标头并复制所有标头。
下一个是处理SSL。您需要告诉Net :: HTTP将SSL用于HTTPS请求。
这是用于获取响应的更新脚本:
uri = URI.parse("https://searchengineland.com/figz/wp-content/seloads/2019/08/IMG_20190808_104849.jpg")
http = Net::HTTP.new(uri.host, uri.port)
if uri.scheme == 'https'
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
request = Net::HTTP::Get.new(uri.request_uri)
request["User-Agent"] = "curl/7.58.0"
response = http.request(request)