2011-05-03 5 views
23

में किसी URL का अनुप्रेषित हो जाओ फेसबुक ग्राफ एपीआई के अनुसार हम इस (उदाहरण) के साथ एक उपयोगकर्ता प्रोफ़ाइल तस्वीर अनुरोध कर सकते हैं:रूबी

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

लेकिन पिछले लिंक का असली चित्र URL है:

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

यदि आप अपने ब्राउज़र पर पहला लिंक टाइप करते हैं, तो यह आपको दूसरे लिंक पर रीडायरेक्ट करेगा।

क्या रूबी/रेल के साथ पूर्ण यूआरएल (दूसरा लिंक) प्राप्त करने का कोई तरीका है, केवल पहले यूआरएल को जानकर?

(यह this question की पुनरावृत्ति है, लेकिन रूबी के लिए)

+0

संभावित डुप्लिकेट [रूबी का उपयोग करके रीडायरेक्ट के बाद मैं अंतिम URL कैसे प्राप्त कर सकता हूं?] (Http: // stackoverflow।कॉम/प्रश्न/4867652/कैसे-कर-मैं-प्राप्त-अंतिम-यूआरएल-बाद-रीडायरेक्ट-उपयोग-रूबी) – lulalala

+0

संभव डुप्लिकेट [रूबी में, मुझे एक संक्षिप्त यूआरएल का गंतव्य यूआरएल कैसे मिलता है?] (http://stackoverflow.com/questions/5532362/in-ruby-how-do-i-get-the-destination-url-of-a-shortened-url) –

+0

मैंने [final_redirect_url] का उपयोग किया (https: // rubygems अंतिम रीडायरेक्ट यूआरएल प्राप्त करने के लिए .org/रत्न/final_redirect_url) मणि। – Indyarocks

उत्तर

13

आप उपयोग कर सकते हैं Net :: HTTP और प्रतिक्रिया से Location: हैडर पढ़

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'] 
+3

आप '/index.html' के बजाय url.request_uri का उपयोग कर सकते हैं। – FelipeC

+2

क्या होगा यदि एक से अधिक रीडायरेक्ट हैं? क्या यह अंतिम होगा? या सिर्फ पहले? – Sean

9

आप को 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'] 
+0

और जब u.path खाली है? उदाहरण: यूआरआई.परसे ('http://url.com') .पथ। धन्यवाद – Luccas

+0

असल में, आपके उदाहरण में 'u.path' 'url.com' होगा क्योंकि' "url.com" 'एक वैध यूआरआई है, यह सिर्फ यूआरआई के रूप में है जिसमें इसमें कोई होस्ट, पोर्ट या योजना नहीं है - यह है 'URI.parse' द्वारा सभी पथ के रूप में देखा गया। यदि आप उस डेटा को होस्टनाम के रूप में व्याख्या करना चाहते हैं तो आपको इसे 'URI.parse' – smathy

+0

पर पास करने से पहले अतिरिक्त कदम उठाने होंगे, लेकिन 'url.com' से पहले' http: // 'के साथ खाली पथ – Luccas

0

हाँ, "स्थान" प्रतिक्रिया शीर्षलेख आपको वास्तविक छवि यूआरएल बताता है।

हालांकि, अगर आप अपनी साइट पर उपयोगकर्ता की प्रोफ़ाइल छवि के रूप में चित्र का उपयोग करते हैं, तो मैं आपको वास्तविक छवि यूआरएल के बजाय "https://graph.facebook.com/:user_id/picture" शैली यूआरएल का उपयोग करने की सलाह देता हूं। अन्यथा, आपके उपयोगकर्ताओं को भविष्य में बहुत सारी "नहीं मिली" छवियां, या पुरानी प्रोफ़ाइल छवियां दिखाई देगी।

आप "img" टैग की "src" विशेषता के रूप में "https://graph.facebook.com/:user_id/picture" डालते हैं। वे ब्राउज़र को उपयोगकर्ता की अद्यतन छवि प्राप्त करता है।

ps। मुझे ट्विटर के साथ मेरी साइट पर ऐसी समस्याएं हैं & याहू! OpenID अब ..

32

यह पहले से ही सही ढंग से उत्तर दिया गया था, लेकिन वहाँ एक बहुत सरल तरीका है:

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

+1 एक समाधान पोस्ट करने के लिए +1 जो दूसरों के स्थान से 20% से कम लेता है, लेकिन एक ही चीज़ को पूरा करता है। –

+3

यह अच्छा है, लेकिन यह केवल एक स्तर की पुनर्निर्देशन का पालन करता है :( – markquezada

+0

बढ़िया, यह समाधान है जिसे मैं पसंद करता हूं। –

2

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मैं भावी पीढ़ी के लिए इस उत्तर जोड़ देंगे:

मैंने देखा है कि अधिकांश समाधान केवल एक ही रीडायरेक्ट का पालन करते हैं। मेरे मामले में, मुझे वास्तविक अंतिम गंतव्य यूआरएल प्राप्त करने के लिए कई रीडायरेक्ट का पालन करना पड़ा। मैं (Curb gem के माध्यम से) कर्ल इस्तेमाल किया तो जैसे:

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

आप प्रतिसाद स्थिति कोड की जाँच करें और रिकर्सिवली 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 बनाया, ताकि हर कोई इसका लाभ उठा सके।

आप here पर उपयोग के विवरण प्राप्त कर सकते हैं।