Posts Tagged ‘Programación en .NET’

Guerra de Pandillas en Facebook

Sábado, julio 24th, 2010

Si algo tiene de bueno Facebook son los juegos y, la verdad es que el juego de Guerra de Pandillas es bastante adictivo ya que no es como otros en los que haces 4 cosas y tienes que esperar hasta el día siguiente para volver a jugar. En este no, ya que son varios los factores que te permiten seguir jugando, bien atacar enemigos, bien realizar misiones, bien comprar territorios.

Lo malo es que al final ves que pasan las horas y te tiras el fin de semana mirando la pantalla. Es por eso que decidí hacer un pequeño programa que juegue por mí :-)

(más…)

Conexión con Facebook desde CSharp

Domingo, julio 18th, 2010
Después de hacer TPlus esto ha sido coser y cantar. Aunque la validación es algo diferente, con este trozo de código se puede obtener la cookie (cookiefb) que nos permite interactuar con Facebook.

Una vez tenemos la cookie sólo hay que usarla en cada llamada (GET o POST) y podremos naegar sin problemas.

private void ConectarConFacebook()
{
String miUser = "mail@dominio.com";
String miPass = "casimiro";

// Obtenemos la cookie inicial al entrar en la página de validación de usuario
 String cookie = CargarHome();

 // Extraemos la clave 'lsd' de la cookie
 String lsd = ExtraerCookie(cookie, "lsd");

 // Con la cookie anterior validamos y obtenemos la nueva cookie
 cookie = Conectar(miUser, miPass, cookie);

 if (cookie == null)
    // ERROR AL CONECTAR
 else
 {
 // Extraemos los datos necesario para crear la cookie que necesitamos para navegar
 String c_user = ExtraerCookie(cookie, "c_user");

 if (c_user == null)
    // ERROR AL CONECTAR

 String datr = ExtraerCookie(cookie, "datr");
 String lxe = ExtraerCookie(cookie, "lxe");
 String lxs = ExtraerCookie(cookie, "lxs");
 String xs = ExtraerCookie(cookie, "xs");
 String lo = ExtraerCookie(cookie, "lo");
 String sct = ExtraerCookie(cookie, "sct");

 usergp = c_user;

 // Creamos la nueva cookie
 cookiefb = "lsd=" + lsd + ";";
 cookiefb += "c_user=" + c_user + ";";
 cookiefb += "datr=" + datr + ";";
 cookiefb += "lxe=" + lxe + ";";
 cookiefb += "lxs=" + lxs + ";";
 cookiefb += "xs=" + xs + ";";
 cookiefb += "lo=" + lo + ";";
 cookiefb += "sct=" + sct + ";";
}

Función CargarHome:

private string Home()
 {
 HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.facebook.com/");
 req.Method = "GET";
 req.UserAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1";
 req.ContentType = "application/x-www-form-urlencoded";

 try
 {
 HttpWebResponse response = (HttpWebResponse)req.GetResponse();
 return response.GetResponseHeader("Set-Cookie");
 }
 catch
 {
 return null;
 }
 }

Función Conectar:

private string Conectar(String user, String pass, String cookie)
 {
 System.Net.ServicePointManager.Expect100Continue = false;
 Uri address = new Uri("https://login.facebook.com/login.php?login_attempt=1");
 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(address);
 req.AllowAutoRedirect = false;

 req.ProtocolVersion = HttpVersion.Version11;
 req.Method = "POST";
 req.UserAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1";
 req.ContentType = "application/x-www-form-urlencoded";
 req.Headers.Add("Cookie", cookie);

 byte[] byteData = UTF8Encoding.UTF8.GetBytes("locale=es_ES&email=" + user + "&pass=" + pass);
 req.ContentLength = byteData.Length;

 try
 {
 Stream postStream = req.GetRequestStream();
 postStream.Write(byteData, 0, byteData.Length);
 postStream.Close();
 }
 catch { }   

 try
 {
 HttpWebResponse response = (HttpWebResponse)req.GetResponse();
 cookie = response.GetResponseHeader("Set-Cookie");

 return cookie;
 }
 catch { }

 return null;
 }

Función ExtraerCookie:

private string ExtraerCookie(String cookie, String clave)
 {
 clave += "=";
 string[] datos1 = cookie.Split(';');

 foreach (string dato1 in datos1)
 {
 string[] datos2 = dato1.Split(',');

 foreach (string dato2 in datos2)
 {
 if (dato2.StartsWith(clave))
 return dato2.Replace(clave, "");
 }
 }

 return null;
 }

HttpWebRequest y los problemas con las redirecciones y las cookies

Viernes, enero 1st, 2010

¿Quién dijo que programar en .NET era coser y cantar? Hay muchas librerías que nos facilitan la vida pero a veces no funcionan del todo bien haciendo cosas raras o simplemente se les olvido incluir el control de ciertas situaciones.

Programando Squipy me he topado con un gran problema y es que cuando llego a una web que me hace una redirección (por ejemplo un 302) para que el HttpWebRequest la siga y obtenga luego la página a donde se redirige, he de poner AllowAutoRedirect = true

Pero si configuramos AllowAutoRedirect = true entonces no podremos capturar las cookies y, por tanto, no entrar a ciertas webs en las que necesitamos validación.

Si ponemos AllowAutoRedirect = false podremos capturar la cookie sin problemas usando GetResponseHeader(“Set-Cookie“) pero no se hará la redirección y no llegaremos a la página a la que se redirige.

Así que la solución final pasa por poner la redirección a false, capturar la cookie con Set-Cookie y luego comprobar el StatusCode para ver si la página devuelve una redirección, en cuyo caso, incluiremos nuestra cookie con Headers.Add(“Cookie“, nuestraCookie) y capturaremos la página a donde nos redirige con GetResponseHeader(“Location“). Tras esto crearemos manualmente otro HttpWebRequest para llamar a la nueva página.

Os dejo un código de ejemplo:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlDestino);
request.AllowAutoRedirect = false;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

while (response.StatusCode == HttpStatusCode.Found)  {

String nuevaUrl = “http://” + response.ResponseUri.Host + response.GetResponseHeader(“Location“);
request = (HttpWebRequest) WebRequest.Create(nuevaUrl);
request.AllowAutoRedirect = false;
response = (HttpWebResponse) request.GetResponse();

}

A falta de comprobar con Set-Cookie si tenemos alguna cookie y guardarla en un contenedor de Cookies para luego usarla en el nuevo envío.

Feliz Año nuevo a todos!