Simple Spyder 0.1 multi crawler

Iniciado por C00L3R, 12 de Junho , 2009, 10:30:51 PM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

C00L3R

vou mostrar um programa que terminei em Perl
estes dias para fazer tarefas do dia a dia porem esta na sua versão "0.1″ para quem está
aprendendo a fazer seus Tools com modulo "LWP" e afins é uma boa,Claro que pra quem ama Shell Script
tente usar "Sed+Lynx" para fazer o mesmo que vai sair mesma lógica...

Bem modulo "LWP" você pode ver as docs aqui
http://search.cpan.org/~gaas/libwww-perl-5.826/lib/LWP.pm

Esquema de "progress bar"
http://oreilly.com/pub/h/943

a intenção deste "post" é apenas mostrar para você um exemplo de aplicação

Bem quais as funções do nosso programa ?
0- Sair do programa
1- Mandar MSG do dia no seu twitter
2- Ver Twitter de alguem
3- Ver news do BotecoUnix
4- Ver novidades de Exploits no Milw0rm
5- Procurar no wikipedia por alguma palavra
6- Ver Whois de algum dominio
7- Baixar videos do Youtube
8- Ver Temperatura do tempo em cidades Brasileiras

com estas funções podemos dizer que este programa faz tarefas de um robot(bot,craw,spider...) como na web é conhecido ou seja ele pega informações de forma conclusiva ou seja tudo aquilo que você faz com seu navegador ele faz para automatizar tarefas,Bem como ele esta na sua versão "0.1″ tem muito o que melhorar para próxima versão vou adicionar funções de ProgressBar(a progress bar que esta adicionada é muito simples aquela do tipo pipe que gira de sistemas unix) TorrentSearch e Gmail view(usando pop3).

vamos a source já esta comentada...

