48235203 libro autoit

Upload: david-herrada

Post on 18-Jul-2015

184 views

Category:

Documents


1 download

TRANSCRIPT

Un libro sobre Autoit script

Mster of AutoitDesarrollo de automatismosCarlos Hernndez Gmez 27/09/2009

Aprende a programar con ejemplos prcticos.

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez Introduccin a Autoit Script AutoIt es un sistema de programacin gratuito. Adems de automatizar tareas usando combinaciones de teclas simuladas, clic de ratn, comandos de Windows y ficheros Script cuenta con ActiveX, dlls y plugins, como cualquier lenguaje dinmico al estilo PHP. Wikipedia Caractersticas cmo lenguaje de Script Autoit nos ofrece, de manera muy rpida, un control absoluto de un ordenador, mediante cortas lneas de cdigo podemos automatizar una tarea que nos llevara horas/das hacerla. Los automatismos son el punto fuerte de Autoit, pero no solo de automatismos vive este lenguaje, con Autoit podremos crear una aplicacin que nos grabe un CD a las 00:00 cada da o una aplicacin que nos ingrese dinero en nuestra cuenta de las islas caimn, adems pod remos crear un sistema de gestin tipo CRM con interface o un videojuego. De manera muy rpida podramos nombrar estas caractersticas:y y y y y y y y y y y y

2

La sintaxis es sencilla. De fcil comprensin. Tiene generador de macros y editor grfico de formularios (IDE). Ejecutables de 250-450kb. Soporte vista UAC y expresiones regulares. Rpido y con control de otros programas. Sin APIs externas, ya que las incluye todas. Pocas lneas de cdigo. Una comunidad de usuarios renovando Autoit continuamente. Soporte total para ejecutables de Windows (Internet Explorer, Windows Media Player, Itunes) No hay que definir los tipos de datos de las variables Soporte para llamadas Win32 Dll

Qu es Autoit Script? En resumidas cuentas, Autoit Script es un lenguaje de script creado en C++ por Jonathan Bennett 1999-2009. Este lenguaje de script nos ayudar a crear aplicaciones que con otros lenguajes nos llevara mucho tiempo y tendramos que escribir ms lneas de cdigo.

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez Getting started!! Lo primero y bsico, es descargar Autoit: http://www.autoitscript.com/autoit3/downloads.shtml Autoit lo podremos instalar en las siguientes plataformas de Windows: Windows 2000, XP, 2003, Windows Vista Autoit no depende de libreras externas, una vez terminada la instalacin de Autoit podrmos empezar a crear nuestras aplicaciones. El editor de texto predeterminado en Autoit es Scite, ser el que usemos en este libro, puesto que nos ofrece una manera rpida de compilacin y resaltado detexto en color (Highlight). 3

Ejemplo de cdigo resaltado en Scite (App: WowMachinimaTool)

Nuestro primer programa (Hola Mundo!!) Para empezar a crear nuestro primer programa, vamos al escritorio y pulsamos botn derecho > Nuevo > Autoit V3 Script. Sobre el fichero creado nuevamente botn derecho y Edit Script (si hiciramos doble clic en l se ejecutara la aplicacin) despus de esto se abrir el editor Scite.

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez 4

Ejemplo de ventana de Scite con el contenido creado por Autoit en el fichero Nuevo Autoit V3 Script.au3

Autoit nos genera automticamente el contenido que vemos en la imagen de arriba cuando creamos un script desde el escritorio. Una manera rpida de personalizar este contenido sera escribindolo as:

En la imagen de arriba podemos observar cmo escribir 2 tipos diferentes de comentarios, ya sean de varias lneas o de una nica lnea.

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez 5

Vamos a dejarnos de rollos y empecemos a programar un poco. En Autoit podemos hacer un hola mundo de varias maneras. Escribe en una lnea de Scite este cdigo: MsgBox (0,"Hoooray!","Hola mundo " & @CRLF & "Adis mundo!")

