Mostrando entradas con la etiqueta firebug. Mostrar todas las entradas
Mostrando entradas con la etiqueta firebug. Mostrar todas las entradas

domingo, 1 de febrero de 2015

[Parte 7] Web Scraping

Scraping contenido Ajax

Javascript y el nacimiento de Ajax

Hace algunos años la mayoria del contenido de una pagina web, si se generaba dinamicamente o estaticamente en el servidor y luego era mostrado al cliente. Sin embargo, con la introduccion de ajax el contenido ahora podria ser llamado dinamicamente despues de que una pagina web ya habia sido cargada. Esto proporciono un nuevo reto para el web scraping. 
Con auge de javascript muchos sitios webs ahora utilizan ajax para recuperar el contenido fresco de una pagina web. Sin embargo, esto puede ser problematico para nuestros esfuerzos de web scraping, ya que el contenido recuperado por javascript no se puede analizar facilmente por PHP cuando se inserta de forma dinamica en el DOM por el navegador. Solo usando cURL para obtener los contenidos de la pagina devolvera los datos sin contenido ajax. Entonces, ¿Que hacemos para obtener el contenido dinamico generado por javascript?
Una solucion es utilizar una herramienta de navegador como Selenium. Sin embargo, Selenium es una herramienta de prueba y no puede ser facilmente integrado con PHP para recuperar el contenido dinamico. La otra solucion es utilizar 'phantom.js',  un programa de escritorio que les permite descargar paginas web y manipular el DOM usando javascript, lo que le permite recuperar el contenido ajax. phantomjs en realidad es un navegador sin la ventana normal, algo que se llama como un navegador sin cabeza. phantomjs utiliza javascript como lenguaje de scripting para procesar paginas descargadas. Vamos a mirar un poco phantomjs en este apartado, sin embargo nuestro objetivo principal es usar PHP para realizar web scraping. 
Cada solicitud de pagina ajax implica una llamada a una direccion URL del servidor que devuelve de nuevo algunos datos al navegador. Estos datos son utilizados por el navegador para actualizar el contenido relevante en la pagina. La parte importante para saber realizar web scraping en el contenido es encontrar la peticion URL. Entonces, ¿Como podemos llegar a la solicitud correcta de la URL de ajax?

Firebug al rescate

Aqui es donde el complemento firebug sera muy util. En el panel de 'red' de la ventana de firebug puedes ver todas las peticiones GET/POST realizadas por la pagina web. Una muestra la pantalla de diversas solicitudes de Javascript se muestra a continuacion.



Como puede ver hay muchas peticiones GET asi como POST. Es su tarea localizar el URL correcto que se utiliza para recuperar el contenido ajax que le interesa. Por ejemplo, una peticion GET puede tomar la forma de la siguiente URL, donde el parametro de pagina variara con cada solicitud. La url de abajo podra ser para recuperar una lista de libros para la categoria "ciencia". Puede haber un total de 600 libros, por 20 libros que se muestren por peticion, lo que eleva el numero de paginas a 30 paginas.

http://algun-sitio.com/respuesta/obtener-lista-libros.php?pagina=6&cat=10

Por supuesto, esta URL puede ser un poco mas compleja de lo que se muestra aqui. Para para ejemplos bien vamos con el de arriba. Una vez que conocemos la URL correcta, entonces podemos usarla en nuestra solicitud cURL para llegar al contenido real. En el ejemplo que figura a continuacion tenemos que conseguir todo el contenido de ajax para las paginas 0-20. Con cada iteracion del bucle 'for' modificamos el parametro pagina y enviamos una nueva solicitud. No hemos añadido ninguna gestion de errores, pero usted debe comprobar si la solicitud devolvio cualquier dato valido o esta vacio.

<?php
$ch = curl_init();
for($i=0; $<=20; $i++)
{
$url = "http://algun-sitio.com/respuesta/obtener-lista-libros.php?pagina={$i}&limit=10";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 6);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$page_data = curl_exec($ch);
/* Hacemos algo con los datos */
}
?>


Para el contenido ajax con muchas paginas, como en el ejemplo anterior, por lo general prefieren almacenar en el cache el contenido recuperado en un archivo local, que hace mas facil la parte de raspar como comprobar repetidamente el codigo diferente en las paginas webs almacenadas en el cache. En pocas palabras, es la forma de recuperar el contenido de las paginas con peticiones ajax.
Algunas solicitudes de javascript aunque pueden usar POST en lugar de GET. Sin embargo, esto no cambia nada. Usted puede obtener los detalles adicionales de la solicitud POST del Firebug como antes. En el codigo que se muestra a continuacion podemos ver que javascript ha publicado a la url 'login.php' con dos parametros username y password. A veces esta solicitud podria ser mas compleja, con docenas de parametros. Sin embargo, la logica sigue siendo la misma. La respuesta enviada por el servidor por la solicitud esta disponible en la pestaña de "Respuesta". La respuesta puede ser enviada en HTML, texto plano, JSON o formato XML. La tarea de decodificar la respuesta en algunos formatos adecuados cae en el web scraper. El siguiente ejemplo muestra como utilizar cURL para enviar esta URL junto a sus dos parametros.

<?php
$url = "http://ejemplo/login.php?login=1";
$username = "arthusu";
$password = "tu-password";
$post_data = "username={$username}&password={$password};
$s = curl_init();
curl_setopt($s, CURLOPT_URL, $url);
curl_setopt($s, CURLOPT_TIMEOUT, 30);
curl_setopt($s, CURLOPT_POST, true);
curl_setopt($s, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($s, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($s, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($s, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($s, CURLOPT_RETURNTRANSFER, TRUE);
$downloaded_page = curl_exec($s);
?>


Por supuesto Firebug no es la unica herramienta para observar el trafico de red. Google Chrome y Safari tienen excelentes herramientas de desarrollo integradas en el navegador para que usted se sienta comodo. La decodificacion de llamadas ajax y extraer las direcciones URL correctas es una habilidad que va adquirir con el tiempo. Es un arte, y requiere un poco de paciencia y ensayo y error para hacer las cosas bien, pero vale la pena el esfuerzo.

PhantomJS

Como se ha descrito anteriormente en este capitulo, PhantomJS es un Webkit scriptable sin cabeza con API de javascript. Tiene soporte rapido y de origen por varios estandares web: manipulacion DOM, selectores CSS, JSON, Canvas y SVG. Puede utilizar PhantomJS para capturar mediante programacion contenidos web, incluyendo SVG y Canvas, crear capturas de pantallas del sitio web, acceder y manipular paginas web con la API DOM estandar, o utilizarlo con las liberias junto a jQuery. Debido a que PhantomJS puede cargar y manipular una pagina web, es perfecto para llevar a cabo diversas automatizaciones de la pagina incluyendo web scraping, nuestro objetivo primordial. Puede descargar PhantomJS desde el siguiente enlace: http://phantomjs.org/download.html. PhantomJS se corre desde la linea de comandos, asi que asegurese que la aplicacion se encuentre disponible con el PATH. Para probar si la aplicacion esta funcionando correctamente copie las siguientes lineas en un archivo de texto en blanco y guardelo como 'Prueba.js'.

console.log('Hola, Mundo!');
phantom.exit(); 


Ahora puede ejecutar estos comandos haciendo pasar el archivo PhantomJs.

c:\>phantomjs prueba.js

Esto imprimira la cadena Hola, Mundo! en la ventana de la consola. A continuacion se muestra un ejemplo sencillo para descargar una pagina web e imprimir el contenido en la consola.

var page = require('webpage').create();
page.open('http://phantomjs.org', function(status) {
if ( status === "success" ) {
console.log(page.content);
}
phantom.exit();
});


PhantomJS es relativamente un buen tema con un gran numero de funciones y metodos que no podemos cubrir en este apartado. Este sitio web tiene una documentacion decente que se puede utilizar para codear. Tenga en cuenta que PhantomJS supone que tiene muy buen conocimiento de javascript.
 
 

[Parte 5] Web Scraping

Web scraping en paginas autenticadas

Sitios autenticados

Aunque la mayoria de los sitios webs no estan asegurados y puedan ser accedidos a traves de cURL, muchas de las mas importantes aseguran con diferentes maneras la autenticacion. Una de las maneras mas comunes para asegurar una pagina es utilizando autenticacion basica HTTP. Para acceder al contenido tenemos que autenticarnos por lo cual necesitamos utilizar la extension cURL de PHP. Pero antes de ello diremos unas pocas palabras acerca de la autenticacion basica HTTP.

Autenticacion basica HTTP

Autenticacion basica HTTP es una de las maneras mas faciles y mas rapidas para asegurar paginas web, ya que no requiere cookies, manejo de sesiones, o la creacion de paginas de inicio de sesion. En su lugar, la autenticacion basica HTTP utiliza encabezados HTTP estaticos, lo que significa que no hay handshakes (apretones de manos) necesarios entre clientes y servidores. Cada vez que se entre a la pagina el navegador solicitara una autenticacion basica HTTP. Los encabezados de la misma se muestran a continuacion.

HTTP/1.1 401 Access Denied
WWW-Authenticate: Basic realm="Mi Servidor"
Content-Length: 0


Esta solicitud debera ser enviada mediante HTTP 401 Not Authorized el codigo de respuesta contiene un encabezado WWW-Authenticate HTTP. La mayoria de los navegadores mostrara un cuadro de dialogo de inicio de sesion cuando recibe esta respuesta, lo que permite al usuario introducir un nombre de usuario y contraseña. Un ejemplo se muestra a continuacion. Cuando el user agent como navegador quiere enviar las credenciales de autenticacion al servidor, puede utilizar el encabezado de autorizacion. La cabecera de autorizacion se construye como sigue:

* Nombre de usuario y la contrase se combinan en una cadena "usuario:contraseña".
* La cadena resultante literal se codifica usando base64.
* El metodo authorization y un espacio es decir "Basic" se pone a continuacion, antes de la cadena codificada.

Por ejemplo, si el navegador utiliza "Patrick" como nombre de usuario y "thementalist" como contraseña y quiere acceder a algunos archivos de forma segura en el servidor ejemplo.com/archivosseguros/, las cabeceras enviadas por el navegador seran como el siguiente.

GET /archivosseguros/ HTTP/1.1
Host: www.ejemplo.com
Authorization: Basic UGF0cmljazp0aGVtZW50YWxpc3Q=


En PHP podemos codificar nombre de usuario y contraseña de cadena a base 64 utilizando el siguiente.

echo base64_encode('Patrick:thementalist');

Autentificacion basica HTTP con cURL

Ahora que estamos familiarizados con la autentificacion basica vamos a ver como podemos enviar la informacion de autentificacion utilizando cURL. El siguiente ejemplo nos permite acceder a un sitio con autenticacion basica HTTP utilizando cURL. Esto utiliza la opcion CURL_USERPWD para pasar el nombre de usuario y la contraseña para el servidor remoto para la autenticacion. Tenga en cuenta que cURL maneja todos los problemas de codificacion en base64 por nosotros. Solo tenemos que especificar las opciones adecuadas para cURL y se encarga del resto por nosotros. Las principales opciones en este ejemplo son CURLOPT_HTTPAUTH, CURLAUTH_BASIC.

<?php
$user = "admin";
$pass = "adminautenticacion";
$s = curl_init();
curl_setopt($s, CURLOPT_URL, 'http://ejemplo.com/index.php');
curl_setopt($s, CURLOPT_RETURNTRANSFER, true);
curl_setopt($s, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($s, CURLOPT_USERPWD, "$user:$pass");
curl_setopt($s, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$salida= curl_exec($s);
curl_close($s);
echo $salida;
?>


Incluso el tipo favorito de autenticacion, la autenticacion basica sin embargo esta perdiendo terreno a otras tecnicas debido a su debil naturaleza. Por ejemplo, con la autenticacion basica, no hay manera de cerrar sesion sin cerrar su navegador. Tampoco hay manera de cambiar el aspecto de la forma de autenticacion debido a que el navegador lo crea y el usuario no tiene control sobre eso. Es importante destacar que la autenticacion basica no es muy segura, ya que el navegador envia las credenciales de acceso al servidor en texto sin cifrar.

Almacenamiento y envio de cookies

La mayoria de los servidores despues de la autenticacion devuelven algo de informacion de la cookie que se requiere para trabajar correctamente con el resto del sitio una vez estamos con exito mas alla de la autenticacion. Necesitamos almacenar estos datos de las cookies en algun lugar para que podamos utilizarlo mas tarde con otras paginas. cURL hace que este trabajo sea mas facil para nosotros con la opcion CURLOPT_COOKIEJAR. Esta opcion tiene un nombre de archivo en el que la informacion de las cookies del sitio se almacenan; la hemos llamado "cookie.txt" en nuestro ejemplo a continuacion. A continuacion, podemos utilizar los datos de las cookies tarde como se requiere para trabajar con otras paginas.

<?php
$username = "admin";
$password = "adminautenticacion";
$s = curl_init();
curl_setopt($s, CURLOPT_URL, 'http://ejemplo.com/');
curl_setopt($s, CURLOPT_HEADER, 1);
curl_setopt($s, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($s, CURLOPT_USERPWD, "$username:$password");
curl_setopt($s, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($s, CURLOPT_TIMEOUT, 30);
curl_setopt($s, CURLOPT_RETURNTRANSFER, TRUE);
$page_data = curl_exec($s);
echo $page_data;
?>


Mas tarde, cuando queramos acceder a una pagina que require las cookies creadas anteriormente durante la autenticacion, podemos utilizar la opcion de curl CURLOPT_COOKIEFILE para cargar los datos de las cookies, que luego se envian al servidor cuando se solicita una pagina. A continuacion se da un ejemplo de codigo.

$s = curl_init();
curl_setopt($s, CURLOPT_URL, 'http://ejemplo.com/pagina2.php');
curl_setopt($s, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($s, CURLOPT_TIMEOUT, 30);
curl_setopt($s, CURLOPT_RETURNTRANSFER, TRUE);
$page_data = curl_exec($s);


Ademas de la autenticacion HTTP basica, tambien existe la autenticacion estandar usuario/contraseña en un formulario, utilizado en la mayoria de los sitios. Los datos de autenticacion son normalmente enviados por metodo HTTP POST. En el siguiente ejemplo veremos como usar cURL para trabajar con este tipo de autenticaciones.

Autenticacion de sesion

A diferencia de la autenticacion basica, en las credenciales de acceso se envian cada vez que se solicita una pagina, la autenticacion de sesion valida a los usuarios una vez y crea un valor de sesion que representa la autenticacion. El formulario de inicio de sesion estandar usuario/contraseña utilizan autenticacion de sesion. Una vez que el usuario se autentica correctamente una sesion se crea con la ayuda de las cookies y los valores de sesion se pasan a cada peticion de la pagina posterior para indicar que el usuario es autenticado. Hay dos metodos basicos para el empleo de sesion de autenticacion con cookies y con cadenas de consulta. En el siguiente ejemplo vamos a ver como podemos usar cURL para iniciar sesion en un sitio de administracion de WordPress utilizando autenticacion de sesion.

Ingresando a un sitio de administracion WordPress con cURL

Actualmente WordPress es uno de los CMS mas instalados en el mundo, y hay millones de sitios que ejecutan esta plataforma versatil. El siguiente ejemplo muestra como se puede acceder a una seccion de administracion de WordPress remota utilizando cURL y agarrar cualquier contenido de interes. Por ejemplo si desea comprobar automaticamente los intervalos regulares del numero de comentarios publicados en su blog, puede utilizar el siguiente codigo para lograrlo. El siguiente ejemplo utiliza cURL para enviar los datos de acceso a su pagina de administracion de WordPress. Esto se logra mediante la opcion CURLOPT_POSTFIELDS junto con algunas otras opciones requeridas. Despues del inicio de sesion correcto WordPress devuelve un conjunto de cookies que se quedaran almacenadas en un archivo local utilizando CURLOPT_COOKIEJAR. Estos datos de cookies seran utilizados despues por nuestro codigo que solicito otras paginas de administracion.

<?php
$blog_url = "http://www.wordpress-blog.com/";
$blog_name = "wordpress-blog.com";
$username = "admin";
$password = "your-admin-password";
$post_data = "log={$username}&pwd={$password}&wp-submit=Acceder&redirect_to=http%3A%2F%2F{$blog_name}%2Fwp-admin%2F&testcookie=1";
$s = curl_init();
curl_setopt($s, CURLOPT_URL, $blog_url . 'wp-login.php');
curl_setopt($s, CURLOPT_TIMEOUT, 30);
curl_setopt($s, CURLOPT_POST, true);
curl_setopt($s, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($s, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($s, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($s, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($s, CURLOPT_RETURNTRANSFER, TRUE);
$downloaded_page = curl_exec($s);
?>


Una vez correctamente en la cuenta para admin, entonces podemos conseguir cualquier pagina de administracion requerida y raspar el contenido. Esto, sin embargo, sera necesario que establezcan las opciones correctas con cURL. El siguiente es otro ejemplo que se permitira el acceso a la administracion de WordPress y permitira obtener el contenido de la pagina para el enlace 'Todas las entradas'.

Un cambio importante a señalar aqui es la opcion CURLOPT_COOKIEFILE. Esto le permite continuar con la sesion cURL iniciada despues de inicio de sesion. cURL utiliza datos de la cookie de este archivo al mismo tiempo que solicita la nueva pagina.

/* Ahora que nosotros tenemos iniciada la sesion correctamente, podemos pedir la nueva pagina */
curl_setopt($s, CURLOPT_URL, $blog_url . 'wp-admin/edit.php');
curl_setopt($s, CURLOPT_COOKIEFILE, "cookie.txt");
$html = curl_exec($s);
/* $html ahora contiene los datos de la pagina ‘edit.php’ */
echo $html;


Una vez que tenemos el contenido de la pagina, podemos utilizar simplehtmldom para encontrar el elemento DOM relevante y devolver el numero total de comentarios. El recuento de los comentarios pendientes se almacena en el siguiente elemento span en el DOM. Tenga en cuenta que esto podria variar dependiendo de la version de WordPress, asi que asegurese de que esta comprobando el elemento de DOM correcto.

<span class="pending-count">6</span>

Ahora usamos el metodo "find" para obtener el recuento de comentario. Esto se logra mediante la siguiente linea. Devolvemos el primer nodo que se ajuste a los parametros de busqueda. Esto se especifica mediante el segundo parametro para 'find', '0' en nuestro ejemplo.

$data = @$html->find('span[class=pending-count]', 0);

Tambien podemos especificar el parametro de busqueda como a continuacion.

$data = $html->find('span.pending-count', 0);

Una vez encontrado el elemento relevante devolvemos los datos adecuados del objeto.

echo @$data->plaintext;

En el ejemplo anterior usted puede preguntarse como hemos llegado hasta los datos para la variable $post_data. La mejor manera es abrir el panel Firebug y enviar el formulario de WordPress. Ahora va conseguir todo el contenido solicitado en el panel de Firebug en la pestaña de red. Las urls mostradas en el panel seran tipicas de la administracion de WordPress despues del envio de formulario de inicio de sesion que se mostrara a continuacion. Se puede ver facilmente que los datos del formulario de inicio de sesion se han enviado en el archivo 'wp-login.php' utilizando el metodo POST. Tambien puede ver los detalles de POST y otras cabeceras haciendo clic en el enlace 'wp-login.php'. Una muestra parcial de lo capturado usando Firebug se mostrara a continuacion. El contenido de POST se muestra despues del campo 'Content-Length'. Solo tienes que copiar eso y reemplazar el nombre de usuario/contraseña correcta.

POST /wp-login.php HTTP/1.1
Host: www.ejemplo.com
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://www.ejemplo.com/wp-login.php
Cookie: __utma=101293715.944295703.1353556559; Content-Type: application/x-www\
-form-urlencoded
Content-Length: 102
log=admin&pwd=test&wp-submit=Acceder&redirect_to=http%3A%2F%ejemplo.com%2Fwp-ad\
min%2F&testcookie=1
HTTP/1.1 200 OK
Date: Fri, 08 Mar 2013 04:32:18 GMT
Server: Apache
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Pragma: no-cache
x-frame-options: SAMEORIGIN
Set-Cookie: wordpress_test_cookie=WP+Cookie+check; path=/
Last-Modified: Fri, 08 Mar 2013 04:32:19 GMT
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8


Con estos dos tipos de autenticacion debe ser capaz de obtener acceso a la mayoria de los sitios web. La otra arquitectura de autenticacion que necesitamos explorar es utilizar ajax para validar. Esto lo veremos mas adelante.


lunes, 22 de abril de 2013

[JavaScript] Detectando Errores

Bueno anteriormente publique una entrada la cual era un juego de piedra, papel o tijera... en la cual probabamos el codigo javascript en la consola de firebug, aunque puede ser de utilidad para comprobar errores tambien en este caso explicaremos dos de mis favoritas :P

Empezaremos con algo que viene ya en W3schools y nos guiaremos de ella :D

Try...Throw...Catch

Estos son la utilizacion de try (intentar ejecutar codigo)... throw (lanzar mensaje personalizado)... catch (atrapar errores)....

Bueno siempre que programas un script en javascript pueden suceder errores, y con try,throw y catch podemos saber por que suceden tales errores....


Bueno aunque no es necesario usar throw muchas veces puede resultar util para personalizar nuestro mensaje de error, por lo cual veremos un ejemplo de try...catch y uno de try...throw...catch 

Ejemplo de try...catch:

http://pastebin.com/GASKznc1

Lo que hace esto es intentar ejecutar el codigo que se encuentra entre try { code} pero si el codigo es erroneo se pasa a catch el cual lanza un mensaje de alerta con el error, en este caso e que es el parametro de catch, nos ayuda para que se muestre el mensaje que recogio e.message

Imagen de ejemplo

Como puedes ver nos lanza el mensaje de error en este caso nos dice que adddlert no esta definida y como es claro esa funcion no existe :P

Ahora podriamos personalizar ese mensaje de adddlert pero mejor veremos otro ejemplo, estos dos ejemplos que les muestro los pueden ver en w3schools, les deje el enlace arriba :P

Ejemplo try...throw...catch:


En este ejemplo lo que hacemos es darle un rango de valores al input... entre 5 y 10 si es menor lo mostramos si es mayor tambien si esta vacio tambien si es una letra tambien xDDD :P

 
Imagen ejemplo 2


Por consola y firebug

En realidad yo trabajo con firefox y no tengo idea si otros navegadores incluyen una consola de este tipo de todas formas creo que muchos deben de tenerlo solo es cuestion de buscarle XDD

En este caso yo utilizo Web Developer Tool y de ahi la saco la consola.... Desde Tools>Error Console....
o Tambien la tachita que muestra te dice el error que puede estar causando...
Y tambien esta firebug que es demasiado bueno para hacer debug jeje 

Aqui tenemos el ultimo ejemplo parecido al primero siendo que tenemos el mismo error, pero en este caso no utilizamos try...catch...

Ejemplo 3:



Imagen ejemplo 1

Como puedes ver en la imagen de ejemplo en este caso utilizamos la consola de errores para detectar el error


Imagen ejemplo 2

Y en este otro ejemplo utilizamos firebug para detectar el error...

Espero que estos consejos o tutorial les haya sido de utilidad a mas de uno :P


domingo, 21 de abril de 2013

[Javascript]Juego piedra, papel y tijeras



Bueno he estado practicando un poco he hice esto para poder utilizarlo es necesario tener la consola de Firebug en chrome tambien esta, pegar el codigo y empezar a probarlo, solo es para probar no es nada de un superprograma o version chingona solo para entender y practicar la sentencias if else y un poco las variables....

Les voi a dejar el codigo en pastebin, por que SyntaxHighligther me ha causado muchos problemas XDDD :P

Codigo: http://pastebin.com/YYaWHqPX