Domanda

Sono relativamente nuovo di utilizzare C #, e hanno un programma che legge le parti del codice sorgente su un sito web. Che tutte le opere; ma il problema è che la pagina in questione, l'utente deve essere loggato per accedere a questo codice sorgente. Ciò che il mio programma ha bisogno di un modo per accedere inizialmente l'utente nel sito-dopo che è fatto, sarò in grado di accedere e leggere il codice sorgente.

Il sito che deve essere effettuato l'accesso è: mmoinn.com/index.do?PageModule=UsersLogin

Ho cercato per tutta la giornata su come fare questo e esempi provato, ma non hanno avuto fortuna.

Grazie in anticipo

Nessuna soluzione corretta

Altri suggerimenti

È possibile continuare a utilizzare WebClient al POST (invece di GET, che è la HTTP verbo voi 're attualmente in uso con DownloadString), ma penso che lo troverete più facile lavorare con i leggermente) classi di livello inferiore (WebRequest e WebResponse.

Ci sono due parti in questo - il primo è di inviare il form di login, il secondo sta recuperando l'intestazione "Set-cookie" e l'invio che al server come "biscotto" con la vostra richiesta GET. Il server utilizzerà questo cookie per identificarti da ora in poi (ammesso che sta utilizzando l'autenticazione basata su cookie, che sono abbastanza sicuro è come la pagina restituisce un colpo di testa Set-cookie che comprende "PHPSESSID").


postando il form di login

messaggi Form sono facili da simulare, è solo un caso di formattazione dei dati post nel seguente modo:

field1=value1&field2=value2

Utilizzando WebRequest e il codice ho adattato da Scott Hanselman , ecco come ci si POST dati del modulo per modulo di login:

string formUrl = "http://www.mmoinn.com/index.do?PageModule=UsersAction&Action=UsersLogin"; // NOTE: This is the URL the form POSTs to, not the URL of the form (you can find this in the "action" attribute of the HTML's form tag
string formParams = string.Format("email_address={0}&password={1}", "your email", "your password");
string cookieHeader;
WebRequest req = WebRequest.Create(formUrl);
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
req.ContentLength = bytes.Length;
using (Stream os = req.GetRequestStream())
{
    os.Write(bytes, 0, bytes.Length);
}
WebResponse resp = req.GetResponse();
cookieHeader = resp.Headers["Set-cookie"];

Ecco un esempio di ciò che si dovrebbe vedere nell'intestazione Set-cookie per il modulo di login:

PHPSESSID=c4812cffcf2c45e0357a5a93c137642e; path=/; domain=.mmoinn.com,wowmine_referer=directenter; path=/; domain=.mmoinn.com,lang=en; path=/;domain=.mmoinn.com,adt_usertype=other,adt_host=-

Come la pagina dietro il form di login

Ora è possibile eseguire la richiesta GET a una pagina che è necessario effettuare il login per.

string pageSource;
string getUrl = "the url of the page behind the login";
WebRequest getRequest = WebRequest.Create(getUrl);
getRequest.Headers.Add("Cookie", cookieHeader);
WebResponse getResponse = getRequest.GetResponse();
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
    pageSource = sr.ReadToEnd();
}

Modifica

Se avete bisogno di visualizzare i risultati del primo post, è possibile recuperare il codice HTML è tornato con:

using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
    pageSource = sr.ReadToEnd();
}

Inserisci questo direttamente sotto cookieHeader = resp.Headers["Set-cookie"]; e quindi ispezionare la stringa tenutosi a pageSource.

È possibile semplificare le cose un po 'con la creazione di una classe che deriva da WebClient, ignorando il suo metodo GetWebRequest e l'impostazione di un oggetto CookieContainer su di esso. Se si imposta sempre la stessa istanza CookieContainer, quindi la gestione dei cookie verrà gestita automaticamente per voi.

Ma l'unico modo per arrivare alla HttpWebRequest prima di essere inviato è quello di ereditare da WebClient e sovrascrivere quel metodo.

public class CookieAwareWebClient : WebClient
{
    private CookieContainer cookie = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = cookie;
        }
        return request;
    }
}

var client = new CookieAwareWebClient();
client.BaseAddress = @"https://www.site.com/any/base/url/";
var loginData = new NameValueCollection();
loginData.Add("login", "YourLogin");
loginData.Add("password", "YourPassword");
client.UploadValues("login.php", "POST", loginData);

//Now you are logged in and can request pages    
string htmlSource = client.DownloadString("index.php");

Matthew Brindley , il codice ha funzionato molto bene per qualche sito che mi serviva (con login), ma avevo bisogno per passare alla HttpWebRequest e HttpWebResponse altrimenti ho un 404 Bad Request dal server remoto. Inoltre vorrei condividere la mia soluzione utilizzando il codice, ed è che ho provato ad accedere ad un sito web basato su Moodle , ma non ha funzionato al vostro passo " Come pagina dietro il modulo di accesso ", perché quando con successo il posting il login, il 'Set-Cookie' intestazione non ha restituisce nulla, nonostante altri siti web lo fa.

Quindi penso che questo in cui abbiamo bisogno di memorizzare i cookie per le prossime richieste, così ho aggiunto questo.
Per il " postando il form di login " blocco di codice:

var cookies = new CookieContainer();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(formUrl);
req.CookieContainer = cookies;


E al " Ottenere la pagina dietro il form di login ":

HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl);
getRequest.CookieContainer = new CookieContainer();
getRequest.CookieContainer.Add(resp.Cookies);
getRequest.Headers.Add("Cookie", cookieHeader);


In questo modo, mi permette di login Entra e ottenere il codice sorgente della pagina "dietro login" (Moodle basato sito web) So che questo è un uso vaga del CookieContainer e httpCookies perché possiamo chiedere prima è esiste un precedente set di cookie salvati prima di inviare la richiesta al server. Questo funziona senza problemi in ogni caso, ma qui è un buon informazioni di leggere su WebRequest e WebResponse con progetti di esempio e tutorial:
Recupero contenuto HTTP in .NET
Come utilizzare HttpWebRequest e HttpWebResponse in .NET

A volte, può aiutare a spegnere AllowAutoRedirect e impostazione sia POST login e pagina GET richiede lo stesso user agent.

request.UserAgent = userAgent;
request.AllowAutoRedirect = false;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top