Y pulsa la tecla F5, el resultado tendra que ser algo as:

Para guardar el script que hemos creado pulsa Alt + S. El nombre de este fichero es 1.0.au3 (en la carpeta de ejemplos). Si todo ha ido bien y nuestro PC no ha explotado, ya tendremos creado nuestro primer Script. Analizando el cdigo & Sintaxis Con el ejemplo anterior, hemos visto como mostrar un mensaje al usuario final. Pero tenemos que entender cmo lo hemos realizado. La primera parte del cdigo llama a la funcin MsgBox(): MsgBox (Argumento, "Titulo", "Texto" [, timeout [, hwnd]] ) ; Entre [] parmetros opcionales.

Esta funcin que est descrita mas detalladamente en el documento de funciones de Autoit nos permite devolver un mensaje al usuario, y que opcionalmente este mensaje desaparezca en unos segundos, tiene 3 argumento estticos y 2 opciones. Si especificramos el argumento TimeOut tendramos que hacerlo en milisegundos. Declaracin de variables Cmo ya hemos comentado antes, los tipos de variables no tienen que declararse, una variable puede contener un nmero de coma flotante o una cadena de texto, sin necesidad de declarar que contendr esta variable como ocurre con algunos lenguajes (C++ por ejemplo).

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez Un ejemplo de declaracin de variables podra ser este: ConsoleWrite(@CRLF) $MiVariable = 0 ConsoleWrite($MiVariable & @CRLF) $MiVariable = "H0o0o0la!" ConsoleWrite($MiVariable & @CRLF) $MiVariable = StringUpper("texto en mayusculas") ConsoleWrite($MiVariable & @CRLF) 6

Cmo podrs observar, las variables pueden contener nmeros o cadenas, adems podemos llamar a funciones dentro de estas variables. Si ejecutramos el script anterior obtendramos algo as:

Resultado del fichero 2.0.au3, con ejemplo de consolewrite(). Hemos usado la funcin Consolewrite para mostrar en la consola de Scite la informacin. Esta funcin nos ser muy til cuando estemos desarrollando una aplicacin y queramos probar cosas en testo o modo debug. Nuestro primer Automatismo Lleg la hora de la accin, vamos a realizar una aplicacin que haga las siguientes acciones: 1. Ejecutar el bloc de notas 2. Enviar un texto al bloc de notas 3. La aplicacin mover la ventana del bloc de notas aleatoriamente por la pantalla durante 5 iteraciones de un bucle.

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez Cdigo (Fichero: 3.0.au3): ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Partes opcionales ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #NoTrayIcon Opt("WinTitleMatchMode",2) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Definicion de variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; $Texto = "Este libro msmola" $TituloBloc = "Bloc de notas" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Inicio de script ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Run("notepad.exe") WinWaitActive($TituloBloc) Send($Texto) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Iteraciones del bucle ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; For $i = 0 to 5 Step + 1 Sleep(1000) $x = Random(0,500) $y = Random(0,500) WinMove($TituloBloc,"",$x,$y) next 7

Quizs antes de que trabajes con este ejemplo sera interesante que lo ejecutaras para ver cul es el resultado. Explicacin del cdigo: Cuando ponemos esta lnea en una aplicacin lo que conseguimos es que nuestra aplicacin no tenga icono en la bandeja de Windows (La zona del reloj) #NoTrayIcon

La funcin Opt() Tambin llamada AutoItSetOption cambia la manera de actuar de algunas funciones internas de Autoit, en este caso lo que conseguimos es que la funcin WinWaitActive() nos busque cualquiera ventana llamada bloc de notas , y asi poder trabajar con esa ventana puesto que de no establecer el argumento 2 en la llamada aOpt() tendramos que buscar el nombre exacto de la ventana, que en este caso sera Sin Ttulo Bloc de notas Opt("WinTitleMatchMode",2)

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez 8

En esta parte hemos definido las variables que usaremos en el programa. Por un lado la variable $Texto contiene el texto que enviaremos al Bloc de notas, y la variable $TituloBloc contiene el titulo de la ventana del bloc de notas, en este caso no es el ttulo entero, y es solo una parte. $Texto = "Este libro msmola" $TituloBloc = "Bloc de notas"

La base del automatismo del programa es esta, la funcin Run() ejecutar una aplicacin externa, para aplicaciones de Windows que ya estn referenciadas no hace falta indicar una ruta por que al escribir notepad.exe es lo mismo que C:\Windows\Notepad.exe , aunque si quisiramos si que podramos usar rutas absolutas. Run("notepad.exe") WinWaitActive($TituloBloc) Send($Texto) La sintaxis de una iteracin de un bucle es exactamente igual a la de otros lenguajes de programacin, como podra ser PHP. Declaramos la variable $i con valor 0 y las iteraciones del bucle sern un total de 5, y adems la variable $i se incrementar en 1 por cada iteracin (Vase el Step +1). Sleep() es una funcin que nos permitir pausar la ejecucin de un programa tantos milisegundos como queramos o creamos oportuno, en este caso 1 segundo. Las variables $X e $Y contienen la funcin Random() , esta funcin generar un nmero aleatorio en un rango especificado, cmo nuestra intencin es que el script mueva la ventana del bloc de notas por la pantalla estableciendo un mximo de 500 sabemos que no nos pasaremos de 500 pixeles, ya que si el numero generado fuera por ejemplo mayor a 2000 no veramos la ventana puesto que se colocara en una posicin fuera de rango de visin. Finalmente utilizamos la funcin WinMove() para mover la ventana con el titulo $TituloBloc a las coordenadas $x e $y For $i = 0 to 5 Step + 1 Sleep(1000) $x = Random(0,500) $y = Random(0,500) WinMove($TituloBloc,"",$x,$y) next

Para terminar la estructura del bloque For usaremos la palabra clave Next. Con esto hemos terminado nuestro primer automatismo (Biennn!!!!), ahora sigamos aprendiendo cosas sobre este fantstico lenguaje.

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez Control de ficheros En Autoit y al igual que en otros lenguajes, tenemos la posibilidad de crear/editar/borrar ficheros. El apartado de gestin de ficheros es muy grande, as que vamos a realizar un pequeo script que gestione un fichero. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;includes de script ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #include ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Declaracion de variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; $Archivos_de_programa = _FileListToArray(@ProgramFilesDir) $Fichero_de_salida = FileOpen(@ScriptDir & "\resultados\Test.csv",2) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Inicio de script ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; if not $Fichero_de_salida Then MsgBox("","","Error! ._ .") FileWriteLine($Fichero_de_salida,"Programas instalados") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;iteraciones ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; For $x = 1 to $Archivos_de_programa[0] Step + 1 FileWriteLine($Fichero_de_salida,$Archivos_de_programa[$x]) Next FileClose($Fichero_de_salida) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;abrimos el fichero generado ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ShellExecute(@ScriptDir & "\resultados\Test.csv") 9

Vamos a explicar el cdigo por lneas, empezamos por los includes. #include File.au3 es una librera estndar de Autoit, contiene funciones relativas al control de ficheros, en este caso la nica funcin que usaremos de esta librera ser _FileListToArray(). $Archivos_de_programa = _FileListToArray(@ProgramFilesDir) $Fichero_de_salida = FileOpen(@ScriptDir & "\resultados\Test.csv",2) Declaramos la variable $Archivos_de_programa que contiene la funcin FileListToArray(), esta funcin nos guardar en un Array los ficheros/directorios de una ruta indicada.

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez $Fichero_de_salida = FileOpen(@ScriptDir & "\resultados\Test.csv",2) 10

