Introducción
El otro día me tope con un proyecto bastante interesante. SAMIE (Simple Automation Module for Internet Explorer) es un módulo que le da la capacidad a perl de manipular el Internet Explorer.
Por ejemplo, por medio de éste módulo podemos abrir el Internet Explorer entrar a Google.com y realizar una búsqueda de manera automática y sin tener que mover un dedo.
Aparte éste módulo te da la capacidad de recibir respuestas del Internet Explorer, así puedes saber cuando una página se esta descargando, cuando acabo de descargar, si abrió algún popup, etc, etc.
¿Cómo funciona SAMIE?
SAMIE trabaja junto con el módulo Win32::OLE.
El módulo Win32::OLE brinda varias funciones tipo Visual Basic que te permite comunicarte por medio del Sistema de Automatización OLE de Windows con varias aplicaciones de Windows, como el Excel, PowerPoint, Word, etc.
Dentro de estas aplicaciones por supuesto está el Internet Explorer. Aquí es donde entra SAMIE. SAMIE te facilita el trabajo y brinda funciones ya listas haciendo realmente sencilla la comunicación con el Explorer.
Haciendo nuestro robot navegador
En este tutorial les voy a mostrar a usar el SAMIE para crear nuestro propio robot que navega hecho totalmente en perl.
Lo primero que debemos de hacer es descargar e instalar SAMIE.
http://prdownloads.sourceforge.net/samie/samie2.0.zip?download
Automáticamente el instalador va a crear una carpeta que se llama "Perllib" en tu disco duro C. Copia el módulo Win32::SAM junto con sus rutas a la carpeta lib de tu perl, de lo contrario tu interprete de perl nunca va a encontrar el módulo.
Lo segundo es que debes de tener el módulo Win32::OLE. Ya lo debes de tener pues viene en la distribución de ActivePerl.
Nuestro pequeño Frankenstein
Iniciemos con la parte divertida. Lo primero que debemos de poner como en cualquier otro script es la ruta de nuestro perl:
Recuerda cambiar la ruta de acuerdo a tu perl.
Ahora vamos a cargar los dos módulos que necesitamos:
use Win32::OLE;
use Win32::SAM;
La siguiente línea quizá sea nueva para muchos de ustedes.
Cuando ésta variable especial tiene un valor diferente a cero perl hace un flush de inmediato cada vez que se hace una escritura a cualquier salida seleccionada.
Normalmente perl espera hasta que el buffer este de cierto tamaño antes de hacer el flush, por eso se cambia el valor de esta variable para ver las salidas en tiempo real.
Con ésta línea le estamos diciendo al módulo Win32::OLE como manejar errores. Más información acerca de esto viene en la documentación del mismo módulo.
Listo, ya tenemos todo preparado para iniciar el navegador.
Si corremos nuestro script veremos como el Internet Explorer es lanzado automáticamente, inicia con una página en blanco y ya es todo. Bastante aburrido, pero aún falta más.
Haciendo más inteligente nuestro robot
Ya tenemos nuestro navegador abierto y listo para que le mandemos ordenes. Entonces lo que vamos a hacer es entrar a Google.com.
my $segundos = Navigate("http://google.com/");
print "Google tardo $segundos segundos en cargar.\n";
La primera línea llama a la función "Navigate()" del módulo Win32::SAM. Ésta función recibe una cadena con una ruta y llama otras funciones del módulo Win32::OLE haciendo que el navegador cargue la página que le indicamos.
Esta función regresa un número que es la cantidad de segundos que tardo la página en cargar, que después desplegamos en la segunda línea.
Perfecto, vamos por bueno camino, ya se abre nuestro navegador de manera automática y carga la página inicial de Google.
Ahora, vamos a decirle a nuestro robot que busque "Perl en Español".
Lo primero que debemos de hacer es decirle a nuestro robot que llene la caja de búsqueda con los términos que queremos. Si vemos el código fuente de Google veremos que la caja de búsqueda tiene el nombre de q. Entonces llamamos a la función "SetEditBox()" del módulo SAM:
SetEditBox("q","Perl en Español");
Ésta función lo que hace es recibir dos argumentos. El primero es el nombre del campo o caja de la forma que queremos llenar, y el segundo término es el valor que le queremos poner.
Entonces al ejecutar nuestro script se va abrir el navegador, va a cargar la página de Google y va a introducir las palabras "Perl en Español" en la caja de búsqueda.
Muy bien, ya hicimos que nuestro robot llenara la forma de búsqueda, ahora sólo falta que haga el submit.
$segundos = ClickFormButton("btnG");
print "La página de resultados tardo $segundos segundos en cargar\n";
En la primera línea llamamos a la función "ClickFormButton()", que como su nombre lo dice lo que hace es cliquea un botón.
La función recibe un argumento, el cual es una cadena con el nombre del botón que queremos cliquear. El nombre del botón es aquel que está definido con la etiqueta name.
<input type=submit value="Google Search" name=btnG>
En el caso de Google vemos que el nombre del botón de submit se llama "btnG".
Ésta función regresa el número de segundos que tardo en cargar la respuesta del submit de la forma, que con la segunda línea imprimimos su resultado.
¡Está vivo! ¡Está vivo!
Si ejecutamos nuestro pequeño script vemos como con tan sólo 11 líneas de código hicimos un robot que abre el Internet Explorer, carga la página de Google y realiza una búsqueda.
Realmente son impresionantes las cosas que podemos hacer con este sencillo módulo. Existen una serie de diversas funciones que nos permiten cliquear en links, activar checkbox de la forma, botones de radio, etc, etc.
Para ver una lista completa de las funciones que tiene SAMIE lo puedes hacer en la siguiente liga:
http://samie.sourceforge.net/samiedoc/samiefunctions.html
Últimas Palabras
Este módulo aunque parezca de juego, puede ser muy útil para automatizar varias tareas. Por ejemplo, si es necesario enviar alguna forma diariamente a las 10 de la mañana, podemos hacer un script con perl que nos automatice esta tarea y nos quite de encima la preocupación de tener que hacerlo manualmente.
También lo podríamos usar para checar que un sitio no se salga de línea, verificando que la página cargue cada cierto tiempo.
Es decir, la imaginación es el límite. Podemos programar a nuestro robot para que haga tareas con el navegador que nosotros normalmente tendríamos que hacer manualmente, es literalmente como tener nuestro pequeño Frankenstein.
Código Final
#!c:/perl/bin
#Iniciamos nuestros módulos
use Win32::OLE;
use Win32::SAM;
#Obligamos a hacer flush
$| = 1;
#Indicamos como manejar errores
$Win32::OLE::Warn = 3;
#Iniciamos nuestro navegador
StartIE();
#Cargamos la página de Google
my $segundos = Navigate("http://google.com/");
print "Google tardo $segundos segundos en cargar.\n";
#Llenamos el campo de búsqueda
SetEditBox("q","Perl en Español");
#Hacemos submit de la forma
$segundos = ClickFormButton("btnG");
print "La página de resultados tardo $segundos segundos en cargar\n";
#Salimos del programa
exit(1);