Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Kaxperday en 24 Noviembre 2014, 16:33 pm



Título: Iniciar sesion en web con C#
Publicado por: Kaxperday en 24 Noviembre 2014, 16:33 pm
Hola a todos, he encontrado el siguiente código que según pone el que lo posteo debería iniciar sesión en una página web llevando a cabo todas las redirecciones y cookies necesarias hasta llegar a la cookie de sesión JSESSIONID.

Link: http://stackoverflow.com/questions/14758917/c-sharp-download-file-from-the-web-with-login

Código
  1. CookieCollection cookies = new CookieCollection();
  2.        HttpWebRequest cookieRequest = (HttpWebRequest)WebRequest.Create("https://www.loginpage.com/");
  3.        cookieRequest.CookieContainer = new CookieContainer();
  4.        cookieRequest.CookieContainer.Add(cookies);
  5.        HttpWebResponse cookieResponse = (HttpWebResponse)cookieRequest.GetResponse();
  6.        cookies = cookieResponse.Cookies;
  7.  
  8.        string postData = "name=********&password=*********&submit=submit";
  9.        HttpWebRequest loginRequest = (HttpWebRequest)WebRequest.Create("https://www.loginpage.com/");
  10.        loginRequest.CookieContainer = new CookieContainer();
  11.        loginRequest.CookieContainer.Add(cookies);
  12.        loginRequest.Method = WebRequestMethods.Http.Post;
  13.        loginRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
  14.        loginRequest.AllowWriteStreamBuffering = true;
  15.        loginRequest.ProtocolVersion = HttpVersion.Version11;
  16.        loginRequest.AllowAutoRedirect = true;
  17.        loginRequest.ContentType = "application/x-www-form-urlencoded";
  18.  
  19.        byte[] byteArray = Encoding.ASCII.GetBytes(postData);
  20.        loginRequest.ContentLength = byteArray.Length;
  21.        Stream newStream = loginRequest.GetRequestStream(); //open connection
  22.        newStream.Write(byteArray, 0, byteArray.Length); // Send the data.
  23.        newStream.Close();
  24.  

Ahora bien, ¿esto funciona? porque lo he probado para iniciar sesión en una web y no hizo nada.
¿Cómo puedo ver las cookies que tiene?, ¿cómo saber si ha recogido algo o no? ¿Cómo funciona?

Lo he depurado y no cargaban nada de respuesta las variables.

Viendo todo esto me pregunto si este es el camino correcto para iniciar sesión en una web usando C#, de ser así ¿podríais guiarme un poco para conseguir la cookie de sesión JESESSIONID?.

Saludos y gracias.


Título: Re: Iniciar sesion en web con C#
Publicado por: kub0x en 24 Noviembre 2014, 17:35 pm
Hombre si copias y pegas el código tal cual no vas a poder logearte en ninguna web. Tienes que conocer bien las variables enviadas al servidor, así como el método utilizado por el protocolo HTTP para enviar dichos datos.

Con la extensión FireBug puedes ver fácilmente que variables envías al servidor y los métodos empleados. En ese código el método es POST y te falta definir la url destino (página del login) y la cadena de variables (postData). Pon de tu parte y te ayudaremos ;)

Saludos.


Título: Re: Iniciar sesion en web con C#
Publicado por: Kaxperday en 24 Noviembre 2014, 23:17 pm
Hola kubox agradezco enormemente tu respuesta, me acabo de instalar el firebug ya aprenderé a usarlo, hasta ahora para ver las variables me iba al código fuente y buscaba las etiquetas del form, allí estaban las variables para iniciar sesión que necesitaba.

He puesto esas variables en el código de arriba, el hotmail y la contraseña y las he cargado con un hotmail y contraseña auténticos, y he puesto la url de la página de login.

Estoy en la página de login y hago POST a las variables que necesito para iniciar sesión pero qué ocurre? ¿cómo se si me ha funcionado?, antes pensaba en hacer algo que vaya haciendo POST de una url a otra (pues al iniciar sesión te redirige a varias páginas dónde te carga cookies etc).
Pero al leer esto parece que no es necesario que con esto funcionaría con la colección de cookies.

Pero vaya entiendo poco, y no se si he iniciado sesión o nisiquiera si funciona, en la página el método es POST, vaya preferiría no darte la url y variables reales de la página, si quieres te mando un privado.

Estoy en ello, gracias.


Título: Re: Iniciar sesion en web con C#
Publicado por: kub0x en 24 Noviembre 2014, 23:36 pm
Pero vaya entiendo poco, y no se si he iniciado sesión o nisiquiera si funciona, en la página el método es POST, vaya preferiría no darte la url y variables reales de la página...

Para saber si has logeado tendrás que comprobar el código fuente de la respuesta HTML que te envía el servidor del login. Ahí habrá un mensaje de error en el caso de no haberte conectado. En el caso de haberte conectado, tendrás que ver si el HTML tiene el apartado de "Correo Outlook" o otro servicio que solo salga en el HTML al estar logeado. Es decir, toca parsear HTML.

Te recomiendo que uses Firebug para ver las peticiones que envías al servidor, sean GET o POST, para así tener una referencia directa y real de los datos que se envían al server, además, Firebug te saca las cookies, para que puedas comprobar si las cookies están siendo recogidas por tu code.

Para coger la respuesta del servidor haz lo siguiente, ten en cuenta que lo he escrito al momento, sin testear:

