Papadopolis

cpturbo crawler

Jul 21st, 2012
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.88 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 para manipular o html retornado dos tópicos
  8. require HTML::TreeBuilder;
  9.  
  10. # Módulo usado que trabalha em conjunto com o LWP::UserAgent para salvar os cookies setados pelas requisições http
  11. require HTTP::Cookies;
  12.  
  13. use HTTP::Request::Common;
  14.  
  15. # Variáveis que serão usadas no decorrer do script
  16. my($urlPrefix, $req, $ua, $response, $content, $headers, $code, $output, $regexp, $cookies, $Thtml) = ('http://www.cpturbo.org/cpt/');
  17.  
  18. # Variáveis que devem ser alteradas
  19. # 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)
  20. my($cptLogin, $cptPass) = ('user', 'senha');
  21.  
  22. $cookies    = HTTP::Cookies->new();
  23. $Thtml      = HTML::TreeBuilder->new;
  24.  
  25. # Fazendo login no CPT
  26. $ua = LWP::UserAgent->new;
  27.  
  28. # 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
  29. $ua->cookie_jar(HTTP::Cookies->new('file' => 'cookies.txt', 'autosave' => 1));
  30.  
  31. print "Content-type: text/plain\n\n";
  32. print "Script em execução...\n\n";
  33.  
  34. $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]);
  35. $headers    = $response->headers_as_string;
  36. $code       = $response->code;
  37.  
  38. if($code == 302) { # 'Moved'
  39.    # capturando e armazenando os cookies dos headers
  40.    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
  41.        # $2 guarda o nome do cookie, $3 o valor
  42.        $cookies->set_cookie(0, $2, $3, '/', $urlPrefix, 80, 0, 0, 86400, 0);
  43.         if($2 == 'cpt_1212pass_hash') { # Esse é o cookie que salva a sessão do usuário logado
  44.            $logado = true;
  45.         }
  46.     }
  47. } else {
  48.     print 'Falha ao efetuar requisição HTTP.';
  49.     exit 0;
  50. }
  51.  
  52. if(!defined($logado)) {
  53.     print 'Não foi possível logar-se no CPT.';
  54.     exit 0;
  55. }
  56.  
  57. # Acessando a página principal e enviando o html de retorno para a sub rotina
  58. $response   = $ua->request(GET $urlPrefix.'index.php?act=idx');
  59. $content    = $response->content;
  60. $code       = $response->code;
  61.  
  62. salvarTopicos($content);
  63.  
  64. # Rotina que utiliza recursividade para acessar o link de todos os tópicos e salvar o HTML deles
  65. sub salvarTopicos {
  66.     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]
  67.    
  68.     if(!defined($subTop)) {$subTop = '';}
  69.     if(!defined($subFor)) {$subFor = '';}
  70.     if($pagina !=~ /^[+-]?\d+$/) {$pagina = 0;}
  71.    
  72.     # Captura e acessa todos os sub fórums da página
  73.    while($html =~ (/(<li>|<h4>)<a href=".*?showforum=(\d+)" title='Ir para o fórum'>(.*?)<\/a>/gi)) {
  74.         $|++;
  75.         print "\n\n", $2, ': ', $3, "\n";
  76.        
  77.         $forumNome  = $3;
  78.         $forumId    = $2;
  79.        
  80.         # Cria a pasta de cada fórum
  81.        mkdir 'arquivos/'. $subFor. $3, 0777 unless -d 'arquivos/'. $3;
  82.            
  83.         # Acessa a página de cada fórum e extrai seu html
  84.        $response   = $ua->request(GET $urlPrefix. 'index.php?showforum='. $2);
  85.         $content    = $response->content;
  86.        
  87.         salvarTopicos($content, $subTop. $forumNome. '/', $subFor. $forumNome. '/');
  88.         repag($forumId, $pagina + 40, $subTop. $forumNome. '/');
  89.     }
  90.    
  91.     # Captura e acessa todos os tópicos da página
  92.    while($html =~ (/showtopic.(\d+)\".*?em (\d+) (.*?) (\d+)...(\d+):(\d+).*?>(.*?)<\/a>/gi)) {
  93.        $|++;
  94.        saveTopicHTML($1, $7, $forumNome. '/');
  95.    }
  96. }
  97.  
  98. sub repag {
  99.    my($fid, $pst, $path) = (shift, shift, shift);
  100.    
  101.    $|++;
  102.    print "         ";
  103.    print "\n\n Página ", (($pst / 40) + 1),"\n";
  104.    $rp   = $ua->request(GET $urlPrefix. 'index.php?showforum='. $fid. '&st='. $pst);
  105.    $co    = $rp->content;
  106.    if($co !=~ (/Nenhum tópico encontrado/i)) {
  107.        while($co =~ (/showtopic.(\d+)\".*?em (\d+) (.*?) (\d+)...(\d+):(\d+).*?>(.*?)<\/a>/gi)) {
  108.            saveTopicHTML($1, $7, $path);
  109.        }
  110.        
  111.        repag($forumId, $pst + 40, $path);
  112.    } else {
  113.        return false;
  114.    }
  115. }
  116.  
  117. sub saveTopicHTML {
  118.    my($topicId, $topicName, $path) = (shift, shift, shift);
  119.    
  120.    $|++;
  121.    # Acessa a página de cada fórum e extrai seu html
  122.    $response   = $ua->request(GET $urlPrefix. 'index.php?showtopic='. $topicId);
  123.    $content    = $response->content;
  124.    
  125.    # Trata o HTML, pegando só aquilo que é realmente necessário (O post principal)
  126.    $Thtml->parse($content);
  127.  
  128.    @posts = $Thtml->look_down(
  129.        '_tag'   => 'div',
  130.        'class'  => 'topic hfeed',
  131.        sub {
  132.            $content_clean = $_[0]->as_HTML;
  133.        }
  134.    );
  135.    
  136. $content_clean = <<ENDHTML;
  137. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  138. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br" lang="pt-br">
  139.  
  140. <head>
  141. <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  142. <meta name="author" content="Pedro Papadópolis" />
  143.  
  144. <link rel="shortcut icon" href='http://www.cpturbo.org/cpt/favicon.ico' />
  145. <link rel="image_src" href='http://www.cpturbo.org/cpt/public/style_images/cpturbo/meta_image.png' />
  146.        
  147. <link rel="stylesheet" type="text/css" media='screen' href="http://www.cpturbo.org/cpt/public/min/index.php?ipbv=31005&amp;f=public/style_css/prettify.css" />
  148. <link rel="stylesheet" type="text/css" media='screen' href="../estilo.css" />
  149.  
  150. <title>CPTurbo Forum Crawler</title>
  151.  
  152. <style type="text/css">
  153. a {
  154.     color: #666;
  155.    font-weight: bold;
  156. }
  157.  
  158. a:hover {
  159.     color: #999;
  160. }
  161. </style>
  162. </head>
  163.  
  164. <body id='ipboard_body'>
  165.  
  166. <div id="ipbwrapper">
  167. <center>
  168. <div id='content' class='clear'>
  169. $content_clean
  170. </div>
  171. </div>
  172.  
  173. </center>
  174. </body>
  175. </html>
  176.  
  177. ENDHTML
  178.        
  179.     print "         ";
  180.     # Salva o conteúdo HTML de cada tópico nos arquivos
  181.    open ARQUIVO, ">>", 'arquivos/'. $path. $topicName. '.html';
  182.     if(!defined(ARQUIVO)) {
  183.         print "Tópico ", $topicName, " ...... Erro ao salvar\n";
  184.     } else {
  185.         print "Tópico ", $topicName, " ...... Salvo com sucesso\n";
  186.         print ARQUIVO $content_clean;
  187.         close ARQUIVO;
  188.     }
  189. }
  190.  
  191. exit 0;
Add Comment
Please, Sign In to add comment