Advertisement
Papadopolis

Untitled

Jan 18th, 2012
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 5.33 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. # Módulo para requisição HTTP
  4. # require HTTP::Request; # Esse módulo não é necessário nesse script, eu prefiro usar o LWP::UserAgent pra fazer requisições com post fields e cookies.
  5. require LWP::UserAgent;
  6.  
  7. # Módulo usado que trabalha em conjunto com o LWP::UserAgent para salvar os cookies setados pelas requisições http
  8. require HTTP::Cookies;
  9.  
  10. use HTTP::Request::Common;
  11.  
  12. # Variáveis que serão usadas no decorrer do script
  13. my($urlPrefix, $req, $ua, $response, $content, $headers, $code, $output, $regexp, $cookies) = ('http://www.cpturbo.org/cpt/');
  14.  
  15. # Variáveis que devem ser alteradas
  16. # Login e senha do CPT e opção de ativar repaginação do script (capturar absolutamente todas as páginas possíveis do fórum)
  17. my($cptLogin, $cptPass) = ('user', 'senha');
  18.  
  19. $cookies = HTTP::Cookies->new();
  20.  
  21. # Fazendo login no CPT
  22. $ua = LWP::UserAgent->new;
  23.  
  24. # Os cookies são armazenados automaticamente no arquivo cookies.txt, também são usados automaticamente ao fazer uma requisição no domínio em que foram setados, só não se esqueça de setar o chmod do arquivo para 0640
  25. $ua->cookie_jar(HTTP::Cookies->new('file' => 'cookies.txt', 'autosave' => 1));
  26.  
  27. print "Content-type: text/plain\n\n";
  28. print "Script em execução...\n\n";
  29.  
  30. $response   = $ua->request(POST $urlPrefix.'index.php?app=core&module=global&section=login&do=process', [username => $cptLogin, password => $cptPass, referer => $urlPrefix. 'index.php', rememberMe => 1]);
  31. $headers    = $response->headers_as_string;
  32. $code       = $response->code;
  33.  
  34. if($code == 302) { # 'Moved'
  35.     # capturando e armazenando os cookies dos headers
  36.     while($headers =~ (/.*?set-cookie: ((.*?)=(.*?);)/gi)) { # Se não incluir a flag 'g' o script entra em loop infinito / Colocar as RegExp entre parêntesis não é algo obrigatório
  37.         # $2 guarda o nome do cookie, $3 o valor
  38.         $cookies->set_cookie(0, $2, $3, '/', $urlPrefix, 80, 0, 0, 86400, 0);
  39.         if($2 == 'cpt_1212pass_hash') { # Esse é o cookie que salva a sessão do usuário logado
  40.             $logado = true;
  41.         }
  42.     }
  43. } else {
  44.     print 'Falha ao efetuar requisição HTTP.';
  45.     exit 0;
  46. }
  47.  
  48. if(!defined($logado)) {
  49.     print 'Não foi possível logar-se no CPT.';
  50.     exit 0;
  51. }
  52.  
  53. # Acessando a página principal e enviando o html de retorno para a sub rotina
  54. $response   = $ua->request(GET $urlPrefix.'index.php?act=idx');
  55. $content    = $response->content;
  56. $code       = $response->code;
  57.  
  58. salvarTopicos($content);
  59.  
  60. # Rotina que utiliza recursividade para acessar o link de todos os tópicos e salvar o HTML deles
  61. sub salvarTopicos {
  62.     my($html, $subTop, $subFor, $pagina) = (shift, shift, shift, shift); # a função shift serve para obter e excluir o primeiro ítem de um array, que nesse caso são os argumentos da função que ficam armazenados na array $_ (que não é declarada), sendo assim você também pode acessar os parâmetros passados para sua rotina utilizando $_[0], $_[1], ..., $_[50]
  63.    
  64.     if(!defined($subTop)) {$subTop = '';}
  65.     if(!defined($subFor)) {$subFor = '';}
  66.     if($pagina !=~ /^[+-]?\d+$/) {$pagina = 0;}
  67.    
  68.     # Captura e acessa todos os sub fórums da página
  69.     while($html =~ (/(<li>|<h4>)<a href=".*?showforum=(\d+)" title='Ir para o fórum'>(.*?)<\/a>/gi)) {
  70.         $|++;
  71.         print "\n\n", $2, ': ', $3, "\n";
  72.        
  73.         $forumNome  = $3;
  74.         $forumId    = $2;
  75.        
  76.         # Cria a pasta de cada fórum
  77.         mkdir 'arquivos/'. $subFor. $3, 0777 unless -d 'arquivos/'. $3;
  78.            
  79.         # Acessa a página de cada fórum e extrai seu html
  80.         $response   = $ua->request(GET $urlPrefix. 'index.php?showforum='. $2);
  81.         $content    = $response->content;
  82.        
  83.         salvarTopicos($content, $subTop. $forumNome. '/', $subFor. $forumNome. '/');
  84.         repag($forumId, $pagina + 40, $subTop. $forumNome. '/');
  85.     }
  86.    
  87.     # Captura e acessa todos os tópicos da página
  88.     while($html =~ (/showtopic.(\d+)\".*?em (\d+) (.*?) (\d+)...(\d+):(\d+).*?>(.*?)<\/a>/gi)) {
  89.         $|++;
  90.         saveTopicHTML($1, $7, $forumNome. '/');
  91.     }
  92. }
  93.  
  94. sub repag {
  95.     my($fid, $pst, $path) = (shift, shift, shift);
  96.    
  97.     $|++;
  98.     print "         ";
  99.     print "\n\n Página ", (($pst / 40) + 1),"\n";
  100.     $rp   = $ua->request(GET $urlPrefix. 'index.php?showforum='. $fid. '&st='. $pst);
  101.     $co    = $rp->content;
  102.     if($co !=~ (/Nenhum tópico encontrado/i)) {
  103.         while($co =~ (/showtopic.(\d+)\".*?em (\d+) (.*?) (\d+)...(\d+):(\d+).*?>(.*?)<\/a>/gi)) {
  104.             saveTopicHTML($1, $7, $path);
  105.         }
  106.        
  107.         repag($forumId, $pst + 40, $path);
  108.     } else {
  109.         return false;
  110.     }
  111. }
  112.  
  113. sub saveTopicHTML {
  114.     my($topicId, $topicName, $path) = (shift, shift, shift);
  115.    
  116.     $|++;
  117.     # Acessa a página de cada fórum e extrai seu html
  118.     $response   = $ua->request(GET $urlPrefix. 'index.php?showtopic='. $topicId);
  119.     $content    = $response->content;
  120.        
  121.     print "         ";
  122.     # Salva o conteúdo HTML de cada tópico nos arquivos
  123.     open ARQUIVO, ">>", 'arquivos/'. $path. $topicName. '.html';
  124.     if(!defined(ARQUIVO)) {
  125.         print "Tópico ", $topicName, " ...... Erro ao salvar\n";
  126.     } else {
  127.         print "Tópico ", $topicName, " ...... Salvo com sucesso\n";
  128.         print ARQUIVO $content;
  129.         close ARQUIVO;
  130.     }
  131. }
  132.  
  133. exit 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement