Come accedere a livello di codice per un sito web per screenscape?
-
13-09-2019 - |
Domanda
Ho bisogno di alcune informazioni da un sito web che non è mio, al fine di ottenere queste informazioni ho bisogno di accedere al sito web per raccogliere le informazioni, questo avviene attraverso un modulo HTML. Come posso fare questo screenscaping autenticato in C #?
Ulteriori informazioni:
- autenticazione basata su cookie.
- azione POST necessari.
Soluzione
Saresti la richiesta come se si era appena compilato il modulo. Supponendo che è POST, ad esempio, si effettua una richiesta POST con i dati corretti. Ora, se non è possibile accedere direttamente alla stessa pagina che si desidera raschiare, si dovrà tenere traccia di tutto ciò che i cookie sono impostati dopo la richiesta di accesso, e includerli nella richiesta raschiatura per consentire di rimanere collegato.
Potrebbe sembrare:
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;
Forse.
Altri suggerimenti
È possibile utilizzare il controllo di un browser web . Basta alimentarlo l'URL del sito, quindi utilizzare il DOM per impostare il nome utente e la password nei campi giusti, ed eventualmente inviare un clic per il pulsante di invio. In questo modo non si cura di nulla, ma i due campi di input e il pulsante di invio. No gestione dei cookie, non parsing del codice HTML grezzo, non HTTP sniffing -. Tutto ciò che è fatto da controllo del browser
Se si va in questo modo, un paio di suggerimenti:
- È possibile impedire che il controllo dal caricamento add-in come Flash - potrebbe risparmiare un po 'di tempo .
- Una volta effettuato il login, è possibile ottenere tutte le informazioni che vi interessa dal DOM -. Non c'è bisogno di analizzare HTML grezzo
- Se si desidera rendere lo strumento ancora più portatile nel caso in cui le modifiche al sito in futuro, è possibile sostituire la manipolazione del DOM esplicito con un'iniezione di JavaScript. I JS possono essere ottenuti da una risorsa esterna, e una volta chiamato può fare la popolazione campi e inviare.
In alcuni casi, httpResponse.Cookies
sarà vuoto. Utilizzare la CookieContainer
invece.
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;
In aggiunta alla risposta dlambin E 'necessario avere
http.AllowAutoRedirect=false;
In caso contrario
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;
Si farà una nuova richiesta a siglare URL e non sarà in grado di recuperare url2.
È necessario utilizzare il HttpWebRequest e fare un post. Questo collegamento dovrebbe aiutare a iniziare. La chiave è, è necessario guardare al form HTML della pagina che si sta cercando di inviare da a vedere tutti i parametri del modulo ha bisogno per poter inserire post.
http://www.netomatix.com/httppostdata.aspx
http://geekswithblogs.net/rakker/archive/2006 /04/21/76044.aspx