2009-09-01 9 views
19

मैं कुकीज को एक ओपन-यूरी कॉल से स्टोर करना चाहता हूं और उन्हें अगले नंबर पर भेजना चाहता हूं। ऐसा करने के लिए मुझे सही दस्तावेज़ नहीं मिल रहे हैं। अगर आप मुझे ऐसा करने का सही तरीका बता सकते हैं तो मैं इसकी सराहना करता हूं।
नोट्स: w3.org वास्तविक यूआरएल नहीं है, लेकिन यह छोटा है; यहां कुकीज़ का नाटक करें।रूबी की ओपन-यूरी और कुकीज़

h1 = open("http://www.w3.org/") 
h2 = open("http://www.w3.org/People/Berners-Lee/", "Cookie" => h1.FixThisSpot) 

2 nays के बाद अद्यतन: एक ओर जहां यह बयानबाजी सवाल के रूप में इरादा नहीं था मैं गारंटी है कि यह संभव है। टम्बलवेड्स के बाद अपडेट: देखें (उत्तर), यह संभव है। मुझे एक अच्छा समय लगा, लेकिन यह काम करता है।

+2

के लिए आप कार्य करना चाहते हैं कि मैं क्या उपयोग करने की अनुशंसा करता हूँ [मशीनीकरण] (http://mechanize.rubyforge.org/mechanize/)। यह इस तरह की चीज के लिए बनाया गया है। इसके विवरण से: "मैकेनाइज लाइब्रेरी का उपयोग वेबसाइटों के साथ बातचीत को स्वचालित करने के लिए किया जाता है। मशीनीकरण स्वचालित रूप से कुकीज़ को संग्रहीत करता है और भेजता है, रीडायरेक्ट का पालन करता है, लिंक का पालन कर सकता है और फॉर्म जमा कर सकता है। फॉर्म फ़ील्ड को पॉप्युलेट और सबमिट किया जा सकता है। मैकेनाइजेशन उन साइटों का ट्रैक भी रखता है आपने इतिहास के रूप में देखा है।" –

+0

यह मशीनीकरण लिंक मर चुका है, यहां नया है http://mechanize.rubyforge.org/ – MCB

+1

मैकेनाइजेशन अब जिथब पर है: https://github.com/sparklemotion/mechanize – JESii

उत्तर

26

मैंने सोचा था कि किसी को सिर्फ पता होगा, लेकिन मैं इसे सामान्यतः open-uri के साथ किया नहीं कर रहा है लगता है।

h1 = open("http://www.w3.org/") 
h2 = open("http://www.w3.org/People/Berners-Lee/", 
      "Cookie" => h1.meta['set-cookie'].split('; ',2)[0]) 

हाँ, यह काम करता है: यहाँ बदसूरत संस्करण है कि गोपनीयता, समय सीमा समाप्ति के लिए न तो चेक, सही डोमेन, और न ही सही रास्ता है। नहीं, यह सुंदर नहीं है, न ही सिफारिशों के साथ पूरी तरह से अनुपालन करता है, न ही यह कई कुकीज़ (जैसा है) को संभालता है।

स्पष्ट रूप से, HTTP एक बहुत सीधी-आगे प्रोटोकॉल है, और open-uri आपको इनमें से अधिकतर देता है। मुझे लगता है कि मुझे वास्तव में जानने की आवश्यकता थी कि h1 अनुरोध से कुकी कैसे प्राप्त करें ताकि इसे h2 अनुरोध (उस भाग को मैं पहले ही जानता था और दिखाया गया) तक पारित किया जा सके। यहां आश्चर्य की बात यह है कि मुझे open-uri का उपयोग न करने के लिए मुझे बताकर जवाब देने की तरह कितने लोगों ने महसूस किया, और उनमें से केवल एक ने दिखाया कि अगले अनुरोध पर एक अनुरोध में कुकी सेट कैसे प्राप्त किया जाए।

1

यदि आप ओपन-यूरी का उपयोग कर रहे हैं तो अनुरोध सबमिट करते समय आपको कुकी हेडर पढ़ने और जोड़ने के दौरान मेटा हेडर को पार्स करके अपना स्वयं का कुकी समर्थन रोल करना होगा। Httpclient http://raa.ruby-lang.org/project/httpclient/ या http://mechanize.rubyforge.org/ के बजाय मैकेनाइजेशन जैसी कुछ चीज़ों पर विचार करें क्योंकि उनके पास कुकी समर्थन बनाया गया है।

+0

मुझे डर है" कुकीज़ के लिए कोई समर्थन नहीं "शब्दों की पसंद का बहुत मजबूत है। हालांकि मैं लिंक की सराहना करता हूं। बाद का दस्तावेज स्पैस लगता है। http://mechanize.rubyforge.org/mechanize/WWW/Mechanize/CookieJar.html – dlamblin

+0

रूबी का मैकेनाइजेशन पर्ल के करीब आधारित है डब्ल्यूडब्ल्यूडब्लू :: मैकेनाइज, जिसमें कुछ अच्छे दस्तावेज़ हैं। पर्ल डॉक्स में कुकीज़ का विवरण यह समझने में मदद कर सकता है कि रुबी संस्करण कैसे काम करता है। यह थोड़ी देर के बाद से मैंने इसका इस्तेमाल किया, लेकिन मुझे लगता है कि यह एक कुकी जार और इच्छा देगा उन्हें स्वचालित रूप से संभाल लें। यदि आप उन्हें अंदर या बाहर स्विच करना चाहते हैं या बाद में पुन: उपयोग के लिए डिस्क पर स्टोर करना चाहते हैं तो आप अपना खुद का जार परिभाषित कर सकते हैं। –

12

आपको "कुकी" शीर्षलेख जोड़ने की आवश्यकता है।

मुझे यकीन नहीं है कि ओपन-यूरी ऐसा कर सकता है या नहीं, लेकिन यह नेट :: HTTP का उपयोग करके किया जा सकता है।

# Create a new connection object. 
conn = Net::HTTP.new(site, port) 

# Get the response when we login, to set the cookie. 
# body is the encoded arguments to log in. 
resp, data = conn.post(login_path, body, {}) 
cookie = resp.response['set-cookie'] 

# Headers need to be in a hash. 
headers = { "Cookie" => cookie } 

# On a get, we don't need a body. 
resp, data = conn.get(path, headers) 
+2

हां, ओपन-यूरी अतिरिक्त शीर्षलेख भेज सकता है: खोलें (यूआरएल, "कुकी" => कुकी) # http://www.ru by-doc.org/stdlib/libdoc/open-uri/rdoc/classes/OpenURI.html –

+0

क्या यह नेट :: HTTP संस्करण कुकी समाप्ति, पथ या डोमेन को ध्यान में रखता है? – dlamblin

+0

@ डैम्बलिन नहीं, जानबूझकर नहीं। सबसे पहले, क्रॉल करना सीखें, फिर चलें, फिर चलाएं। –

2

जो आप पूरा करने की कोशिश कर रहे हैं उसके आधार पर, webrat देखें। मुझे पता है कि यह आमतौर पर परीक्षण के लिए प्रयोग किया जाता है, लेकिन यह लाइव साइट्स भी मार सकता है, और यह आपके लिए बहुत सी चीजें करता है जो आपका वेब ब्राउज़र आपके लिए करेगा, जैसे अनुरोधों के बीच स्टोर कुकीज़ और रीडायरेक्ट का पालन करें।

+2

मैं इसके बजाय मैकेनाइजेशन की सिफारिश करता हूं। यह लाइव साइट्स हिट करेगा, कुकीज़ को संभालेगा और रीडायरेक्ट का भी पालन करेगा, और, वास्तव में यह सब करने के लिए डिज़ाइन किया गया था। –

4

धन्यवाद मैथ्यू शिनकल आपका जवाब वास्तव में उपयोगी था। नेट का प्रयोग :: HTTP मैं सफल

 # Create a new connection object. 
      site = "google.com" 
      port = 80 
      conn = Net::HTTP.new(site, port) 

     # Get the response when we login, to set the cookie. 
     # body is the encoded arguments to log in. 
      resp, data = conn.post(login_path, body, {}) 
      cookie = resp.response['set-cookie'] 

     # Headers need to be in a hash. 
      headers = { "Cookie" => cookie } 

     # On a get, we don't need a body. 
      resp, data = conn.get(path, headers) 

      puts resp.body 
0

था एक RFC 2109 और RFC 2965 कुकी जार कार्यान्वयन यहां पाया जा सकता है कि मानक के अनुरूप कुकी हैंडलिंग चाहता है के लिए नहीं है।

https://github.com/dwaite/cookiejar

संबंधित मुद्दे