Código
  1. HttpWebResponse response = (HttpWebResponse)newStream.GetResponse();
  2. Stream responseStream = response.GetResponseStream();
  3. StreamReader sr = new StreamReader(responseStream);
  4. String responseHtml = sr.ReadToEnd();
  5. sr.Close();
  6. responseStream.Close();
  7. response.Close();
  8. //Aquí harías la validación del código fuente
  9. //Buscarías errores de login dentro del HTML (Ejemplo: User y pass no validos..)

Un saludo.


Título: Re: Iniciar sesion en web con C#
Publicado por: Kaxperday en 24 Noviembre 2014, 23:51 pm
OMG, lo acabo de probar tenías un error que lo corregí o eso creo.
Lo he mostrado por pantalla y me acaba de salir un santo HTML de 1000 lineas xD.
Supongo que querrías decir esto:

Código
  1. CookieCollection cookies = new CookieCollection();
  2. HttpWebRequest cookieRequest = (HttpWebRequest)WebRequest.Create("http://pagina.com/login");
  3. cookieRequest.CookieContainer = new CookieContainer();
  4. cookieRequest.CookieContainer.Add(cookies);
  5. HttpWebResponse response = (HttpWebResponse)cookieRequest.GetResponse();
  6. Stream responseStream = response.GetResponseStream();
  7. StreamReader sr = new StreamReader(responseStream);
  8. String responseHtml = sr.ReadToEnd();
  9. sr.Close();
  10. responseStream.Close();
  11. response.Close();
  12.  

Supongo y solo supongo, puse MessageBox.Show(responseHtml), y me salio un pedazo de html, pero como puedo ver las cookies que tengo, las cookies que he recibido y saber si está la de inicio de sesión supongo que esa será una de las maneras de validar si se ha iniciado sesión correctamente, saludos y gracias.

Sigo con ello.

Edito: Las cookies las suelo ver con el HTTP HEADERS, busco uno llamada JESSESIONID, aunque probaré también con el firebug, aunque no se como verlas con el código, no deja pasarlo a cadena xd

Vaya con el firebug acabo de ver las cookies, me sale alguna cookie de otra web, pensaba que trabajaba con una página solo xd, entre otras tiene:

__insp_norec_sess
__insp_nv
__insp_ref
__insp_slim
__insp_wid
_ga
_gat
_gat_newTracker

Me extraño no ver la de JSESSIONID, pues al iniciar sesion con HTTP LIVE HEADERS aparece quizás sea temporal, bueno entonces son esas de ahí las que parecen interesar.

Aaamigo mio parece que no he iniciado bien la sesión porque en el HTML devuelto me pone esta dulzura:

<div class="error_arrow-absolute nerror error_password_not_valid none">Contraseña incorrecta<div class="arrow-up"></div>

Así que nada, luego vi algo de las cookies todas ellas embebidas en funciones de javascript (pues claro es lo que se usa para inyectarlas xD), supongo que debería rascar cada cookie con sus atributos si mi inicio de sesión hubiera sido correcto e intentar hacer el POST con la sesión utilizando las cookies recibidas.

Saludos, sigo en ello.


Título: Re: Iniciar sesion en web con C#
Publicado por: kub0x en 25 Noviembre 2014, 00:05 am
Hazme caso, antes de codear analiza el escenario, codear es lo último, te recomiendo que uses Firebug para ver la info que estás enviando, a que web, que método (POST) y las cookies. Luego ya introduces esos valores dentro del código.

Para saber que cookies has recibido en la respuesta, simplemente consulta la propiedad Cookies del objeto HttpWebResponse (response.Cookies), ahí está el contenedor de las cookies, así que puedes comprobarlas iterando esa estructura.

La respuesta HTML que recibes sirve para validar si hay algún mensaje de error dentro de la respuesta. El MsgBox obviamente te desplegará una ventana enorme, tienes que idear un método para encontrar posibles errores de login dentro de la página. Esto último es fácil, haz mal el login en tu correo de forma normal (con firefox/chrome whatever) y apunta el mensaje de error. Ahora en C# sólo te falta buscar ese mensaje de error en la variable responseHtml.

Saludos.


Título: Re: Iniciar sesion en web con C#
Publicado por: Kaxperday en 25 Noviembre 2014, 00:14 am
Vaya estaba modificando el último mensaje cuando ya habías escrito la nueva respuesta.

Si ya he encontrado que hay un error de login, si en firebug ya he iniciado sesión y tengo todas las cookies (las he encontrado alli si xD), ahora lo que busco es comprobar si las cookies que obtengo son las mismas que las de firefox, para ello he probado maneras para mostrarlas, pero (se que es una chorrada pero no la encuentro), como puedo saber que cookies tengo si no las see mostrar por pantalla xD, no se como obtener el string para poderlo mostrar response.Cookies.*?

Gracias, sigo con ello.

Edito: Aaamigo ya he encontrado la cookie JSESSIONID, resultaba ser de otro dominio, OMG que cosa más rara es una cookie de otro dominio que se crea cuando inicias sesion en la página, una cookie externa, ¿por que? Tambien hay otra cookie que le ocurre lo mismo __cfduid esa tambien pertenece a otro dominio pero se crea al iniciar sesion en la página,  luego algunas de youtube (jeje) y las demás son de la pagina.



Título: Re: Iniciar sesion en web con C#
Publicado por: kub0x en 25 Noviembre 2014, 00:46 am
Supongo que te conectarás a un sitio pasarela estilo login.live.com. Esos dominios suelen redireccionarte a otros, por lo que las cookies corresponden al dominio destino realmente. Las cookies de terceros pueden ser trackers que estén absorbiendo información tuya, o pueden pertenecer a plataformas o servicios adjuntos.

Para ver las cookies en C# -> http://msdn.microsoft.com/es-es/library/system.net.httpwebresponse.cookies%28v=vs.110%29.aspx

Sigue posteando tu progreso ;)

Saludos.


Título: Re: Iniciar sesion en web con C#
Publicado por: Kaxperday en 25 Noviembre 2014, 00:59 am
Código usado (no asustarse):

Código
  1. CookieCollection cookies = new CookieCollection();
  2.            HttpWebRequest cookieRequest = (HttpWebRequest)WebRequest.Create("http://paginar/login");
  3.            cookieRequest.CookieContainer = new CookieContainer();
  4.            cookieRequest.CookieContainer.Add(cookies);
  5.            HttpWebResponse cookieResponse = (HttpWebResponse)cookieRequest.GetResponse();
  6.            cookies = cookieResponse.Cookies;
  7.  
  8.            string postData = "action=login&ref=&email=nombre%40hotmail.com&password=apellido";
  9.            HttpWebRequest loginRequest = (HttpWebRequest)WebRequest.Create("http://pagina/login");
  10.            loginRequest.CookieContainer = new CookieContainer();
  11.            loginRequest.CookieContainer.Add(cookies);
  12.            loginRequest.Method = WebRequestMethods.Http.Post;
  13.            loginRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
  14.            loginRequest.AllowWriteStreamBuffering = true;
  15.            loginRequest.ProtocolVersion = HttpVersion.Version11;
  16.            loginRequest.AllowAutoRedirect = true;
  17.            loginRequest.ContentType = "application/x-www-form-urlencoded";
  18.  
  19.            byte[] byteArray = Encoding.ASCII.GetBytes(postData);
  20.            loginRequest.ContentLength = byteArray.Length;
  21.            Stream newStream = loginRequest.GetRequestStream(); //open connection
  22.            newStream.Write(byteArray, 0, byteArray.Length); // Send the data.
  23.            newStream.Close();
  24.  
  25.            HttpWebResponse response = (HttpWebResponse)cookieRequest.GetResponse();
  26.            Stream responseStream = response.GetResponseStream();
  27.            StreamReader sr = new StreamReader(responseStream);
  28.            String responseHtml = sr.ReadToEnd();
  29.            foreach (Cookie cook in response.Cookies)
  30.            {
  31.                tb_instrucciones.Text += ("Cookie:");
  32.                tb_instrucciones.Text +=("{0} = {1}"+ cook.Name+ cook.Value);
  33.                tb_instrucciones.Text +=("Domain: {0}"+ cook.Domain);
  34.                tb_instrucciones.Text +=("Path: {0}"+ cook.Path);
  35.                tb_instrucciones.Text +=("Port: {0}"+ cook.Port);
  36.                tb_instrucciones.Text +=("Secure: {0}"+ cook.Secure);
  37.  
  38.                tb_instrucciones.Text += ("When issued: {0}" + cook.TimeStamp);
  39.                tb_instrucciones.Text += ("Expires: {0} (expired? {1})" +
  40.                    cook.Expires+ cook.Expired);
  41.                tb_instrucciones.Text += ("Don't save: {0}" + cook.Discard);
  42.                tb_instrucciones.Text += ("Comment: {0}" + cook.Comment);
  43.                tb_instrucciones.Text += ("Uri for comments: {0}" + cook.CommentUri);
  44.                tb_instrucciones.Text += ("Version: RFC {0}  cook.Version == 1 ? \"2109\" : \"2965\"");
  45.  
  46.                // Show the string representation of the cookie.
  47.                tb_instrucciones.Text = ("String: {0}" + cook.ToString());
  48.            }
  49.            sr.Close();
  50.            responseStream.Close();
  51.            response.Close();
  52.            MessageBox.Show(responseHtml);
  53.            //tb_instrucciones.Text = responseHtml;
  54.  

Sigo en ello, con gente como tu da gusto me aprendía todo en un día  ;-)

Edito: vale me sale que tiene 2 cookies en la colección usé esto: MessageBox.Show(response.Cookies.Count.ToString());

Edito: La madre que lo pario, la linea 47 igualaba y no añadia fail mio xD, sigue teniendo olo 2 cookies.
Ahora si me salen todas las cookies buena parrafada:

Cookie:{0} = {1}dsi=15c551cc68647dcf586e60d50f9485cf15c55f1c%7Ew08%2BrKK6Bkh1hE%2B%2Fb3rYk8fvkl0oSJpdzDsf5U4BzKGx%2BI1jRcY9Qelpl36x%2FMJS14eBS%2BJDdoOM9c8UMPu%2FTQfyrz4jaoQ%2FJ6ghK%2B%2BHmoCX37vxqLw1MWfDP50awAIqqqDRTb22fTpklZH8%3DDomain: {0}pag.comPath: {0}/Port: {0}Secure: {0}FalseWhen issued: {0}25/11/2014 1:07:10Expires: {0} (expired? {1})25/11/2014 13:07:15FalseDon't save: {0}FalseComment: {0}Uri for comments: {0}Version: RFC {0}  cook.Version == 1 ? "2109" : "2965"String: {0}dsi=15c551cc68647dcf586e60d50f9485cf15c55f1c%7Ew08%2BrKK6Bkh1hE%2B%2Fb3rYk8fvkl0oSJpdzdDs5U4BzKGx%2BI1jRcY9Qelpl36x%2FMJS14eBS%2BJDdoOM9c8UMPu%2FTQfyrz4jaoQ%2FJ6ghK%2B%2BHmoCX37vxqLw1MWfDP50awAIqqqDRTb22fTpklZH8%3DCookie:{0} = {1}dgbs%5B%5DDomain: {0}pagina.comPath: {0}/Port: {0}Secure: {0}FalseWhen issued: {0}25/11/2014 1:07:10Expires: {0} (expired? {1})25/12/2014 1:07:15FalseDon't save: {0}FalseComment: {0}Uri for comments: {0}Version: RFC {0}  cook.Version == 1 ? "2109" : "2965"String: {0}dgbs=%5B%5D

