segunda-feira, 21 de janeiro de 2008

Automatize Tarefas Com O Poderoso AutoIt

AutoIt é basicamente uma linguagem de script com sintaxe parecida com basic feita para automatizar tarefas do windows. O grande diferencial do AutoIt é o controle que ele tem para interagir com as janelas do windows, ele pode simular clicks em botões, interação com formulários, etc. Ele também pode fazer chamadas para DLL externas e para a API do windows.

Ele é um canivete suíço para um heavy user que deseja/precisa automatizar tarefas.

Algumas características:

  • Fácil aprendizado.
  • Simula interações com teclados e mouse.
  • Manipula janelas e processos.
  • Interage com todos os controles padrão do windows.
  • Os scripts podem ser compilados em executáveis.
  • Pode criar interfaces gráficas.
  • Suporte a expressões regulares.

Eu tomei conhecimento dele, ao pesquisar sobre como modificar meu CD de instalação do windows, para que ele instalasse programas durante a instalação, e vi em foruns que usavam o AutoIt para criar um programa que executasse a instalação de um aplicativo de maneira automática.

Vou tentar a partir de um tutorial simples mostrar o uso desta linguagem.

Antes de iniciar o tutorial, vocês precisam fazer download do AutoIt e do seu editor:
http://www.autoitscript.com/autoit3/downloads.shtml

Escolhi fazer um script que instalasse de maneira automática o Foxit PDF Reader, um leitor de PDF leve e gratuito. Vocês podem fazer download do instalador nesta pagina: http://www.foxitsoftware.com/pdf/rd_intro.php

A primeira linha de nosso script será executar o instalador:

Run("FoxitReader22_setup.exe")

Um programa com somente esta linha, vai executar o instalador e acabar a execução, porém queremos mais que isso. Precisamos que o script pausa sua execução, até que a janela do instalador tenha surgido, para que o script possa interagir com ela.

O comando WinWaitActive(String tituloJanela, String textoJanela) faz isso, ele vai pausar o script até que fique ativa uma janela com o titulo informado e que possua em algum lugar dela o texto. É simples olhar para a janela de nosso instalador e saber qual o nome do titulo dela e ver outro texto que pode ser usado. Mas para facilitar nossa vida e saber todas as informações uteis desta janela, usaremos o indispensavel Window Info que pode ser executado a partir de Iniciar / Programas / AutoIt v3 / AutoIt Window Info.

Como podemos ver na imagem abaixo, ele pode obter informações de todos os objetos da janela (Texto, Botoões, Checkbox, etc):



Com este utilitário, podemos obter e selecionar para copiar / colar as informações que queremos: O título da pagina e o texto de um elemento e podemos escrever a linha de código abaixo:

WinWaitActive("Foxit Reader Install Wizard", "&Next>")


Com essas duas linhas scritas o programa vai executar o instalador e ficará pausado até essa janela ficar ativa.

Depois disso vamos enviar um comando para que avance para a proxima janela:

Send("!n")

Este comando vai enviar um Alt + n que fará com que o instaaldor passe para a proxima janela, que veremos possui a mesma aparência básica desta desta (mesmo titulo e também possui um botão next) então podemos repetir os comandos:

WinWaitActive("Foxit Reader Install Wizard", "&Next>")
Send("!n")


Que fará com que apareça a proxima janela que, a pessoa aceita a licença de uso, que não possui botao Next, mas possui o botão de “aceito” que é o que desejamos que seja executado, então escreveremos essas duas linhas:

WinWaitActive("Foxit Reader Install Wizard", "I &agree")
Send("!a")


Agora chegamos em uma janela, em que o botão não aceita um HotKey como o Alt + n, então usaremos outro método, que é muito mais preciso, pois usa um identificador para o botão.

Antes de usar este método vamos identyificar que a janela esta ativa com o comando:

WinWaitActive("Foxit Reader Install Wizard", "< &Back")


Feito isso vamos abrir o programa de informações e obter as informações do botão 'Default':



Com as informações obtidas podemos usar o método:
ControlClick("Foxit Reader Install Wizard", "< &Back", 1014)

Que é semelhante ao WinWaitActive( mas que possui um argumento a mais, que é o ID do Controle que a gente quer que seja executado.

Seguindo o que foi mostrado aqui, podemos terminar o script com o resto do código abaixo:

WinWaitActive("Foxit Reader Install Wizard", "&Install")
ControlClick("Foxit Reader Install Wizard", "&Install", 1)
WinWaitActive("Foxit Reader Install Wizard", "&Run Foxit Reader")
;Desmarcar o checkbox
ControlClick("Foxit Reader Install Wizard", "&Run Foxit Reader", 1008)
ControlClick("Foxit Reader Install Wizard", "&Run Foxit Reader", 1)


Usar um ControlClick é preferivel ao Send, porque no ControlClick, temos o controle do ID do que queremos interagir.

Espero que está mini tutorial seja util para vocês e eu escrevi voltado para uma pessoa que conhece algo de programação.

[]'s

Rodrigo Menezes

Código fonte do exemplo

quarta-feira, 16 de janeiro de 2008

Programa Para Rastrear Encomendas dos Correios


Programa Para Rastrear Encomendas dos Correios


Nas duas ultimas semanas fiz algumas compras de livros de alguns sebos de outros estados. Os livros claro foram enviados pelos correios e os vendedores me passavam os códigos de rastreamento, alguns já passavam um link já formado para a página dos correios.

Estes links já facilitavam minha vida, mas pensei que poderia fazer algo melhor. Como já tinha feitos testes de requisição de paginas trazendo o código html e também já tinha brincado com Regex (
Expressões Regulares), pensei em como fazer um programa bem simples que guardasse uma coleção de Códigos e fizesse uma requisição na pagina dos correios para trazer os dados.

Descobri que Swing aceita código html em alguns componentes (Labels, Buttons, etc) desde que o texto venha entre as tags e aproveitei isso para fazer o que eu queria com menos esforço :D, eu trago da pagina dos correios a mesma tabela que ele monta e coloco ela em um JLabel.

No Campo de entrada depois de pensar em como tratar códigos fora do formato acabei usando Regex para validar e decidi que a pessoa poderia colocar mais de um código por vez:

private static final Pattern patternCodigo = Pattern.compile("\\w{2}\\d{9}\\w{2}");

O tratamento ainda não está o ideal, ele somente procura no texto uma string que tenha 2 letras, 9 números e mais duas letras. As duas primeiras letras se referem ao tipo da postagem e as duas ultimas ao país. Não fiz tratamento se o código é valido nem se o país também, alias no momento o programa somente checa códigos na pesquisa nacional.

Link para programa em forma de exe: 
Rastreador 0.1.2
Link para o programa:
Rastreador 0.1.2
Link para o código fonte: Source Rastreador 0.1.2


Criticas e sugestões são bem vindas.

[]'s

Rodrigo Menezes

Edit: Fiz um update, para ele pegar a mensagem dos correios para um código que não exista.


Edit 2: Adicionei um campo de observação. Então o usuário pode adicionar uma observação para cada código de rastreamento.

Observação: O arquivo que o programa salva as informações, não é compatível com esta versão, então descompacte o programa em outra pasta.

Edit3: Adicionando novos links