Pregunta

Soy relativamente nuevo en el uso de C #, y tienen una aplicación que lee partes del código fuente en un sitio web. Que todas las obras; pero el problema es que la página en cuestión requiere que el usuario estar conectado para acceder a este código fuente. Lo que mi programa necesita una manera de conectarse inicialmente al usuario en el sitio web-después de lo que se hace, voy a ser capaz de acceder y leer el código fuente.

La página web que necesita ser conectado a es: mmoinn.com/index.do?PageModule=UsersLogin

He buscado durante todo el día acerca de cómo hacer esto y trató de ejemplos, pero no han tenido suerte.

Gracias de antemano

No hay solución correcta

Otros consejos

Puede seguir utilizando WebClient a POST (en lugar de GET, que es el HTTP verbo que 'Actualmente está utilizando con DownloadString), pero creo que usted encontrará que es más fácil trabajar con las clases (un poco) de nivel inferior WebRequest y WebResponse.

Hay dos partes en este - el primero es para publicar el formulario de acceso, la segunda está recuperando el "set-cookie" de cabecera y el envío de nuevo a que el servidor como "cookies", junto con su solicitud GET. El servidor usará esta cookie para identificarlo a partir de ahora (suponiendo que se trata de utilizar la autenticación basada en cookies, que estoy bastante seguro de que es lo que devuelve una página de cabecera Set-cookie que incluye "PHPSESSID").


publicar al formulario de acceso

Forma mensajes son fáciles de simular, es sólo un caso de dar formato a los datos de envío de la siguiente manera:

field1=value1&field2=value2

El uso de WebRequest y el código de Adapté de Scott Hanselman , aquí es como se había puesto los datos del formulario a su formulario de entrada:

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"];

Este es un ejemplo de lo que debería ver en la cabecera Set-Cookie para su formulario de acceso:

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

Obteniendo la página detrás del formulario de acceso

Ahora puede realizar su solicitud GET a una página que tiene que estar conectado para.

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();
}

EDIT:

Si necesita ver los resultados de la primera entrada, puede recuperar el código HTML se volvió con:

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

Coloque esta directamente debajo cookieHeader = resp.Headers["Set-cookie"]; y luego inspeccionar la cadena celebrada en pageSource.

Se puede simplificar bastante las cosas mediante la creación de una clase que deriva de cliente Web, anulando su método GetWebRequest y establecer un objeto CookieContainer en él. Si siempre configura la misma instancia CookieContainer, a continuación, la administración de cookies se manejará de forma automática.

Sin embargo, la única manera de conseguir en el HttpWebRequest antes de ser enviada es heredar de cliente Web y anular ese método.

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");

Mateo Brindley , su código funcionó muy bien para algún sitio web que necesitaba (con entrada), pero necesitaba para cambiar a otro modo HttpWebRequest y HttpWebResponse consigo un 404 Bad Request desde el servidor remoto. También me gustaría compartir mi solución utilizando su código, y es que lo probé para iniciar sesión en un sitio web basado en Moodle , pero no funcionó en el paso de " Obteniendo la página detrás del formulario de acceso " porque cuando éxito publicar el inicio de sesión, el 'Set-Cookie' cabecera no devuelve nada a pesar de otros sitios web.

Así que creo que este donde tenemos que almacenar cookies para próximas solicitudes, por lo que añade esto.
Para el " publicar al formulario de acceso " bloque de código:

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


Y a los " Obteniendo la página detrás del formulario de acceso ":

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


Al hacer esto, me deja ¿Iniciar sesión en y obtener el código fuente de la página de "detrás de inicio de sesión" (moodle basada sitio web) Sé que esto es un uso impreciso del CookieContainer y HTTPCookies porque podemos preguntar primero es existe un conjunto de galletas de previamente guardados antes de enviar la solicitud al servidor. Esto funciona sin problema de todos modos, pero aquí es una buena información para leer sobre WebRequest y WebResponse con proyectos de ejemplo y tutorial:
Recuperando contenido HTTP en .NET
Cómo utilizar HttpWebRequest y HttpWebResponse en .NET

A veces, puede ayudar a apagar AllowAutoRedirect y el establecimiento tanto POST de inicio de sesión y la página GET pide al mismo agente de usuario.

request.UserAgent = userAgent;
request.AllowAutoRedirect = false;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top