Advertisement
Guest User

Untitled

a guest
Oct 14th, 2014
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 5.51 KB | None | 0 0
  1. #!usr/bin/env perl
  2.  
  3. ###############
  4. ### Modulos ###
  5. ###############
  6. use common::sense;
  7. use WWW::Mechanize;
  8. use WWW::Mechanize::PhantomJS;
  9. use WWW::Mechanize::DecodedContent;
  10. use PDF::FromImage;
  11. use Cwd;
  12. use Getopt::Mixed;
  13. use Try::Tiny;
  14.  
  15. #########################
  16. ### Variáveis globais ###
  17. #########################
  18. my $url = WWW::Mechanize->new();
  19. my $phantom = WWW::Mechanize::PhantomJS->new();
  20. my $currentDir = getcwd;
  21. my $login;
  22. my $bookTarget;
  23.  
  24. ###########################
  25. ###  Checar argumentos  ###
  26. ###########################
  27. Getopt::Mixed::init('l=i login>l b=i book>b h help>h');
  28. while( my( $option, $value, $pretty ) = Getopt::Mixed::nextOption()) {
  29.     OPTION: {
  30.         $option eq 'h' and do {
  31.             &showArgumentsHelp;
  32.             exit;
  33.         };
  34.         $option eq 'l' and do {
  35.             $login = $value;
  36.  
  37.             last OPTION;
  38.         };
  39.         $option eq 'b' and do {
  40.             $bookTarget = $value;
  41.             last OPTION;
  42.         };
  43.     }
  44. }
  45. Getopt::Mixed::cleanup();
  46.  
  47. if (!$login) {
  48.     print "Erro: Especifique seu login!\n";
  49.     &showArgumentsHelp;
  50.     exit;
  51. }
  52.  
  53. if (!$bookTarget) {
  54.     print "Tem certeza que deseja efetuar download de todos os livros? (s/n)\n";
  55.     print "Aviso: Essa ferramenta esta incompleta!\n";
  56.     chomp (my $input = <>);
  57.     if ($input ne 's') {
  58.         &showArgumentsHelp;
  59.         exit;
  60.     }
  61. }
  62.  
  63. sub showArgumentsHelp {
  64.     print "Argumentos:\n";
  65.     print "-l ou -login: Especifique o login (apenas numeros)\n";
  66.     print "-b ou -book: Especifique o ID do livro (apenas numeros)\n";
  67.     print "  Para descobrir qual o ID do livro que deseja baixar, acesse-o no navegador\n";
  68.     print "  e veja na barra de endereco os numeros apos o 'publications'.\n";
  69.     print "  Se nenhum ID de livro for especificado,\n";
  70.     print "  ira efetuar download de todos (ferramenta incompleta!)\n";
  71.     print "-h ou -help: Mostra essa mensagem de ajuda e finaliza o programa\n";
  72. }
  73.  
  74. #######################
  75. ###  Iniciando BOT  ###
  76. #######################
  77. &login;
  78.  
  79. sub login {
  80.     $phantom->get("http://bvu.ifce.edu.br/login.php");
  81.    
  82.     print "Logging... ";
  83.    
  84.     $phantom->submit_form(
  85.         fields => {
  86.             login => $login,
  87.         }
  88.     );
  89.    
  90.     # Conferindo o Login
  91.     if($phantom->decoded_content =~ /Fez login com sucesso./gi) {
  92.         print "login done\n\n";
  93.         if (!$bookTarget) {
  94.             &downloadAllBooks;
  95.         } else {
  96.             &downloadBook($bookTarget, $bookTarget);
  97.         }
  98.     } else {
  99.         $phantom->decoded_content =~ /<div class=".*alert-error.*">(.+?)<\/div>/;
  100.         &loginError($1);
  101.     }
  102. }
  103.  
  104. sub downloadAllBooks {
  105.     # Recolher todos ID's e nomes dos livros
  106.     # TODO: Inacabado! Apenas irá recolher os dos primeiros livros listados
  107.     my @books_id = $phantom->decoded_content =~ /<a href="\/users\/publications\/(\d+)"/g;
  108.     my @books_name = $phantom->decoded_content =~ /.*class="cover">.*<img alt="(.*?)".*>.*>/g;
  109.     my $i = 0;
  110.    
  111.     print "* Accessing books *\n";
  112.     foreach (@books_id) {
  113.         print "- " . $books_name[$i] . " (" . $_ . ")...\n";
  114.         &downloadBook($_, $books_name[$i]);
  115.        
  116.         $i++;
  117.         print "\n";
  118.     }
  119. }
  120.  
  121. # Função para efetuar download das imagens de cada página do livro
  122. sub downloadBook {
  123.     # Declarar variáveis
  124.     my ($bookId, $bookName) = @_;
  125.     my $elementPage2;
  126.     my $srcPage2;
  127.     my @allPagesDir;
  128.    
  129.     my $pageCheck;
  130.     my $checkChange;
  131.    
  132.     my $bookDir = $currentDir . '\\' . $bookName;
  133.     mkdir($bookDir);
  134.    
  135.     # Acessar livro
  136.     $phantom->get("http://ifcefortaleza.bv3.digitalpages.com.br/users/publications/" . $bookId);
  137.    
  138.     my $countPages = $phantom->eval('RDP.options.pageSetLength');
  139.     print "Total number of pages: " . $countPages . "\n";
  140.    
  141.     my $elementPage1 = $phantom->eval("\$('.backgroundImg')[0]");
  142.     my $srcPage1 = $elementPage1->get_attribute('src');
  143.     print "Cover...\n";
  144.     $url->mirror($srcPage1, $bookDir . '\\' . '0.png');
  145.     push(@allPagesDir, $bookDir . '\\' . '0.png');
  146.     $phantom->eval('navigate.next_page()');
  147.    
  148.     for (my $currentPage = 1; $currentPage <= $countPages; $currentPage += 2) {
  149.         # Loop para permitir que o código só seja prosseguido caso a imagem tenha sido alterada
  150.         # É necesário pois a mudança demora um pouco
  151.         while ($checkChange eq '' || $srcPage1 eq $checkChange) {
  152.             try {
  153.                 $pageCheck = $phantom->eval("\$('.backgroundImg')[0]");
  154.                 $checkChange = $pageCheck->get_attribute('src');
  155.             } catch {
  156.                 print "Error when accessing the elements .backgroundImg! Trying again...\n";
  157.             };
  158.         }
  159.        
  160.         $srcPage1 = $checkChange;
  161.         $url->mirror($srcPage1, $bookDir . '\\' . $currentPage . '.png');
  162.         push(@allPagesDir, $bookDir . '\\' . $currentPage . '.png');
  163.         print "Page " . $currentPage . "/" . $countPages . "...\n";
  164.        
  165.         $elementPage2 = $phantom->eval("\$('.backgroundImg')[1]");
  166.         try {
  167.             $srcPage2 = $elementPage2->get_attribute('src');
  168.             $url->mirror($srcPage2, $bookDir . '\\' . ($currentPage + 1) . '.png');
  169.             push(@allPagesDir, $bookDir . '\\' . ($currentPage + 1) . '.png');
  170.             print "Page " . ($currentPage + 1) . "/" . $countPages . "...\n";
  171.         } catch {
  172.             print "Erro ao tentar acessar o atributo SRC da pagina a direita. Essa pagina realmente existe?\n";
  173.         };
  174.        
  175.         $phantom->eval('navigate.next_page()');
  176.     }
  177.    
  178.     # Gerar PDF
  179.     my $pdf = PDF::FromImage->new;
  180.     $pdf->load_images(@allPagesDir);
  181.     $pdf->write_file($bookDir . '\\' . $bookName . '.pdf');
  182.     print "... pdf creat!\n";
  183.    
  184.     # Finalizar
  185.     print "* End! *\n";
  186. }
  187.  
  188. # loginError -> chamado em caso de erro ao tentar logar
  189. sub loginError {
  190.     print "erro ao realizar login!!\n";
  191.     print "Mensagem de erro: @_\n";
  192.     print "Tentar realizar login novamente? (s/n)\n";
  193.     chomp (my $input = <>);
  194.        
  195.     if ($input eq 's') {
  196.         print "Informe o seu login (apenas numeros): ";
  197.         chomp ($login = <>);
  198.         &login;
  199.     }
  200. }
  201.  
  202. __END__
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement