Problema al intentar publicar contenido con HttpWebRequest

Iniciado por lombervid, 2 Agosto 2013, 16:59 PM

0 Miembros y 1 Visitante están viendo este tema.

lombervid

Hola.

Bueno pues eso, estoy intentando usar HttpWebRequest para publicar por ejemplo en un foro (dejo ejemplo para este foro), cuando es solo para loguearse si funciona, pero ya para publicar no:

Código (csharp) [Seleccionar]

CookieContainer Cookies = new CookieContainer();
private void button1_Click(object sender, EventArgs e)
       {
           string url = "http://foro.elhacker.net/";
           string vars = "user=usuario&passwrd=password";
           string data_post = "subject=" + title.Text + "&message=" + message.Text;
           if (login(url, vars, url))
           {
               publicar(url, data_post, 62);
           }
           else
           {
               MessageBox.Show("Ocurrio un Error");
           }
       }

       public bool login(string url, string vars, string refer = "")
       {
           Encoding charset = Encoding.GetEncoding("iso-8859-1");
           byte[] buffer = charset.GetBytes(vars);
           HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(url + "index.php?action=login2");
           Request.Referer = refer;
           Request.UserAgent = "Mozilla/5.0 (Windows; Windows NT 6.1) AppleWebKit/534.23 (KHTML, like Gecko) Chrome/11.0.686.3 Safari/534.23";
           Request.Method = "POST";
           Request.KeepAlive = true;
           Request.CookieContainer = new CookieContainer();
           Request.ContentType = "application/x-www-form-urlencoded";
           Request.ContentLength = buffer.Length;
           Request.AllowAutoRedirect = true;

           Stream PostData = Request.GetRequestStream();
           PostData.Write(buffer, 0, buffer.Length);
           PostData.Close();


           HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();

           foreach (Cookie cook in Response.Cookies)
           {
               Cookies.Add(cook);
           }
           Stream Answer = Response.GetResponseStream();
           StreamReader _Answer = new StreamReader(Answer);
           string respuesta = _Answer.ReadToEnd();
           loginurl.Text = Response.ResponseUri.ToString();
           Response.Close();
           Answer.Close();
           _Answer.Close();
           if (!respuesta.Contains("id=\"button_login\"") && !respuesta.Contains("<input type=\"text\" name=\"user\"")) return true;
           return false;
       }

       public void publicar(string url, string data_post, int id)
       {

           Encoding charset = Encoding.GetEncoding("iso-8859-1");
           byte[] buffer = charset.GetBytes(data_post);
           HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(url + "index.php?action=post2;start=0;board=" + id);
           Request.Referer = url;
           Request.UserAgent = "Mozilla/5.0 (Windows; Windows NT 6.1) AppleWebKit/534.23 (KHTML, like Gecko) Chrome/11.0.686.3 Safari/534.23";
           Request.Method = "POST";
           Request.KeepAlive = true;
           Request.CookieContainer = Cookies;
           Request.ContentType = "application/x-www-form-urlencoded";
           Request.ContentLength = buffer.Length;
           Request.AllowAutoRedirect = true;

           Stream PostData = Request.GetRequestStream();
           PostData.Write(buffer, 0, buffer.Length);
           PostData.Close();


           HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();

           Stream Answer = Response.GetResponseStream();
           StreamReader _Answer = new StreamReader(Answer, Encoding.GetEncoding("iso-8859-1"));
           post.Text = _Answer.ReadToEnd();
           posturl.Text = Response.ResponseUri.ToString();
           Response.Close();
           Answer.Close();
           _Answer.Close();
       }


Y también intente usando:

Código (csharp) [Seleccionar]
Request.Credentials = new NetworkCredential("usuario", "password");

Pero de ninguna forma me funciono   :-(

El problema es que me dice que no estoy logueado, ¿como le tendria que hacer para que se loguee y publique?

Saludos!   ;)

kub0x

#1
Guardando la cookie del login y empleándola al publicar.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


lombervid

#2
Eso es lo que intento hacer con:
Código (csharp) [Seleccionar]

          foreach (Cookie cook in Response.Cookies)
          {
              Cookies.Add(cook);
          }


pero aun asi me dice que no estoy logueado.

Puse un MessageBox antes del foreach y segun no hay Cookies, me lanza 0 en la ventana con Response.Cookies.Count.

Saludos!

lombervid

#3
Ya vi porque no podia capturar las Cookies, era por el:
Código (csharp) [Seleccionar]
Request.AllowAutoRedirect = true;

Cambiandolo a:
Código (csharp) [Seleccionar]
Request.AllowAutoRedirect = false;

Ya las captura, pero me dice que la sesión a expirado  :(

#!drvy

#4
Tienes que capturar (y enviar) el sesc. Es una variable que a veces aparece en la URL y otras antes de publicar el post (como un campo hidden).

PD: La forma mas facil es obtener el href del enlace de "Salir" en el menu.. ahí aparece. Eso si, para las versiones 2.x del SMF es otra historia..

Saludos

lombervid

Pues si no me equivoco esa es una de las Cookies que supuestamenta ya mando, que ¿seria la PHPSESSID?.

antes de poder capturar la Cookies me salia que debia de loguearme para poder publicar, y ahora que ya las puedo capturar lo que me dice es que ya ha expirado la sesión.

Saludos!

#!drvy

CitarPues si no me equivoco esa es una de las Cookies que supuestamenta ya mando, que ¿seria la PHPSESSID?.

No. Es un string aleatorio generado para cada usuario (y sesión creo). Puedes verlo en la url si le das al boton citar por ejemplo (solo para 1.1.xx). Otras veces aparece en el código html como un <input type="hidden" />

http://foro.elhacker.net/post.html;quote=1876742;topic=396377.0;num_replies=1;sesc=41XXXXXXX850f82d0395e5c696b7bd5

Citary ahora que ya las puedo capturar lo que me dice es que ya ha expirado la sesión.

Es precisamente porque no mandas el sesc.

Saludos

lombervid

Cita de: drvy en  7 Agosto 2013, 06:07 AM
No. Es un string aleatorio generado para cada usuario (y sesión creo). Puedes verlo en la url si le das al boton citar por ejemplo (solo para 1.1.xx). Otras veces aparece en el código html como un <input type="hidden" />

http://foro.elhacker.net/post.html;quote=1876742;topic=396377.0;num_replies=1;sesc=41XXXXXXX850f82d0395e5c696b7bd5

Es precisamente porque no mandas el sesc.

Saludos

si, ya lo he visto, solo que no se por qué en algunos si sale como sesc y en otros sales tipo a5sd64d.

Supongo que ha de ser similar al secyrity token que se tiene que usar en los VB.

Solo una cosa más, ¿ese se enviaria como otra variable en post, verdad?

Saludos y Gracias  ;-)

#!drvy

Bueno, nunca llegue a jugar con 2.x.xx a fondo asi que realmente te hablo solo con conocimientos de la versión 1.x.xx.

Citarsi, ya lo he visto, solo que no se por qué en algunos si sale como sesc y en otros sales tipo a5sd64d.
El sesc es propio de la versión 1.x.xx mientras que el otro es propio de la versión 2.x.xx

CitarSolo una cosa más, ¿ese se enviaria como otra variable en post, verdad?

En el source de 1.x.xx lo intenta recoger como $_REQUEST.. eso en php significa que lo busca en POST o GET y tambien en COOKIE. En el 2.x.xx no se como va pero supongo que lo mas seguro es enviarlo por POST.

Saludos

lombervid

Cita de: drvy en  7 Agosto 2013, 06:14 AM
Bueno, nunca llegue a jugar con 2.x.xx a fondo asi que realmente te hablo solo con conocimientos de la versión 1.x.xx.
El sesc es propio de la versión 1.x.xx mientras que el otro es propio de la versión 2.x.xx

En el source de 1.x.xx lo intenta recoger como $_REQUEST.. eso en php significa que lo busca en POST o GET y tambien en COOKIE. En el 2.x.xx no se como va pero supongo que lo mas seguro es enviarlo por POST.

Saludos

Hola.

Primerop que nada, gracias por tus respuestas y disculpa que tardara en contestar pero andaba algo ocupado con otras cosas y no habia tenido tiempo de probarlo.

Bueno pues ya capture la SsessionVar y SsessionID (que son los de 2.x) y los mande por post, pero me sigue diciendo que la sesion ha caducado.

Lo que pude ver que hay otra variable que se manda al crear Hilos "seqnum", que tambien la mando pero al comparar la que mando pero igual me dice que la sesion ha caducado.

Saludos.