Creamos la variable $Fichero_de_salida que contiene un recurso que hace referencia a un fichero, la llamada a la funcin FileOpen nos permite crear este recurso, lo abrimos en con el parmetro 2 que representa escritura. El macro @ScriptDir devuelve el directorio del Script. if not $Fichero_de_salida Then MsgBox("","","Error! ._ .") FileWriteLine($Fichero_de_salida,"Programas instalados")

Es la primera vez que vemos un condicional, (IF condicion Then). Con Autoit si ponemos If Not indicaremos que si no se declara la condicin se cumpla una sentencia. Sencillamente hemos hecho que si no se pudiera crear el fichero se mostrara un mensaje en una ventana emergente con el texto Error! ._ . FileWriteLine() escribir una lnea en un fichero (o recurso) con el texto indicado. For $x = 1 to $Archivos_de_programa[0] Step + 1 FileWriteLine($Fichero_de_salida,$Archivos_de_programa[$x]) Next FileClose($Fichero_de_salida)

Para las iteraciones del bucle creamos la variable $x y se repetir tantas veces cmo $Archivos_de_programa[0] indique. Si leemos la documentacin de la funcin _FileListToArray() veremos que la primera clave de el array contiene el total de elementos del array, por eso usaremos en el bucle For la variable $Archivos_de_programa[0], porque [0] contiene el total de elementos. Finalmente usamos la palabra clave Next para indicar dnde termina el bucle For. Terminamos de trabajar con el fichero cerrando el recurso con FileClose(). Finalmente usamos ShellExecute() para abrir el fichero que hemos creado, un ejemplo del resultado podra ser este:

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez Palabras clave en Autoit (Macros) El trmino Palabra clave me lo he inventado, realmente estas palabras son un conjunto de pequeas variables estticas que te ayudan a la hora de programar, la mejor forma de entenderlo es ver un ejemplo en el que utilizaremos la consola de Scite as que recuerda abrir el script en modo edicin y no haciendo 2 clic sobre l (Dependiendo de cmo lo tengas configurado ). ConsoleWrite(@CRLF) ConsoleWrite("Bienvenido "&@UserName&@CRLF) ConsoleWrite(@MDAY&" - "&@MON&" - "&@YEAR&" | "&@HOUR&":"&@MIN&@CRLF) ConsoleWrite("Ruta a archivos de programa: "& @ProgramFilesDir&@CRLF) ConsoleWrite("Nombre de este fichero: "&@ScriptName&@CRLF) ConsoleWrite("IP de red: "&@IPAddress1&@CRLF) 11

Estas palabras clave nos ayudaran mucho a la hora de desarrollar nuestras aplicaciones, tienes una lista completa de estos macros aqu: http://www.autoitscript.com/autoit3/docs/macros.htm I wanna steal your dataz Puesto que Autoit es un lenguaje de Automatismos, tenemos que tener una idea o un pequeo proyecto en mente que nos permita automatizar una tarea para as poder darnos cuenta de hasta dnde llega el potencial de Autoit. Vamos a poner un ejemplo prctico de automatismo, he pensado en realizar peticiones HTTP a un sistema web y capturar parte de su contenido, sera como robar conseguir el contenido de su base de datos sin acceder a ella. Se me ocurren varios ejemplos de sistemas basados en web a los que poder atacar, y de estos mismos conseguir una buena base de datos de registros. Un ejemplo, una pgina web de descargas como Softonic.com o Malavida.com, estas webs almacenan registros en sus bases de datos de programas, descripciones, imgenes y cualquier registro necesario para un sistema as. Podramos en pocas lneas de cdigo crear una aplicacin que capturara los siguientes datos: 1. 2. 3. 4. Nombre del programa ltima versin Pgina web del producto oficial URL de descarga del programa

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez 12