Parece ser que obtendo 2 cookies llamadas dsi, Algo que no me extraña pues intenté hacer este programa en C++ y al hacer el post sobre la url del login, me devolvía 2 cookies llamadas dsi, pero por otro lado me asusta porque quizás indique que esto no haga las redirecciones donde va cogiendo y soltando cookies, como las cookies de dominios de terceros.

Cambio y corto, mañana vuelvo con ello, gracias kub0x.

Edito: Bueno sigue sin iniciar sesión, pero tengo una duda esto simplemente hace un POST la url del login con las variables del POST para loguearse (hotmail, pass...) cosa que no iniciaría sesión ya que tras ese POST hay que hacer varios más a otras páginas de otros dominios para obtener otras cookies y poder llegar a logurarse realemente, O este código me haría ya todas las redirecciones para iniciar sesión como ponía el que lo creó?, cosa que cada vez me creo menos xS

Si obtengo las 2 cookies dsi (me debería quedar solo con la segunda según RFC), pero ahora ¿que viene después?, saludos y gracias.

Edito: La única solución que veo factible ya que no me aplica redirecciones automáticas a pesar de esto: (Pues es como si no pongo nada)

Código
  1. loginRequest.AllowAutoRedirect = true;
  2. loginRequest.MaximumAutomaticRedirections = 300;

Es copiar con HTTP LIVE HEADERS el mecanismo de firefox cuando inicia sesión en la web y copiar los mismos POST aunque la dificultad estará en encontrar los vitales, y los que son prescindibles, los navegadores automatizan este proceso de redireccionamiento, podemos codearlo (muy complejo) o copiar a firefox para esa página y ya nos funcionará el inicio de sesión para esa página solo pero habremos cumplido el objetivo, no se si voy bien encaminado.

Edito: Buenas gente decidí cambiar el método de inicio de sesión, y buscando y buscando y buscando encontré un código para iniciar sesión en twitter, y lo he traspasado a mi web a la que quiero iniciar sesión, esta no tiene authenticy_token luego podemos quitarlo pero para iniciar sesión en mi página es necesario cargar 2 cookies de terceros dominios para más seguridad será.

