OpenURI::HTTPError(500 内部服务器错误)与 open-uri

OpenURI::HTTPError (500 Internal Server Error) with open-uri

我正在尝试从 URL 下载图片,URL 来自 facebook。我在使用 omniauth-facebook 注册后得到 URL:

步骤如下:

$ irb
>> require 'open-uri'
>> open("http://graph.facebook.com/v4.0/10224315028492218/picture?access_token=EAAPhFIKqb2IBAO6ekZAGnQyoqkxrmoBRAN8Qfc115SJkOzu5wOmCZB6C7IKtql3ZCIEw8NU66RXrmoFZAszU6G3VeXaz7KHZAmS2NVzF5uRKTEonQ43r1ZB8q1otb5MUmEW7YySXcINREet1xG8i1II5apMif97TAxpMoqDXwz9AZDZD")

这是结果:

Traceback (most recent call last):
       13: from /home/abdel/.rbenv/versions/2.6.5/bin/irb:23:in `<main>'
       12: from /home/abdel/.rbenv/versions/2.6.5/bin/irb:23:in `load'
       11: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
       10: from (irb):8
        9: from (irb):8:in `rescue in irb_binding'
        8: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:35:in `open'
        7: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:736:in `open'
        6: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:165:in `open_uri'
        5: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:224:in `open_loop'
        4: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:224:in `catch'
        3: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:226:in `block in open_loop'
        2: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:756:in `buffer_open'
        1: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:378:in `open_http'
OpenURI::HTTPError (500 Internal Server Error)

尝试相同但使用 https 而不是 http:

Traceback (most recent call last):
       12: from /home/abdel/.rbenv/versions/2.6.5/bin/irb:23:in `<main>'
       11: from /home/abdel/.rbenv/versions/2.6.5/bin/irb:23:in `load'
       10: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
        9: from (irb):12
        8: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:35:in `open'
        7: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:736:in `open'
        6: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:165:in `open_uri'
        5: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:224:in `open_loop'
        4: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:224:in `catch'
        3: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:226:in `block in open_loop'
        2: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:756:in `buffer_open'
        1: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:378:in `open_http'
OpenURI::HTTPError (400 Bad Request)

将 URL 放入浏览器:

http://graph.facebook.com/v4.0/10224315028492218/picture?access_token=EAAPhFIKqb2IBAO6ekZAGnQyoqkxrmoBRAN8Qfc115SJkOzu5wOmCZB6C7IKtql3ZCIEw8NU66RXrmoFZAszU6G3VeXaz7KHZAmS2NVzF5uRKTEonQ43r1ZB8q1otb5MUmEW7YySXcINREet1xG8i1II5apMif97TAxpMoqDXwz9AZDZD

它可以毫无问题地下载它,当我尝试将 open-uri 与另一个图像 link 一起使用时,它也可以正常工作。我不知道为什么它会导致来自 facebook 的图像出现问题。

解决方案

感谢@Gowtham 的帮助,我设法下载了图像并使用 Active Storage 保存它,这是我的代码:

url = "https://graph.facebook.com/v4.0/10224315028492218/picture?access_token=EAAPhFIKqb2IBAO6ekZAGnQyoqkxrmoBRAN8Qfc115SJkOzu5wOmCZB6C7IKtql3ZCIEw8NU66RXrmoFZAszU6G3VeXaz7KHZAmS2NVzF5uRKTEonQ43r1ZB8q1otb5MUmEW7YySXcINREet1xG8i1II5apMif97TAxpMoqDXwz9AZDZD"

begin
  file = File.open('user_avatar.jpeg', 'wb') do |file|
    file << open(url).read
  end
  user.avatar.attach(io: File.open(file), filename: 'user_avatar.jpeg')
rescue Exception => e
  p e.message, e.backtrace.inspect
end

使用 HTTPS 尝试以下操作 URL

require 'open-uri'

url = "https://graph.facebook.com/v4.0/10224315028492218/picture?access_token=EAAPhFIKqb2IBAO6ekZAGnQyoqkxrmoBRAN8Qfc115SJkOzu5wOmCZB6C7IKtql3ZCIEw8NU66RXrmoFZAszU6G3VeXaz7KHZAmS2NVzF5uRKTEonQ43r1ZB8q1otb5MUmEW7YySXcINREet1xG8i1II5apMif97TAxpMoqDXwz9AZDZD"
begin
  File.open('test.jpeg', 'wb') do |file|
    file << open(url).read
  end
rescue Exception => e
  p e.message, e.backtrace.inspect
end