Esto en s no representa un robo de datos, puesto que son datos pblicos que fcilmente podramos conseguir en Google o en buscadores de aplicaciones. Nos meteramos en un problema si capturramos la descripcin del programa, puesto que esta misma ha sido redactada por una persona que ha generado ese contenido y ese contenido pertenece a la web en s y no es accesible para ser guardada nosotros. El ejemplo prctico no lo vamos a ver con una web de descargas, vamos a verlo con una web de liricas, pginas que guardan ttulos de lbum y descripciones de los artistas. Las tenemos en todos los idiomas y todas guardan el mismo contenido, pienso que hace 10 aos a alguien le dio por escribir en un ordenador todas las liricas de los artistas de $ony y de ah copiaron todas las webs existentes el contenido, lgicamente no hay un mono pasando cada cancin y ttulo de un lbum a un sistema MySQl, o quizs s. Una ltima cosa a matizar antes de pasar al ejemplo prctico, puede ser que cuando pruebes este cdigo la web haya cambiado de estructura as que voy a explicarlo todo bien claro para que no haya dudas. Vctima: http://www.azlyrics.com/ Descripcin: Sitio web completo de lbums/liricas.

%) ( # & % ! # s s se e e eces sc e s ve se e 13

! "$ # ' ! " $ # "! s e es e e e c es es c e es sc e s es s s ev e s ec c e s e s e s c s

% # 1 0 " $ # s EF ec e s c e se e s e e e s s

of Autoite e e s

Des

Mst

s

e e sy se

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez Vamos al tema, lo primero es crear una conexin con la web, y obtener su HTML. $URL_Base = "http://www.azlyrics.com" $oHTTP = ObjCreate("winhttp.winhttprequest.5.1") que nos permitir realizar una peticion HTTP $oHTTP.Open("GET",$URL_Base) podramos utilizar un POST $oHTTP.Send() $HTMLSource = $oHTTP.Responsetext ConsoleWrite($HTMLSource) ;URL para obtener la informacion ; Creamos una instancia de un objeto ; Peticion tipo GET, tambien ; Realizamos la peticion ; Obtenemos el HTML 14

Bastante fcil este cdigo, con el objeto Winhttp.Winhttprequest.5.1 ( http://msdn.microsoft.com/en-us/library/aa384106.aspx ) lanzamos una peticin a la URL y obtenemos su HTML guardndolo en $HTMLSource, despus usamos ConsoleWrite para mostrar la informacin, el resultado tendra que ser algo as:

Bien ya tenemos el HTML, ahora tenemos que parsearlo, para entender la estructura podemos ver el cdigo fuente de la web, para m lo ms fcil es utilizar Firefox con Firebug y as podremos entender fcilmente como estn estructuradas las secciones que es lo primero que queremos obtener. Con Firebug posicionndonos donde se encuentran las categoras sealadas en la imagen de arriba podemos ver esto:

Mster of AutoitDesarrollo de automatismos Carlos Hernndez Gmez 15

  • A

B

C

Si queremos extraer los titulos/direcciones de las secciones podemos coger todo el html que hay entre y as obtendremos un texto que tendremos que volver a parsear para quedarnos solamente con las direcciones y los ttulos de las secciones, tal que as: #include #include $URL_Base = "http://www.azlyrics.com" $oHTTP = ObjCreate("winhttp.winhttprequest.5.1") que nos permitir realizar una peticion HTTP $oHTTP.Open("GET",$URL_Base) podramos utilizar un POST $oHTTP.Send() $HTMLSource = $oHTTP.Responsetext ;URL para obtener la informacion ; Creamos una instancia de un objeto ; Peticion tipo GET, tambien ; Realizamos la peticion ; Obtenemos el HTML

$HTML_A_Parsear = _StringBetween($HTMLSource,'',"") $Direcciones = _StringBetween($HTML_A_Parsear[0],'') _ArrayDisplay($Direcciones) $Secciones = _StringBetween($HTML_A_Parsear[0],'">','

','