7

मैं ऐसी वेबसाइट को स्क्रैप करने का प्रयास कर रहा हूं जिसमें उपयोगकर्ता प्रमाणीकरण है। मैं अपना लॉगिन भेजने और एक कुकी स्टोर करने के लिए एक पोस्ट करने में सक्षम हूं। हालांकि, लॉगिन के बाद मुझे सुरक्षित पृष्ठ तक पहुंचने का प्रयास करते समय 403 त्रुटि मिलती है।शक्तिशक्ति httpwebrequest विधि कुकी कंटेंटर समस्या प्राप्त करें?

$url = "https://some_url" 

$CookieContainer = New-Object System.Net.CookieContainer 

$postData = "User=UserName&Password=Pass" 

$buffer = [text.encoding]::ascii.getbytes($postData) 

[net.httpWebRequest] $req = [net.webRequest]::create($url) 
$req.method = "POST" 
$req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" 
$req.Headers.Add("Accept-Language: en-US") 
$req.Headers.Add("Accept-Encoding: gzip,deflate") 
$req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7") 
$req.AllowAutoRedirect = $false 
$req.ContentType = "application/x-www-form-urlencoded" 
$req.ContentLength = $buffer.length 
$req.TimeOut = 50000 
$req.KeepAlive = $true 
$req.Headers.Add("Keep-Alive: 300"); 
$req.CookieContainer = $CookieContainer 
$reqst = $req.getRequestStream() 
$reqst.write($buffer, 0, $buffer.length) 
$reqst.flush() 
$reqst.close() 
[net.httpWebResponse] $res = $req.getResponse() 
$resst = $res.getResponseStream() 
$sr = new-object IO.StreamReader($resst) 
$result = $sr.ReadToEnd() 
$res.close() 



$url2 = "https://some_url/protected_page" 

[net.httpWebRequest] $req2 = [net.webRequest]::create($url2) 
$req2.Method = "GET" 
$req2.Accept = "text/html" 
$req2.AllowAutoRedirect = $false 
$req2.CookieContainer = $CookieContainer 
$req2.TimeOut = 50000 
[net.httpWebResponse] $res2 = $req2.getResponse() 
$resst = $res2.getResponseStream() 
$sr = new-object IO.StreamReader($resst) 
$result = $sr.ReadToEnd() 

वैकल्पिक हल: तो लगभग सब कुछ मैं कुछ अलग कोशिश कर समाप्त हो गया और यह वास्तव में काम करता है की कोशिश कर के बाद।

लॉगिन पोस्ट करने और सत्र कुकी प्राप्त करने के बाद, मैं हेडर्स को कुकी स्ट्रिंग जोड़कर सुरक्षित पृष्ठ तक पहुंचने के लिए वेब क्लाइंट का उपयोग करता हूं।

$web = new-object net.webclient 
$web.Headers.add("Cookie", $res.Headers["Set-Cookie"]) 
$result = $web.DownloadString("https://secure_url") 

इस बारे में अच्छी बात यह है कि webclient कुकी बचाता है।

+0

क्या आप इसके लिए अपना पूरा समाधान पोस्ट कर सकते हैं। मैं एक ही स्थिति में हूं लेकिन मुझे लगता है कि यह अभी तक काम नहीं कर रहा है। – bearrito

+0

मैंने अपने ब्राउज़र और सर्वर के बीच यातायात को पकड़ने के लिए फिडलर 2 का उपयोग किया, फिर फिडलर 2 में अनुरोध हेडर से कुकी को पकड़ लिया। मैंने आपके द्वारा दिखाए गए अनुरोध पर कुकी को जोड़ा और अब डाउनलोडस्ट्रिंग लगातार लॉगिन पृष्ठ पर रीडायरेक्ट नहीं होती है। धन्यवाद! –

उत्तर

4

मुझे पता चला कि चूंकि कुकीज़ में अतिरिक्त जानकारी संलग्न हो सकती है (जैसे यूआरएल या HTTP-केवल), $ res.Headers ["Set-कुकी"] मेरे लिए काम नहीं करता है।

$web = new-object net.webclient 
$web.Headers.add("Cookie", $CookieContainer.GetCookieHeader($url)) 
$result = $web.DownloadString($url) 
0

मैं IE automation का प्रयोग करेंगे :): एक और सुरक्षित पृष्ठ का उपयोग करने के लिए आपको सिर्फ $ web.downloadstring ("// another_secure_url https") कॉल कर सकते हैं। इसके साथ कुकीज़, हेडर आदि के साथ काम करने की ज़रूरत नहीं है।

+0

मैंने यानी ऑटोमेशन को इससे पहले कोशिश की लेकिन यह स्क्रैप करने में बहुत धीमी है। लेकिन मुझे मेरी समस्या का समाधान मिला। – foureight84

3

लोग पूरा के लिए पूछ कर दिया गया है: लेकिन आपके $ CookieContainer चर का उपयोग कर, आप आसानी से इसे GetCookieHeader (यूआरएल) है, जो बाहर अतिरिक्त जानकारी पट्टी और साथ सही प्रारूप में कुकी स्ट्रिंग के साथ छोड़ जाएगा उपयोग करने के लिए बदल सकते हैं आवेदन, यहां आपके पास

$url = "https://some_url" 

$CookieContainer = New-Object System.Net.CookieContainer 

$postData = "User=UserName&Password=Pass" 

$buffer = [text.encoding]::ascii.getbytes($postData) 

[net.httpWebRequest] $req = [net.webRequest]::create($url) 
$req.method = "POST" 
$req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" 
$req.Headers.Add("Accept-Language: en-US") 
$req.Headers.Add("Accept-Encoding: gzip,deflate") 
$req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7") 
$req.AllowAutoRedirect = $false 
$req.ContentType = "application/x-www-form-urlencoded" 
$req.ContentLength = $buffer.length 
$req.TimeOut = 50000 
$req.KeepAlive = $true 
$req.Headers.Add("Keep-Alive: 300"); 
$req.CookieContainer = $CookieContainer 
$reqst = $req.getRequestStream() 
$reqst.write($buffer, 0, $buffer.length) 
$reqst.flush() 
$reqst.close() 
[net.httpWebResponse] $res = $req.getResponse() 
$resst = $res.getResponseStream() 
$sr = new-object IO.StreamReader($resst) 
$result = $sr.ReadToEnd() 
$res.close() 


$web = new-object net.webclient 
$web.Headers.add("Cookie", $res.Headers["Set-Cookie"]) 
$result = $web.DownloadString("https://secure_url")