Recentemente eu estava procurando uma solução para automatizar uma tarefa que faço diariamente que é basicamente logar em alguns sites e preencher os formulários com relatórios, as informações são as mesmas e os forms também são praticamente iguais.
O problema então seria criar um script que automatizasse essa tarefa que é praticamente um control-c control-v…
Qual a solução?
http://snoopy.sourceforge.net/
Snoopy é uma classe PHP que simula um navegador web. Ele automatiza o
tarefa de recuperar o conteúdo da página web e enviar formulários, por exemplo.
Algumas das características do Snoopy:
* busca conteúdo de uma página web;
* busca textos de uma página web (retirando as tags HTML)
* buscar links a partir de uma página web
* suporta proxy
* suporte a autenticação usuário / senha
* suporta a configuração de user_agent, referer, cookies e conteúdo do cabeçalho
* suporta redirecionamentos
* envia dados de formulário e recuperar os resultados
* aceita cookies
Para começar a brincar com o Snoopy basta copia-lo para o diretório de seu projeto,dar um include em sua classe e criar o novo objeto.
<?php include "Snoopy.class.php"; $snoopy = new Snoopy; ?> |
<?php include "Snoopy.class.php"; $snoopy = new Snoopy; ?>
Exemplo básico de uso:
<?php /* Baixe snoopy.class.php em http://snoopy.sourceforge.net/ */ include("snoopy.class.php"); $snoopy = new Snoopy; // definido um proxy?: //$snoopy->proxy_host = "my.proxy.host"; //$snoopy->proxy_port = "8080"; // definindo um user agent e referer: $snoopy->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"; $snoopy->referer = "http://www.jonasjohn.de/"; // definindo algumas cookies: $snoopy->cookies["SessionID"] = '238472834723489'; $snoopy->cookies["favoriteColor"] = "blue"; // definido raw-header: $snoopy->rawheaders["Pragma"] = "no-cache"; // definido algumas variáveis internas: $snoopy->maxredirs = 2; $snoopy->offsiteok = false; $snoopy->expandlinks = false; // definindo nome de usuário e senha(opcional) //$snoopy->user = "joe"; //$snoopy->pass = "bloe"; // buscar texto no site www.google.com:: if($snoopy->fetchtext("http://www.google.com")){ // outros métodos: buscar, buscar em forms, busca de links, enviar textos e enviar links // código de resposta: print "código de resposta: ".$snoopy->response_code."n"; // imprimir os cabeçalhos(headers): print "Headers:"; while(list($key,$val) = each($snoopy->headers)){ print $key.": ".$val."n"; } print "n"; // imprimir os textos do site: print "<pre>".htmlspecialchars($snoopy->results)."</pre>n"; } else { print "Snoopy: Erro ao buscar documento: ".$snoopy->error."n"; } ?> |
<?php /* Baixe snoopy.class.php em http://snoopy.sourceforge.net/ */ include("snoopy.class.php"); $snoopy = new Snoopy; // definido um proxy?: //$snoopy->proxy_host = "my.proxy.host"; //$snoopy->proxy_port = "8080"; // definindo um user agent e referer: $snoopy->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"; $snoopy->referer = "http://www.jonasjohn.de/"; // definindo algumas cookies: $snoopy->cookies["SessionID"] = '238472834723489'; $snoopy->cookies["favoriteColor"] = "blue"; // definido raw-header: $snoopy->rawheaders["Pragma"] = "no-cache"; // definido algumas variáveis internas: $snoopy->maxredirs = 2; $snoopy->offsiteok = false; $snoopy->expandlinks = false; // definindo nome de usuário e senha(opcional) //$snoopy->user = "joe"; //$snoopy->pass = "bloe"; // buscar texto no site www.google.com:: if($snoopy->fetchtext("http://www.google.com")){ // outros métodos: buscar, buscar em forms, busca de links, enviar textos e enviar links // código de resposta: print "código de resposta: ".$snoopy->response_code."n"; // imprimir os cabeçalhos(headers): print "Headers:"; while(list($key,$val) = each($snoopy->headers)){ print $key.": ".$val."n"; } print "n"; // imprimir os textos do site: print "<pre>".htmlspecialchars($snoopy->results)."</pre>n"; } else { print "Snoopy: Erro ao buscar documento: ".$snoopy->error."n"; } ?>
Olá, gostei muito da dica do Snoopy, ainda não conhecia. Porém, estou com uma duvida.
Quando envio um submit, ele faz a autenticação tudo certinho, porem, no que eu autentico ele é redirecionado. Por exemplo:
O site que quero fazer o submit é esse:
xxx/login
Quando faço o login vai para
xxx/joao/maria
Dai aonde eu estou executando o meu arquivo vai o joao/maria tambem, dai da erro, porque não tenho isso no meu site.
Como eu faço para enviar um submit, e receber a resposta via fetch?
Olá Marcelo, não entendi sua dúvida, vc passou poucos detalhes, agora se vc conseguiu passar pela tela de login com sucesso então basta aperfeiçoar seu script para tratar o redirecionamento, o fetch pode ser feito buscando os dados em tags HTML especificas dentro de sua página, estude o código, se ele estiver bem estruturado (id,class,etc) funcionara semelhante a um XML.