powershell httpwebrequest méthode GET cookiecontainer problème?
Je suis en train de gratter un site web d'authentification de l'utilisateur. Je suis capable de faire un POST pour envoyer mon login et stocke un cookie. Cependant, après la connexion, j'obtiens une erreur 403 lorsque vous essayez d'accéder à la page protégée.
$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()
Solution de CONTOURNEMENT: Donc, après avoir essayé presque tout ce que j'ai fini d'essayer quelque chose de différent et il fonctionne réellement.
Après la publication de la connexion et d'obtenir le cookie de session, j'utilise webclient pour accéder à la page sécurisée en ajoutant le cookie de chaîne pour les en-têtes.
$web = new-object net.webclient
$web.Headers.add("Cookie", $res.Headers["Set-Cookie"])
$result = $web.DownloadString("https://secure_url")
L'un de sympathique, c'est que webclient enregistre le cookie. Pour accéder à une autre page sécurisée, vous pouvez les appeler $web.downloadstring("https://another_secure_url") 🙂
J'ai utilisé Fiddler2 pour capturer le trafic entre mon navigateur et le serveur, puis attrapa le cookie de l'en-tête de requête dans Fiddler2. J'ai ajouté ce témoin à la demande que vous montrez et maintenant DownloadString n'est pas constamment rediriger vers la page de connexion. Merci!
OriginalL'auteur foureight84 | 2011-03-29
Vous devez vous connecter pour publier un commentaire.
J'ai constaté que depuis que les cookies peuvent contenir des informations supplémentaires ci-joint (comme l'URL ou HTTP), le $res.Les en-têtes["Set-Cookie"] n'a pas fonctionné pour moi. Mais à l'aide de votre $CookieContainer variable, vous pouvez facilement modifier pour utiliser GetCookieHeader(url), qui enlèvent les informations supplémentaires et de vous laisser avec une mise en forme correctement cookie chaîne:
OriginalL'auteur Paul
Gens ont demandé l'application complète, là, vous l'avez
OriginalL'auteur Sapen
Je voudrais utiliser IE automatisation. Avec les ce n'ont pas à travailler avec les cookies, en-têtes, etc. Beaucoup plus facile.
OriginalL'auteur stej