복붙노트

[RUBY-ON-RAILS] 루비의 URL의 리디렉션을 받기

RUBY-ON-RAILS

루비의 URL의 리디렉션을 받기

북 그래프 API에 따라 우리는 (실시 예)와 사용자 프로파일 사진을 요구할 수있다 :

https://graph.facebook.com/1489686594/picture

그러나 이전 링크의 실제 이미지의 URL은 다음과 같습니다

http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs356.snc4/41721_1489686594_527_q.jpg

브라우저의 첫 번째 링크를 입력하면, 제 2 링크로 리디렉션됩니다.

첫 번째 URL을 알고에 의해, 루비 / 레일에 전체 URL (두 번째 링크)를 얻을 수있는 방법이 있습니까?

(이것은 루비에 대한이 질문의 반복이지만)

해결법

  1. ==============================

    1.당신은 인터넷 : HTTP를 사용하여 위치를 읽을 수 있습니다 : 헤더를 응답에서

    당신은 인터넷 : HTTP를 사용하여 위치를 읽을 수 있습니다 : 헤더를 응답에서

    require 'net/http'
    require 'uri'
    
    url = URI.parse('http://www.example.com/index.html')
    res = Net::HTTP.start(url.host, url.port) {|http|
      http.get('/index.html')
    }
    res['location']
    
  2. ==============================

    2.이것은 이미 정답을했지만, 훨씬 더 간단한 방법이있다 :

    이것은 이미 정답을했지만, 훨씬 더 간단한 방법이있다 :

    res = Net::HTTP.get_response(URI('https://graph.facebook.com/1489686594/picture'))
    res['location']
    
  3. ==============================

    3.당신이 그것을 처리 할 수 ​​있도록, HTTPS URL이 거기에있어 ...

    당신이 그것을 처리 할 수 ​​있도록, HTTPS URL이 거기에있어 ...

    require 'net/http'
    require 'net/https' if RUBY_VERSION < '1.9'
    require 'uri'
    
    u = URI.parse('https://graph.facebook.com/1489686594/picture')
    
    h = Net::HTTP.new u.host, u.port
    h.use_ssl = u.scheme == 'https'
    
    head = h.start do |ua|
      ua.head u.path
    end
    
    puts head['location']
    
  4. ==============================

    4.나는이 오래된 질문 알아요,하지만 난 후손이 대답을 추가 할 것입니다 :

    나는이 오래된 질문 알아요,하지만 난 후손이 대답을 추가 할 것입니다 :

    난 단지 본 적이 솔루션의 대부분은 하나의 리디렉션을 수행합니다. 내 경우, 나는 실제 최종 목적지의 URL을 얻기 위해 여러 리디렉션을 수행했다. 그래서 같이 (난간 보석을 통해) 컬을 사용 :

    result = Curl::Easy.perform(url) do |curl|
      curl.head = true
      curl.follow_location = true
    end
    result.last_effective_url
    
  5. ==============================

    5.당신은 응답 상태 코드를 확인하고 get_final_redirect_url 방법 같은 것을 사용하여 반복적으로 최종 URL을 얻을 수 있습니다 :

    당신은 응답 상태 코드를 확인하고 get_final_redirect_url 방법 같은 것을 사용하여 반복적으로 최종 URL을 얻을 수 있습니다 :

      require 'net/http'
    
      def get_final_redirect_url(url, limit = 10)
        uri = URI.parse(url)
        response = ::Net::HTTP.get_response(uri)
        if response.class == Net::HTTPOK
          return uri
        else
          redirect_location = response['location']
          location_uri = URI.parse(redirect_location)
          if location_uri.host.nil?
            redirect_location = uri.scheme + '://' + uri.host + redirect_location
          end
          warn "redirected to #{redirect_location}"
          get_final_redirect_url(redirect_location, limit - 1)
        end
      end
    

    저도 같은 문제에 직면했다. 그 모든 사람들이 혜택을 누릴 수 있도록 나는 그것을 해결하고 주위에 보석 final_redirect_url을 만들었습니다.

    현재 사용에 대한 자세한 내용을 확인할 수 있습니다.

  6. ==============================

    6.그래, "위치"응답 헤더는 당신에게 실제 이미지 URL을 말한다.

    그래, "위치"응답 헤더는 당신에게 실제 이미지 URL을 말한다.

    귀하의 사이트에서 사용자의 프로필 이미지로 사진을 사용하는 경우, 당신이 "https://graph.facebook.com/:user_id/picture"스타일의 URL 대신 실제 이미지 URL을 사용하는 것이 좋습니다. 그렇지 않으면, 사용자는 앞으로 "을 (를) 찾을 수 없습니다"이미지 또는 오래된 프로필 이미지를 많이 볼 수 있습니다.

    당신은 "IMG"태그의 "SRC"속성으로 "https://graph.facebook.com/:user_id/picture"를 넣어. 그들은 브라우저는 사용자의 업데이트 된 이미지를 가져옵니다.

    추신. 나는 트위터 및 야후!와 내 사이트에 같은 문제가 지금 오픈 아이디 ..

  7. ==============================

    7.당신은 해결책이 원하는 경우 :

    당신은 해결책이 원하는 경우 :

    require 'net/http'
    require 'uri'
    
    def follow_redirections(url)   
      response = Net::HTTP.get_response(URI(url))
      until response['location'].nil?
        response = Net::HTTP.get_response(URI(response['location']))
      end
      response.uri.to_s
    end
    
    # EXAMPLE USAGE
    follow_redirections("https://graph.facebook.com/1489686594/picture") 
    # => https://static.xx.fbcdn.net/rsrc.php/v3/yo/r/UlIqmHJn-SK.gif
    
  8. from https://stackoverflow.com/questions/5872210/get-redirect-of-a-url-in-ruby by cc-by-sa and MIT license