La salida esta en la clase WebBrowser (http://msdn.microsoft.com/es-es/library/system.windows.forms.webbrowser%28v=vs.110%29.aspx) he encontrado un posible camino pues.

LINK: http://eclipsed4utoo.com/blog/tag/website/ (http://eclipsed4utoo.com/blog/tag/website/)

El caso es que no me va el inicio de sesión aún, me dice error 403, que he podido iniciar bien sesión pero que no tengo permiso para ver la página, de alguna manera me han detectado que soy un bot, o que me faltan cookies de terceros dominios, cuando se ejecuta el código te hacen ejecutar scripts js, probadlo si os interesa, sigo en ello.

Código
  1. string url = "http://pagina.com/login";
  2.    string username = "larala";
  3.    string password = "larali";
  4.    string commit = "Sign+In"; //this matches the data from Tamper Data
  5.  
  6. private void botonIniciarSesion_Click(object sender, EventArgs e)
  7.        {
  8.            WebBrowser b = new WebBrowser();
  9.            b.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(b_DocumentCompleted);
  10.            b.Navigate(url);
  11.        }
  12.  
  13.  
  14.    private void b_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
  15.    {
  16.         WebBrowser b = sender as WebBrowser;
  17.         string response = b.DocumentText;
  18.  
  19.         // unregisters the first event handler
  20.        // adds a second event handler
  21.         b.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(b_DocumentCompleted);
  22.        b.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(b_DocumentCompleted2);
  23.  
  24.      // format our data that we are going to post to the server
  25.       // this will include our post parameters.  They do not need to be in a specific
  26.       // order, as long as they are concatenated together using an ampersand ( & )
  27.        string postData = string.Format("action=login&ref=&email=larala&password=larali");
  28.  
  29.       ASCIIEncoding enc = new ASCIIEncoding();
  30.  
  31.       //  we are encoding the postData to a byte array
  32.           b.Navigate("http://pagina.com/cuestiones", "", enc.GetBytes(postData), "Content-Type: application/x-www-form-urlencoded\r\n");
  33.    }
  34.  
  35.    private void b_DocumentCompleted2(object sender, WebBrowserDocumentCompletedEventArgs e)
  36.    {
  37.         WebBrowser b = sender as WebBrowser;
  38.         string response = b.DocumentText;
  39.             tboxInstrucciones.Text = response;
  40.         if (response.Contains("MINOMBREUSUARIO"))
  41.         {
  42.             MessageBox.Show("Login Successful");
  43.         }
  44.    }

ENJOY.

Saludos.


Título: Re: Iniciar sesion en web con C#
Publicado por: kub0x en 29 Noviembre 2014, 18:46 pm
La verdad, no me ha sido díficil logearme con el code que he hecho en C#, supongo que habrás seguido mal mis pasos o te habrás desviado del tema. HTTP Live Headers era el plugin que usaba antes de FireBug, ya que FireBug permite hasta consultas AJAX, javascript, Cookies además lo gestiona manera práctica.

Prueba lo siguiente en mi code:

1. Haz un intento de login falso y mira el mensaje. Deberia de ser "Login failed!"
2. Haz login con tus credenciales y mira el mensaje. Debería de ser "Login Successful!"

Código
  1. using System;
  2. using System.IO;
  3. using System.Net;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace POSTLogin
  10. {
  11.    class Program
  12.    {
  13.        static void Main(string[] args)
  14.        {
  15.            SendRequest();
  16.            Console.Read();
  17.        }
  18.  
  19.        private static void SendRequest()
  20.        {
  21.            string postData = "email=tuemail@dominio.com&password=tupassword";
  22.            byte[] byteData = ASCIIEncoding.ASCII.GetBytes(postData);
  23.            HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create("http://login.web.com");
  24.            req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  25.            //req.Connection = "keep-alive";
  26.            req.ContentType = "application/x-www-form-urlencoded";
  27.            req.ContentLength = byteData.Length;
  28.            req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0";
  29.            req.Host = "login.web.com";
  30.            req.Method = "POST";
  31.            req.Proxy = null;
  32.            using (Stream reqStream = req.GetRequestStream())
  33.                reqStream.Write(byteData, 0, byteData.Length);
  34.            GetResponse(req);
  35.        }
  36.  
  37.        private static void GetResponse(HttpWebRequest req)
  38.        {
  39.            HttpWebResponse response = (HttpWebResponse) req.GetResponse();
  40.            using (Stream responseStream = response.GetResponseStream())
  41.            {
  42.                using (StreamReader sr = new StreamReader(responseStream))
  43.                {
  44.                    string responseData = sr.ReadToEnd();
  45.                    if (!responseData.Contains("Iniciar se"))
  46.                        Console.WriteLine("Login successful!");
  47.                    else
  48.                        Console.WriteLine("Login failed!");
  49.                }
  50.            }
  51.        }
  52.  
  53.    }
  54. }

Saludos.


Título: Re: Iniciar sesion en web con C#
Publicado por: Kaxperday en 29 Noviembre 2014, 19:37 pm
SI FUNCIONAA!!! :) (https://www.youtube.com/watch?v=BvLLNUD4jB0)

Mil gracias aun no me lo creo, así es introduce login correcto y funcionó :)), me estudiare ese code con detalle, MIL gracias, ahora probaré a crear un tema con ese inicio de sesión o algo, pero que raro no? no necesito cookies? xD (mejor!), ahora para respondercrear un tema o un mensaje supongo que deberé hacer HttpWebRequest y cargar las varibles como al inicio de sesión, no sé iré probando.

Mil gracias por dedicarle el tiempo maestro ;-) ;-) ;-)

Bueno socio tengo una duda, estoy intentando crear un mensaje con esa sesión y claro tendría que hacerlo con el httprequest anterior que ya inicio sesion correctamente, pero la direccion es otra en el http request pues ya no es la url de /login ahora es la te un /temacualquieraquesea, debo crear otra httprequest, como podría hacerlo aprovechando el inicio de sesion de la anterior, he probado lo siguiente pero no escribe nada:

Código
  1. string postData = "email=user&password=pass";
  2.            byte[] byteData = ASCIIEncoding.ASCII.GetBytes(postData);
  3.            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://pagina.com/user/login");
  4.            req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  5.            //req.Connection = "keep-alive";
  6.            req.ContentType = "application/x-www-form-urlencoded";
  7.            req.ContentLength = byteData.Length;
  8.            req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0";
  9.            req.Host = "pagina.com";
  10.            req.Method = "POST";
  11.            req.Proxy = null;
  12.            using (Stream reqStream = req.GetRequestStream())
  13.                reqStream.Write(byteData, 0, byteData.Length);
  14.            //Cojemos respuesta.
  15.            HttpWebResponse response = (HttpWebResponse)req.GetResponse();
  16.            using (Stream responseStream = response.GetResponseStream())
  17.            {
  18.                using (StreamReader sr = new StreamReader(responseStream))
  19.                {
  20.                    string responseData = sr.ReadToEnd();
  21.                    if (!responseData.Contains("Iniciar se"))
  22.                        MessageBox.Show("Login successful!");
  23.                    else
  24.                        MessageBox.Show("Login failed!");
  25.                }
  26.            }
  27.            string directorio = Directory.GetCurrentDirectory();
  28.            string linea, mensaje;
  29.            StreamReader reader = new StreamReader(directorio + "\\Temas.txt");
  30.            StreamReader readel = new StreamReader(directorio + "\\MisRespuestas.txt");
  31.            detenerRespuestas = false;
  32.            do
  33.            {
  34.                linea = reader.ReadLine();
  35.                mensaje = readel.ReadLine();
  36.                if(linea == "" || mensaje == "" || detenerRespuestas == true)
  37.                {
  38.                    break;
  39.                }
  40.                string postData2 = "qaa_content=" + mensaje + "&action=reply";
  41.                byte[] byteData2 = ASCIIEncoding.ASCII.GetBytes(postData2);
  42.                HttpWebRequest req2 = (HttpWebRequest)HttpWebRequest.Create(linea);
  43.                req2.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  44.                req2.ContentType = "application/x-www-form-urlencoded";
  45.                req2.ContentLength = byteData2.Length;
  46.                req2.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0";
  47.                req2.Host = "pagina.com";
  48.                req2.Method = "POST";
  49.                req2.Proxy = null;
  50.                req2.CookieContainer = req.CookieContainer;
  51.                req2.Credentials = req.Credentials;
  52.  
  53.                using (Stream reqStream = req2.GetRequestStream())
  54.                    reqStream.Write(byteData2, 0, byteData2.Length);
  55.                MessageBox.Show(linea + mensaje);
  56.            } while (linea != "" || detenerRespuestas == false);

