Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!usr/bin/env perl
- ###############
- ### Modulos ###
- ###############
- use common::sense;
- use WWW::Mechanize;
- use WWW::Mechanize::PhantomJS;
- use WWW::Mechanize::DecodedContent;
- use PDF::FromImage;
- use Cwd;
- use Getopt::Mixed;
- use Try::Tiny;
- #########################
- ### Variáveis globais ###
- #########################
- my $url = WWW::Mechanize->new();
- my $phantom = WWW::Mechanize::PhantomJS->new();
- my $currentDir = getcwd;
- my $login;
- my $bookTarget;
- ###########################
- ### Checar argumentos ###
- ###########################
- Getopt::Mixed::init('l=i login>l b=i book>b h help>h');
- while( my( $option, $value, $pretty ) = Getopt::Mixed::nextOption()) {
- OPTION: {
- $option eq 'h' and do {
- &showArgumentsHelp;
- exit;
- };
- $option eq 'l' and do {
- $login = $value;
- last OPTION;
- };
- $option eq 'b' and do {
- $bookTarget = $value;
- last OPTION;
- };
- }
- }
- Getopt::Mixed::cleanup();
- if (!$login) {
- print "Erro: Especifique seu login!\n";
- &showArgumentsHelp;
- exit;
- }
- if (!$bookTarget) {
- print "Tem certeza que deseja efetuar download de todos os livros? (s/n)\n";
- print "Aviso: Essa ferramenta esta incompleta!\n";
- chomp (my $input = <>);
- if ($input ne 's') {
- &showArgumentsHelp;
- exit;
- }
- }
- sub showArgumentsHelp {
- print "Argumentos:\n";
- print "-l ou -login: Especifique o login (apenas numeros)\n";
- print "-b ou -book: Especifique o ID do livro (apenas numeros)\n";
- print " Para descobrir qual o ID do livro que deseja baixar, acesse-o no navegador\n";
- print " e veja na barra de endereco os numeros apos o 'publications'.\n";
- print " Se nenhum ID de livro for especificado,\n";
- print " ira efetuar download de todos (ferramenta incompleta!)\n";
- print "-h ou -help: Mostra essa mensagem de ajuda e finaliza o programa\n";
- }
- #######################
- ### Iniciando BOT ###
- #######################
- &login;
- sub login {
- $phantom->get("http://bvu.ifce.edu.br/login.php");
- print "Logging... ";
- $phantom->submit_form(
- fields => {
- login => $login,
- }
- );
- # Conferindo o Login
- if($phantom->decoded_content =~ /Fez login com sucesso./gi) {
- print "login done\n\n";
- if (!$bookTarget) {
- &downloadAllBooks;
- } else {
- &downloadBook($bookTarget, $bookTarget);
- }
- } else {
- $phantom->decoded_content =~ /<div class=".*alert-error.*">(.+?)<\/div>/;
- &loginError($1);
- }
- }
- sub downloadAllBooks {
- # Recolher todos ID's e nomes dos livros
- # TODO: Inacabado! Apenas irá recolher os dos primeiros livros listados
- my @books_id = $phantom->decoded_content =~ /<a href="\/users\/publications\/(\d+)"/g;
- my @books_name = $phantom->decoded_content =~ /.*class="cover">.*<img alt="(.*?)".*>.*>/g;
- my $i = 0;
- print "* Accessing books *\n";
- foreach (@books_id) {
- print "- " . $books_name[$i] . " (" . $_ . ")...\n";
- &downloadBook($_, $books_name[$i]);
- $i++;
- print "\n";
- }
- }
- # Função para efetuar download das imagens de cada página do livro
- sub downloadBook {
- # Declarar variáveis
- my ($bookId, $bookName) = @_;
- my $elementPage2;
- my $srcPage2;
- my @allPagesDir;
- my $pageCheck;
- my $checkChange;
- my $bookDir = $currentDir . '\\' . $bookName;
- mkdir($bookDir);
- # Acessar livro
- $phantom->get("http://ifcefortaleza.bv3.digitalpages.com.br/users/publications/" . $bookId);
- my $countPages = $phantom->eval('RDP.options.pageSetLength');
- print "Total number of pages: " . $countPages . "\n";
- my $elementPage1 = $phantom->eval("\$('.backgroundImg')[0]");
- my $srcPage1 = $elementPage1->get_attribute('src');
- print "Cover...\n";
- $url->mirror($srcPage1, $bookDir . '\\' . '0.png');
- push(@allPagesDir, $bookDir . '\\' . '0.png');
- $phantom->eval('navigate.next_page()');
- for (my $currentPage = 1; $currentPage <= $countPages; $currentPage += 2) {
- # Loop para permitir que o código só seja prosseguido caso a imagem tenha sido alterada
- # É necesário pois a mudança demora um pouco
- while ($checkChange eq '' || $srcPage1 eq $checkChange) {
- try {
- $pageCheck = $phantom->eval("\$('.backgroundImg')[0]");
- $checkChange = $pageCheck->get_attribute('src');
- } catch {
- print "Error when accessing the elements .backgroundImg! Trying again...\n";
- };
- }
- $srcPage1 = $checkChange;
- $url->mirror($srcPage1, $bookDir . '\\' . $currentPage . '.png');
- push(@allPagesDir, $bookDir . '\\' . $currentPage . '.png');
- print "Page " . $currentPage . "/" . $countPages . "...\n";
- $elementPage2 = $phantom->eval("\$('.backgroundImg')[1]");
- try {
- $srcPage2 = $elementPage2->get_attribute('src');
- $url->mirror($srcPage2, $bookDir . '\\' . ($currentPage + 1) . '.png');
- push(@allPagesDir, $bookDir . '\\' . ($currentPage + 1) . '.png');
- print "Page " . ($currentPage + 1) . "/" . $countPages . "...\n";
- } catch {
- print "Erro ao tentar acessar o atributo SRC da pagina a direita. Essa pagina realmente existe?\n";
- };
- $phantom->eval('navigate.next_page()');
- }
- # Gerar PDF
- my $pdf = PDF::FromImage->new;
- $pdf->load_images(@allPagesDir);
- $pdf->write_file($bookDir . '\\' . $bookName . '.pdf');
- print "... pdf creat!\n";
- # Finalizar
- print "* End! *\n";
- }
- # loginError -> chamado em caso de erro ao tentar logar
- sub loginError {
- print "erro ao realizar login!!\n";
- print "Mensagem de erro: @_\n";
- print "Tentar realizar login novamente? (s/n)\n";
- chomp (my $input = <>);
- if ($input eq 's') {
- print "Informe o seu login (apenas numeros): ";
- chomp ($login = <>);
- &login;
- }
- }
- __END__
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement