如何检查图像在Ruby中是否可热链接

时间:2019-08-08 21:07:14

标签: ruby hotlinking

使用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吗?

1 个答案:

答案 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)