Tambien probé a cambiar el requestUri pero era de solo lectura asi que parece que hay que crear otro httprequest nuevo, supongo necesitara las cookies del otro para poder mandar la respuesta o el mensaje en el tema, pero ya se las puse y no fue mm..

Saludos socio.


Título: Re: Iniciar sesion en web con C#
Publicado por: kub0x en 30 Noviembre 2014, 22:36 pm
Bueno socio tengo una duda, estoy intentando crear un mensaje con esa sesión y claro tendría que hacerlo con el httprequest anterior que ya inicio sesion correctamente, pero la direccion es otra en el http request pues ya no es la url de /login ahora es la te un /temacualquieraquesea, debo crear otra httprequest, como podría hacerlo aprovechando el inicio de sesion de la anterior, he probado lo siguiente pero no escribe nada:

Para postear tienes que estar logeado, por lo que tendrás que coger la cookie de sesión de la respuesta no de la request. Cuando tengas la cookie de la response, abres una nueva request al foro donde vas a postear y le pones la cookie de la respuesta anterior. Supongo que con eso debería de valer ;)

En resumen: ten en cuenta las cookies de la respuesta del login.

Saludos.


Título: Re: Iniciar sesion en web con C#
Publicado por: Kaxperday en 1 Diciembre 2014, 17:31 pm
Gracias socio, vaya parece que me da error al iniciar sesión ahora, el código que antes me funcionaba y ponía login sucessfull, ahora no funciona y al usar GetResponse() me da error en server remoto 407, el mismo código que antes me funcionaba. Así que no puedo probar nada, sin embargo con firefox puedo iniciar sesión en la cuenta sin problemas.

Así que no he podido probar lo de las cookies, de todas formas creo que lo probé a hacer con las de respuesta anteriormente y no dió resultado pero ahora no te lo puedo confirmar.

Saludos.


Título: Re: Iniciar sesion en web con C#
Publicado por: .::IT::. en 2 Diciembre 2014, 07:04 am
debes usar cookies para almacenar las que te devuelve el servidor
CookieContainer myCookie;

luego a tu HttpWebRequest se la asignas:

req.CookieContainer = myCookie;

Y esta Cookie debe ser unica en todo el programa y siempre se la asignas a cualquier HttpWebRequest que vas usar para Hacer peticiones al servidor.




Título: Re: Iniciar sesion en web con C#
Publicado por: Kaxperday en 2 Diciembre 2014, 15:22 pm
No se trata de eso, no puedo iniciar sesión si que puedo descargar foros y temas pero iniciar sesión me devuelve un error que no depende del programa y que mandan el servidor ERROR 407 EXPECTATION FAILED. Antes no me ocurría este error y podía iniciar sesión perfectamente, no es que hayan bloqueado mi ip ni mi cuenta porque con mozilla puedo entrar en la cuenta. ¿Qué puede ser el causante de este error que antes no aparecía y como solucionarlo?. Gracias.


Título: Re: Iniciar sesion en web con C#
Publicado por: kub0x en 2 Diciembre 2014, 16:36 pm
Aupa!

Cuando tenga un rato libre le echo un vistazo, es raro lo que comentas ya que yo te dejé un código funcional que tu mismo aseguraste que funcionaba. Lo adaptaré para que tenga en cuenta las cooks.

P.D = Editaré este mismo post cuando tenga tiempo así que estate al loro!


Título: Re: Iniciar sesion en web con C#
Publicado por: Kaxperday en 2 Diciembre 2014, 17:50 pm
Ok gracias, si, el mismo código que antes me funcionaba ahora no lo hace me sale error 407, antes me ponia login succesful xD, muy raro la verdad jaja cuando quieras socio no hay prisa yo siempre ando turulando por aquí gracias.


Título: Re: Iniciar sesion en web con C#
Publicado por: kub0x en 3 Diciembre 2014, 17:32 pm
Que raro, he abierto otra cuenta basura en el foro ese y me logea perfectamente.

Si añades este code al final del método GetResponse que postee podrás ver la cookie de sesión la cual debes de mantener en todas las request vinculadas a tu login, sino el servidor no podrá reconocerte como usuario.

Código
  1. foreach (Cookie cook in response.Cookies)
  2.                Console.WriteLine("Name:{0} Value:{1}",cook.Name, cook.Value);

Saludos.


Título: Re: Iniciar sesion en web con C#
Publicado por: Kaxperday en 3 Diciembre 2014, 17:46 pm
Vaya lo que pasa es que eso no puedo hacerlo porque el programa deja de responder:

