Question

Je souhaite des informations à partir d'un site Web qui est pas à moi, afin d'obtenir cette information, je dois vous connecter au site Web pour recueillir les informations, ce qui se passe à travers un formulaire HTML. Comment puis-je faire screenscaping authentifié en C #?

Informations supplémentaires:

  • l'authentification basée sur des cookies.
  • action POST nécessaire.
Était-ce utile?

La solution

Vous souhaitez faire la demande comme si vous aviez simplement rempli le formulaire. En supposant qu'il est POST par exemple, vous faites une requête POST avec les données correctes. Maintenant, si vous ne pouvez pas vous connecter directement à la même page que vous voulez gratter, vous devrez suivre ce que les cookies sont mis après votre demande de connexion, et les inclure dans votre demande de racler pour vous permettre de rester connecté.

Il pourrait ressembler à:

HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest;
http.KeepAlive = true;
http.Method = "POST";
http.ContentType = "application/x-www-form-urlencoded";
string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword;
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData);
http.ContentLength = dataBytes.Length;
using (Stream postStream = http.GetRequestStream())
{
    postStream.Write(dataBytes, 0, dataBytes.Length);
}
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;
// Probably want to inspect the http.Headers here first
http = WebRequest.Create(url2) as HttpWebRequest;
http.CookieContainer = new CookieContainer();
http.CookieContainer.Add(httpResponse.Cookies);
HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse;

Peut-être.

Autres conseils

Dans certains cas, httpResponse.Cookies sera vide. Utilisez le CookieContainer à la place.

CookieContainer cc = new CookieContainer();

HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest;
http.KeepAlive = true;
http.Method = "POST";
http.ContentType = "application/x-www-form-urlencoded";

http.CookieContainer = cc;

string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword;
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData);
http.ContentLength = dataBytes.Length;
using (Stream postStream = http.GetRequestStream())
{
    postStream.Write(dataBytes, 0, dataBytes.Length);
}
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;
// Probably want to inspect the http.Headers here first
http = WebRequest.Create(url2) as HttpWebRequest;

http.CookieContainer = cc;

HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse;

En complément de réponse dlambin Il est nécessaire d'avoir

http.AllowAutoRedirect=false;

Dans le cas contraire

HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;

Il fera une autre demande initiale URL et vous ne serez pas en mesure de récupérer url2.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top