Estoy intentando escribir código que se autenticará en el sitio web wallbase.cc. He mirado en lo que hace uso de herramientas de desarrollador Firfebug/Chrome y parece bastante fácil:Problemas al autenticar al sitio web desde el código
postal "usrname = $ USER & pase = $ PASS & nopass_email = Tipo + + en su dirección de correo + + y + presione + ingrese & nopass = 0 "a la página web" http://wallbase.cc/user/login ", almacene las cookies devueltas y úselas en todas las solicitudes futuras.
Aquí está mi código:
private CookieContainer _cookies = new CookieContainer();
//......
HttpPost("http://wallbase.cc/user/login", string.Format("usrname={0}&pass={1}&nopass_email=Type+in+your+e-mail+and+press+enter&nopass=0", Username, assword));
//......
private string HttpPost(string url, string parameters)
{
try
{
System.Net.WebRequest req = System.Net.WebRequest.Create(url);
//Add these, as we're doing a POST
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
((HttpWebRequest)req).Referer = "http://wallbase.cc/home/";
((HttpWebRequest)req).CookieContainer = _cookies;
//We need to count how many bytes we're sending. Post'ed Faked Forms should be name=value&
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(parameters);
req.ContentLength = bytes.Length;
System.IO.Stream os = req.GetRequestStream();
os.Write(bytes, 0, bytes.Length); //Push it out there
os.Close();
//get response
using (System.Net.WebResponse resp = req.GetResponse())
{
if (resp == null) return null;
using (Stream st = resp.GetResponseStream())
{
System.IO.StreamReader sr = new System.IO.StreamReader(st);
return sr.ReadToEnd().Trim();
}
}
}
catch (Exception)
{
return null;
}
}
Después de llamar HttpPost con mis parámetros de conexión que se puede esperar todas las llamadas futuras utilizando este mismo método para ser autenticados (suponiendo un nombre de usuario/contraseña válidos). Obtengo una cookie de sesión en mi colección de cookies, pero por alguna razón no estoy autenticado. Recibo una cookie de sesión en mi colección de cookies independientemente de la página que visite, así que traté de cargar la página de inicio primero para obtener la cookie de sesión inicial y luego iniciar sesión, pero no hubo cambios.
Que yo sepa, esta versión de Python funciona: https://github.com/sevensins/Wallbase-Downloader/blob/master/wallbase.sh (línea 336)
¿Alguna idea sobre cómo conseguir que funcione la autenticación?
Actualización # 1
Cuando se utiliza un usuario/contraseña correcta emparejar la respuesta redirige automáticamente a la de referencia, pero cuando se recibe un par usuario/acceso incorrecto que no redirige y devuelve un mal par de usuario/pass. En base a esto, parece que la autenticación está ocurriendo, pero tal vez no se estén guardando todas las piezas clave de información.
Actualización # 2
estoy usando .NET 3.5. Cuando probé el código anterior en .NET 4, con la línea agregada de System.Net.ServicePointManager.Expect100Continue = false
(que estaba en mi código, que no se muestra aquí) funciona, no es necesario realizar cambios. El problema parece provenir directamente de algún problema previo a la red 4.
Debe asegurarse de cerrar/eliminar la 'respuesta' - o ponerla en un bloque' using() '. ¿Está reutilizando el mismo contenedor de cookies en solicitudes posteriores? – debracey
@debracey: Estoy usando el mismo contenedor de cookies, el contenedor de cookies es una variable privada de nivel de clase que se reutiliza para cada HttpPost. Ajusté mi código para usar el uso de bloques y actualicé el código en mi pregunta, sin cambios. – Peter