Código
  1. private static void SendRequest()
  2.           {
  3.               string postData = "email=loquesea@hotmail.com&password=blabla";
  4.               byte[] byteData = ASCIIEncoding.ASCII.GetBytes(postData);
  5.               HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create("http://pagina.com/user/login");
  6.               req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  7.               //req.Connection = "keep-alive";
  8.               req.ContentType = "application/x-www-form-urlencoded";
  9.               req.ContentLength = byteData.Length;
  10.               req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0";
  11.               req.Host = "pagina.com";
  12.               req.Method = "POST";
  13.               req.Proxy = null;
  14.               using (Stream reqStream = req.GetRequestStream())
  15.                   reqStream.Write(byteData, 0, byteData.Length);
  16.               GetResponse(req);
  17.           }
  18.  
  19.           private static void GetResponse(HttpWebRequest req)
  20.           {
  21.               HttpWebResponse response = (HttpWebResponse) req.GetResponse();
  22.               using (Stream responseStream = response.GetResponseStream())
  23.               {
  24.                   using (StreamReader sr = new StreamReader(responseStream))
  25.                   {
  26.                       string responseData = sr.ReadToEnd();
  27.                       if (!responseData.Contains("Iniciar se"))
  28.                           Console.WriteLine("Login successful!");
  29.                       else
  30.                           Console.WriteLine("Login failed!");
  31.                   }
  32.               }
  33.               foreach (Cookie cook in response.Cookies)
  34.                   Console.WriteLine("Name:{0} Value:{1}", cook.Name, cook.Value);
  35.           }

Y no puede mostrar nada he probado a poner login falso en el POST y falla igual, no hay manera, y si no hago POST enviando datos no falla y me pone login failed, pero cuando hago un POST con el email y pass falla PD WTF, creo que es algo independiente de la cuenta, WTF.

Da error en la línea 14, no entiendo, lo he probado en otro programa también, incluso con otra IP, buscaré acerca de ese error de nuevo haber si hay alguna solución :/.

Gracias.

