2009-11-25 21 views
19

क्या file_get_contents अनुरोध करते समय दूरस्थ सर्वर द्वारा निर्धारित कुकीज़ प्राप्त करना संभव है?file_get_contents कुकीज़ प्राप्त करते हैं

मुझे http अनुरोध करने के लिए PHP की आवश्यकता है, कुकीज़ संग्रहीत करें, और फिर संग्रहित कुकीज़ का उपयोग करके दूसरा http अनुरोध करें।

+0

कोई रास्ता नहीं इस समस्या के समाधान के लिए? – Grigor

+0

[curl] (http://php.net/manual/en/book.curl.php) वह है जिसे आप ढूंढ रहे हैं। लेकिन आप 'file_get_contents() 'का उपयोग नहीं करेंगे, आप एक कर्ल फ़ंक्शन का उपयोग करेंगे। (नोट: मैं PHP दस्तावेज से जुड़ा हुआ हूं लेकिन php.net वर्तमान में नीचे है, "php curl" googling पर विचार करें और कैश किए गए पृष्ठों को देखते हुए) – jedwards

+0

मुझे लगता है कि कुकीज़ क्लाइंट साइड हैं, एचएम? file_get_contents कुकीज़ क्यों प्राप्त कर सकते हैं? –

उत्तर

18

आप उस उद्देश्य के लिए cURL, cURL का उपयोग करना चाहिए एक सुविधा कुकी जार, जिसके कारण फ़ाइल में कुकीज़ बचाने के लिए और बाद में अनुरोध (रों) के लिए उन्हें पुन: उपयोग करने की अनुमति बुलाया लागू।

यहां एक त्वरित कोड आ snipet इसे कैसे करना:

/* STEP 1. let’s create a cookie file */ 
$ckfile = tempnam ("/tmp", "CURLCOOKIE"); 
/* STEP 2. visit the homepage to set the cookie properly */ 
$ch = curl_init ("http://somedomain.com/"); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 
$output = curl_exec ($ch); 

/* STEP 3. visit cookiepage.php */ 
$ch = curl_init ("http://somedomain.com/cookiepage.php"); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 
$output = curl_exec ($ch); 

टिप्पणी: उल्लेख किया गया है करने के लिए जा आप PECL एक्सटेंशन होना चाहिए (या PHP में संकलित) स्थापित या आप पर नहीं पहुंच पाएंगे कर्ल एपीआई के लिए।

+0

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

+0

ऐसा नहीं लगता है। एक temp फ़ाइल बनाने के लिए http://www.php.net/manual/hi/function.tempnam.php का उपयोग करें और इसे पूरा करने के बाद इसे हटा दें। – ceejayoz

+0

@ लुइस: कर्ल के साथ नहीं, लेकिन वैसे भी यह कुछ बाइट्स फ़ाइल है और आप इसे पूरा करने के बाद ही इसे 'अनलिंक' कर सकते हैं। – RageZ

2

आप या तो PECL extension for HTTP इंस्टॉल और उपयोग कर सकते हैं, या यह सुनिश्चित कर सकते हैं कि आपकी PHP स्थापना वैकल्पिक curl library के साथ संकलित की गई हो।

1

मुझे विश्वास है कि आप Zend_Http ऑब्जेक्ट के साथ इसे आसानी से कर सकते हैं। अनुरोध पर adding cookies के बारे में प्रलेखन यहां दिया गया है।

अनुरोध से कुकीज़ प्राप्त करने के लिए (स्वचालित रूप से मुझे विश्वास है), बस Zend_Http ऑब्जेक्ट पर getCookieJar() का उपयोग करें।

इसे कार्यान्वित करना आसान होना चाहिए; हालांकि, PHP मैनुअल में how to deal with cookies using the http stream पर उपयोगकर्ता टिप्पणी है।

13

मुझे एहसास है कि यह देर हो चुकी है, लेकिन वास्तव में सर्वर द्वारा भेजी गई व्यक्तिगत कुकीज़ प्राप्त करने का एक तरीका है।

मुझे लगता है कि आप जानते हैं कि पूरे file_create_context व्यवसाय को अपना file_get_contents http अनुरोध रोलिंग प्राप्त करने के लिए कैसे करें, और आपको वास्तव में कुकीज़ को सेट करने में सहायता की आवश्यकता है।

यूआरएल पर file_get_contents चलाने के बाद, (दुर्भाग्यवश, गैर-सहयोगी) सरणी $ http_response_header सेट है।

यदि सर्वर कुकी को वापस भेज रहा है, तो उनमें से एक 'सेट-कुकी:' से शुरू होगा, जिसे आप सबस्ट्र के साथ निकाल सकते हैं।

हालांकि, इस समय, मुझे लगता है कि कोई भी इस चर के माध्यम से केवल एक-सेट-कुकी तक पहुंच सकता है, जो एक सीमा है जिसे मैं वर्तमान में काम करने का तरीका खोजने की कोशिश कर रहा हूं।

$cookies=array(); 
foreach($http_response_header as $s){ 
    if(preg_match('|^Set-Cookie:\s*([^=]+)=([^;]+);(.+)$|',$s,$parts)) 
     $cookies[$parts[1]]=$parts[2]; 
    } 

नोट::

+0

परफेक्ट, और मूल प्रश्न का सबसे अच्छा जवाब जोड़ा। किसी भी तरह से PHP के 12+ वर्षों में मुझे याद नहीं आया यह समारोह –

+0

एकाधिक 'सेट-कुकी' लाइनें '$ http_response_header' में कैप्चर की जाती हैं; एक संबंधित उत्तर भी देखें: http://stackoverflow.com/a/10958820/1338292 –

+0

मैं वास्तव में आभारी हूं यदि आप हमें उन लोगों के लिए एक नमूना कोड दिखा सकते हैं जो नहीं जानते कि पूरे stream_create_context व्यवसाय को कैसे करें अपना file_get_contents http अनुरोध रोलिंग प्राप्त करें "' – azerafati

6

Laereom के जवाब से इसे जारी रखते हुए, तो यहां आपको कई कुकीज़ प्राप्त करने के लिए है

  1. मैं regex के साथ उदार हूँ, आरएफसी का अध्ययन करें यदि आप अधिक सटीक होना चाहते हैं (यानी बुरी तरह से गठित कुकी डेटा को अस्वीकार करने के लिए)
  2. आपको $ parts [3] में पथ =, समाप्ति = आदि मिलेगा। मैं explode(';',$parts[3]) का सुझाव दूंगा, फिर इसे संसाधित करने के लिए एक और लूप (क्योंकि मुझे यकीन नहीं है कि इन गुणों के लिए कोई निश्चित आदेश है या नहीं।
  3. यदि दो कुकीज़ का एक ही नाम भाग है, केवल अंतिम जीवित रहता है, जो सही प्रतीत होता है ।(मैं अपने वर्तमान प्रोजेक्ट में इस स्थिति के लिए हो;। मुझे लगता है यह वेबसाइट मैं स्क्रीन scraping कर रहा हूँ में एक बग है)
+0

अनुवर्ती के लिए धन्यवाद। बाद में मैंने पाया कि यह सच था, लेकिन मूल उत्तर को सही करने के लिए कभी भी पालन नहीं किया। – Laereom

21

इस के लिए एक जादू चर नहीं है, $http_response_header कहा जाता है; यह एक सरणी है जिसमें सभी शीर्षलेख शामिल थे। कुकीज निकालने के लिए आपको Set-Cookie: से शुरू होने वाले शीर्षलेखों को फ़िल्टर करना होगा।

file_get_contents('http://example.org'); 

$cookies = array(); 
foreach ($http_response_header as $hdr) { 
    if (preg_match('/^Set-Cookie:\s*([^;]+)/', $hdr, $matches)) { 
     parse_str($matches[1], $tmp); 
     $cookies += $tmp; 
    } 
} 
print_r($cookies); 

एक बराबर लेकिन कम जादुई दृष्टिकोण stream_get_meta_data() उपयोग करने के लिए होगा:

if (false !== ($f = fopen('http://www.example.org', 'r'))) { 
     $meta = stream_get_meta_data($f); 
     $headers = $meta['wrapper_data']; 

     $contents = stream_get_contents($f); 
     fclose($f); 
} 
// $headers now contains the same array as $http_response_header 
+0

@GaryCarlyleCook आप जो करना चाहते हैं उस पर निर्भर करता है; सामग्रियों को लाने के बारे में इसका इरादा नहीं था, लेकिन कुकी डेटा लाने के बारे में अधिक जानकारी –

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