#!/usr/bin/perl -io
#################################
# Author: Antonio Cooler
# e-mail: Tony.Unix@yahoo.com.br
# Team BotecoUnix.com.Br
#################################
####################### carregando modulos
use LWP::UserAgent;
use Net::Twitter;
use WWW::Wikipedia;
use Net::Whois::Raw;
###################### paradigmas
use strict;
use warnings;
##################### força esvaziamento da memória
$|++;
#################### vars para uso do progressbar giratório de pipe
my $final_data = undef;
my $counter; my @animation =("\\","|","/","-");
################### chamando nosso programa
&programa();
################## função do spider que usa LWP::UserAgent para simular um navegador e um OS para pegar infos
################## por fim estes dados pegos da Pagina passada pela função é salva em "resposta.txt" para assim
################## passar em filtros com regex mais tarde...
sub spyder() {
unlink("resposta.txt");
my @page=@_; my $site=$page[0]; my $ua = new LWP::UserAgent;
$ua->agent('Mozilla/5.0 (X11; U; NetBSD i386; en-US; rv:1.8.1.12) Gecko/20080301 Firefox/2.0.0.12');
my $pedido1 = new HTTP::Request GET =>"$site";
my $resposta1 = $ua->request($pedido1) or die "Erro no site scanner\n"; my $res1 = $resposta1->content;
open (OUT, ">>resposta.txt"); print OUT "$res1\n"; close(OUT);
}
############### filtro de regex para RSS
sub RssRegex() {
open(RES,"<","resposta.txt");
  my @texto = <RES>; close(RES); unlink ("resposta.txt");
   foreach (@texto) {
    if ($_ =~ m/<(title)>(.*?)<\/(title)>/) { my $nova="$2"; print "Titulo: $nova\n"; }
    if ($_ =~ m/<(link)>(.*?)<\/(link)>/) {
      my $nova="$2"; print "Link: $nova\n========================================\n"; }
   }
}
############# escrevendo no arquivo binário e fazendo animação do pipe girar
sub writebin {
my ($data, $response, $protocol) = @_;
my $final_data .= $data;
print "$animation[$counter++]\b";
$counter = 0 if $counter == scalar(@animation);
print IN $data;
}
############ opção para retornar caso o user digite algo no fim de cada função
sub retorna() {
print "precione qualquer enter para retornar ao Menu\n";
while(<STDIN>) {
  if($_ =~ /.*/) { print "OK\n retornando ao menu\n"; sleep 1; programa(); }
}
}
########### função para limpar a tela
sub limpa() {
my $cmd=0; my $sys="$^O";
if($sys eq "linux") { $cmd="clear"; } else {  $cmd="cls"; }
print `$cmd`;
}
########## função para pegar entrada da escolha do usuario
########## usando loop de diamante com padrão de entrada para pegar numeros entre 0 a 8
sub entrada() {
while(<STDIN>) {
  if($_ =~ /[0-8]{1}/) { return($_); }
  print "digite numero de opção válida\n";
}
}
########## função mostra auternativas de escolhas
sub question() {
print q{
O que deseja fazer ?
digite um numero para escolher...
-------------------------------------------------
0- Sair do programa
1- Mandar MSG do dia no seu twitter
2- Ver Twitter de alguem
3- Ver news do BotecoUnix
4- Ver novidades de Exploits no Milw0rm
5- Procurar no wikipedia por alguma palavra
6- Ver Whois de algum dominio
7- Baixar videos do Youtube
8- Ver Temperatura do tempo em cidades Brasileiras
-------------------------------------------------

}
}
######### banner principal de intro
sub header() {
print q{
                SIMPLE
   ___           __               __
  /  _/___ _  _ _\ |___  _ __  | /  \ |
  \_  \ . \ \/ / . / ._\| `_/ \_\\\  //_/
  /___/  _/\  /\___\___\|_|    .'/()\`.
      |_\  /_/                 \ \  / /               
_              _____ ___   ___  _      ____  _____ 
| |            / ____/ _ \ / _ \| |    |___ \|  __ \
| |__  _   _  | |   | | | | | | | |      __) | |__) |
| '_ \| | | | | |   | | | | | | | |     |__ <|  _  /
| |_) | |_| | | |___| |_| | |_| | |____ ___) | | \ \
|_.__/ \__, |  \_____\___/ \___/|______|____/|_|  \_\
        __/ |                                       
       |___/                   Version 0.1
                               ------------
===========================================================================
Coded By /C00L3R || Cooler_/
Thanks _MLK_,dr4k3,Colt7r,voidpointer and All PerlMonks
===========================================================================
                    http://BotecoUnix.com.br
}
}
######### iniciano o Rock and roll baby
sub programa() {
limpa(); header(); sleep 1; question(); sleep 1;
chomp(my $escolha=entrada());
print "voce digitou $escolha OK\n";
# escolha para sair
if(!$escolha) { print "saindo do Spyder\n"; sleep 1; limpa(); unlink("resposta.txt"); exit; }

# simples metodo usando net twitter simples e rapido
if($escolha eq 1) {
  print "1-Mandar MSG do dia no seu twitter\n";
  print "qual seu ID no twitter ?\n"; chomp(my $id=<STDIN>);
  print "qual seu PASS no twitter ?\n"; chomp(my $pass=<STDIN>);
  print "Digite o que você esta fazendo ?\n"; chomp(my $texto=<STDIN>);
  print "enviando caso não for por que sua senha esta errada...\n";
  my $twit = Net::Twitter->new({username=>$id, password=>$pass });
  my $result = $twit->update({status => $texto}); retorna();
}

# pegando o RSS do twitter e extraindo com regex as infos
if($escolha eq 2) {
  print "2-Ver Twitter de alguem\n";
  print "digite o nick do twitter para ver\n"; chomp(my $nick=<STDIN>);
  my $target="http://twitter.com/".$nick; print "visitando $target\n"; &spyder($target);
  open(RES,"<","resposta.txt");
  my @texto = <RES>; close(RES); unlink ("resposta.txt");
   foreach (@texto) {
    if ($_ =~ m/<meta content=\"(.*?)\" name=\"description\" \/>/) {
     my $bio="$1"; print "nick: $nick bio: $bio\n";
    }
    if ($_ =~ m/<link rel=\"alternate\" href=\"(.*?)\" title=\"unixwarrior's Updates\" type=\"application\/rss\+xml\" \/>/) {
     my $rss="$1"; print "vendo o RSS $rss\n"; &spyder($rss); RssRegex(); retorna();
    }
  }
}

# pegando RSS do BotecoUnix
if($escolha eq 3) {
  print "3-Ver news do BotecoUnix\n";
  my $target="http://www.botecounix.com.br/blog/?feed=rss2";
  print "Vendo Ultimos Posts do BotecoUnix\n"; &spyder($target); RssRegex(); retorna();
}

# pegando RSS do milw0rm
if($escolha eq 4) {
  print "4-Ver novidades de Exploits no Milw0rm\n";
  my $target="http://milw0rm.com/rss.php";
  print "Vendo Ultimos Posts do Milw0rm\n"; &spyder($target); RssRegex(); retorna();
}

# sem esta lib www::wikipedia teriamos que usar uma regex infernal
# para extrair os dados do wikipedia
if($escolha eq 5) {
  print "5-Procurar no wikipedia por alguma palavra\n";
  print "digite um dado para procurar no wikipedia\n"; chomp(my $procura=<STDIN>);
  my $wiki = WWW::Wikipedia->new();
  $wiki = WWW::Wikipedia->new( language => 'pt' );
  my $result = $wiki->search( $procura );
  if ( $result->text() ) { print $result->text(); }
  retorna();
}

# se não usar a lib do whois fica dificil pegar as info pelo site do whois bular o captcha
if($escolha eq 6) {
print "6-ver Whois de algum dominio\n";
print "digite dominio por exemplo site.com.br\n"; chomp(my $site=<STDIN>);
my $whois=whois($site); print $whois;
retorna();
}

# esta escolha he baseada no programa do "Colt7r"
if($escolha eq 7) {
print "7-Baixar videos do Youtube\n";
print "qual o link do video ?\n"; chomp(my $link=<STDIN>); &spyder($link);
open(RES,"<","resposta.txt");
  my @texto = <RES>; close(RES); my $nome;
   foreach (@texto) {
    if ($_ =~ m/<title>(.*?)<\/title>/) { $nome=$1; }
    if ($_ =~ /var fullscreenUrl = \'.*&video_id=([^&]+)&.*&t=([^&]+)&.*/) {
     my $url ="http://www.youtube.com/get_video?video_id=".$1."&t=".$2;
     $nome =~ s/ /_/g;
     my $filename=$nome.".flv"; print "Download pode demorar\nFazendo Download de $filename ";
     open(IN, ">$filename") or die "$_\n"; binmode(IN);
     my $ua = LWP::UserAgent->new(  );
     my $response = $ua->get($url,":content_cb" => \&writebin,":read_size_hint" => 8192);
     print "\n-------------------------\nDownload de \"$filename\" Concluido\n";
     close IN; retorna();
    }
  }
}

# exemplo bobo de regex
if($escolha eq 8) {
  print "8- Ver Temperatura do tempo em cidades Brasileiras\n";
  print "Digite nome da cidade para ver temperatura\ncidade deve estar sem o acento ex: sao paulo\n";
  chomp(my $local=<STDIN>); $local =~ s/ /_/g;
  my $url="http://www1.folha.uol.com.br/folha/tempo/br-$local.shtml"; &spyder($url);
  open(RES,"<","resposta.txt");
  my @texto = <RES>; close(RES);
  foreach (@texto) {
   if ($_ =~ m/^<p><b>Temperatura:<\/b> (.*?)<\/p>/) {
    my $graus="$1";
    print "Local: $local \n";
    print "Temperatura: $graus\n------------\n"; retorna();
   }
  }
}

}


code = http://pastebin.com/f63934afa

C00L3R

Obrigado Colega mas tento fazer minha parte mais não sou nenhum mestre em programação
Estudar estudar só assim para chegar em dias melhores principalmente em nosso pais onde
linguagens como C,ASM,Perl,ruby,php não são tão valorizadas ...

Quem quer aprender um e-book que escrevi 
http://www.4shared.com/file/95427688/a284e1be/livro_2009_recente.html
fica uma dica

abraço