Edito: Error HTTP 407 (http://www.checkupdown.com/status/E407_es.html) puede ser que el robots.txt sea capaz de detectarlo de alguna forma, mmm probé a cambiar el agente de navegador fallaba igual, mm pero es raro a ti el mismo código te funciona. ¿con qué criterios lo bloquea entonces?, lo pensaré, saludos.

He seguido leyendo y dice que este error que devuelve el servidor suele ser porque se requiere autentificación de proxy.

Aaamigo mío creo que ya lo voy pillando lo que ocurre es que me debe de redirigir a otra página porque ha detectado que soy un robot y allí debo autentificarme para demostrar que no lo soy, y al no autentificarme me sale ese error, leyendo de aquí (http://support.microsoft.com/kb/315909/es).

La autentificación que pide, es solo conocida para el servidor. Parece que este ordenador le tiene calado, lo que no entiendo es como me ha podido bloquear a mí y a ti no, que tiene tu ordenador diferente del mío para ellos que hace que mi ordenador sea bloqueado xP, interesante.

Contenido de robots.txt

Citar
User-agent: *
Disallow: /al/

Hehe desconozcía como funcionaba lo de robots.txt, he estado leyendo, si he entendido bien no debería de influir ahí lo que hace sería  denegar la entrada a ese directorio a cualquier usuario de navegación, usado principalmente para ocultar esos directorios de los searchs engines, aquí (http://davidwalsh.name/robots-txt) lo leí, saludos.

Vaya vaya vaya, creo que esto (http://stackoverflow.com/questions/13717815/visual-studio-error-407-proxy-authentication-required)puede ser el causante del problema, el problema no es que la página detecto mi bot, es un fallo de visual studio, pues estaba haciendo otro programa para iniciar sesión y sorpresa ocurre lo mismo, entonces pensé que MVS13 era el culpable, intentaré solucionarlo.

OMG he probado mil cosas como esta (https://social.msdn.microsoft.com/Forums/sqlserver/en-US/4a2a8e43-1fae-45cc-b042-62d2a63ca56d/getting-started-windows-error-407-require-proxy-authentication?forum=sqlintegrationservices), desesperante omg, he leido me he instalado postsharp no va a arreglar nada pero puede ser el sustitutivo, al final creo que aqui (http://support.microsoft.com/kb/910804) está la solucion pero ¿a que proxy se refiere?, de todas formas en la aplicacion en el httprequest usimos req.proxy=null; horrible PD

Vale, me he mudado y me funciona la aplicación con el inicio de sesión WTF, quizás era un problema de router o lo que sea. El caso que hace login sucessful tengo esto:

Código
  1. string postData = "email=dfdf@hotmail.com&password=dfd";
  2.            byte[] byteData = ASCIIEncoding.ASCII.GetBytes(postData);
  3.            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://pagina.com/user/login");
  4.            req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  5.            //req.Connection = "keep-alive";
  6.            req.ContentType = "application/x-www-form-urlencoded";
  7.            req.ContentLength = byteData.Length;
  8.            req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0";
  9.            req.Host = "pagina.com";
  10.            req.Method = "POST";
  11.            req.Proxy = null;
  12.            using (Stream reqStream = req.GetRequestStream())
  13.                reqStream.Write(byteData, 0, byteData.Length);
  14.            //Cojemos respuesta.
  15.            HttpWebResponse response = (HttpWebResponse)req.GetResponse();
  16.            using (Stream responseStream = response.GetResponseStream())
  17.            {
  18.                using (StreamReader sr = new StreamReader(responseStream))
  19.                {
  20.                    string responseData = sr.ReadToEnd();
  21.                    if (!responseData.Contains("Iniciar se"))
  22.                        MessageBox.Show("Login successful!");
  23.                    else
  24.                        MessageBox.Show("Login failed!");
  25.                }
  26.            }
  27.            string directorio = Directory.GetCurrentDirectory();
  28.            string linea, mensaje;
  29.            StreamReader reader = new StreamReader(directorio + "\\Temas.txt");
  30.            StreamReader readel = new StreamReader(directorio + "\\MisRespuestas.txt");
  31.            detenerRespuestas = false;
  32.            do
  33.            {
  34.                linea = reader.ReadLine();
  35.                mensaje = readel.ReadLine();
  36.                MessageBox.Show("###1111 " + linea + mensaje);
  37.                if (linea == "" || mensaje == "" || detenerRespuestas == true)
  38.                {
  39.                    break;
  40.                }
  41.                string postData2 = "qaa_content=" + mensaje + "&action=reply";
  42.                byte[] byteData2 = ASCIIEncoding.ASCII.GetBytes(postData2);
  43.                HttpWebRequest req2 = (HttpWebRequest)HttpWebRequest.Create(linea + "?Add=1");
  44.                req2.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  45.                req2.ContentType = "application/x-www-form-urlencoded";
  46.                req2.ContentLength = byteData2.Length;
  47.                req2.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0";
  48.                req2.Host = "pagina.com";
  49.                req2.Method = "POST";
  50.                req2.Proxy = null;
  51.                req2.CookieContainer.Add(response.Cookies);
  52.                using (Stream reqStream = req2.GetRequestStream())
  53.                    reqStream.Write(byteData2, 0, byteData2.Length);
  54.                MessageBox.Show(linea + mensaje);
  55.            } while (linea != "" || detenerRespuestas == false);

Pero no postea nada, ¿estoy añadiendo bien las cookies?, saludos.
Hasta mañana.


Título: Re: Iniciar sesion en web con C#
Publicado por: Kaxperday en 5 Diciembre 2014, 20:01 pm
Hola a todos, ya me funciona todo correctamente el programa inicia sesión y realiza POST sobre los temas o directorios de la página para ganar puntos, lo demás ya es programación sencilla, le doy las gracias a kubox por todo, sin él no lo habría conseguido, el código para mandar POST con las cookies es el siguiente, solo había que crear un cookiecontainer, gracias.

Código
  1. string postData = "email=terearr@hotmail.com&password=topotamadre";
  2.            byte[] byteData = ASCIIEncoding.ASCII.GetBytes(postData);
  3.            CookieContainer cc = new CookieContainer();
  4.            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://pagina/user/login");
  5.            req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  6.            //req.Connection = "keep-alive";
  7.            req.CookieContainer = cc;
  8.            req.ContentType = "application/x-www-form-urlencoded";
  9.            req.ContentLength = byteData.Length;
  10.            req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0";
  11.            req.Host = "pagina.com";
  12.            req.Method = "POST";
  13.            req.Proxy = null;
  14.            using (Stream reqStream = req.GetRequestStream())
  15.                reqStream.Write(byteData, 0, byteData.Length);
  16.            //Cojemos respuesta.
  17.            HttpWebResponse response = (HttpWebResponse)req.GetResponse();
  18.            using (Stream responseStream = response.GetResponseStream())
  19.            {
  20.                using (StreamReader sr = new StreamReader(responseStream))
  21.                {
  22.                    string responseData = sr.ReadToEnd();
  23.                    if (!responseData.Contains("Iniciar se"))
  24.                        MessageBox.Show("Login successful!");
  25.                    else
  26.                        MessageBox.Show("Login failed!");
  27.                }
  28.            }
  29.            string directorio = Directory.GetCurrentDirectory();
  30.            string linea, mensaje;
  31.            StreamReader reader = new StreamReader(directorio + "\\Temas.txt");
  32.            StreamReader readel = new StreamReader(directorio + "\\MisRespuestas.txt");
  33.            detenerRespuestas = false;
  34.            do
  35.            {
  36.                linea = reader.ReadLine();
  37.                mensaje = readel.ReadLine();
  38.                MessageBox.Show("###1111 " + linea + mensaje);
  39.                if (linea == "" || mensaje == "" || detenerRespuestas == true)
  40.                {
  41.                    break;
  42.                }
  43.                string postData2 = "qaa_content=" + mensaje + "&action=reply";
  44.                byte[] byteData2 = ASCIIEncoding.ASCII.GetBytes(postData2);
  45.                HttpWebRequest req2 = (HttpWebRequest)HttpWebRequest.Create(linea + "?Add=1");
  46.                req2.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  47.                req2.ContentType = "application/x-www-form-urlencoded";
  48.                req2.ContentLength = byteData2.Length;
  49.                req2.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0";
  50.                req2.Host = "pagina.com";
  51.                req2.Method = "POST";
  52.                req2.Proxy = null;
  53.                req2.CookieContainer = cc;
  54.                using (Stream reqStream = req2.GetRequestStream())
  55.                    reqStream.Write(byteData2, 0, byteData2.Length);
  56.                MessageBox.Show(linea + mensaje);
  57.            } while (linea != "" || detenerRespuestas == false);
  58.  

Tema zanjado.