Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- # Módulo para requisição HTTP
- # 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.
- require LWP::UserAgent;
- # Módulo para manipular o html retornado dos tópicos
- require HTML::TreeBuilder;
- # Módulo usado que trabalha em conjunto com o LWP::UserAgent para salvar os cookies setados pelas requisições http
- require HTTP::Cookies;
- use HTTP::Request::Common;
- # Variáveis que serão usadas no decorrer do script
- my($urlPrefix, $req, $ua, $response, $content, $headers, $code, $output, $regexp, $cookies, $Thtml) = ('http://www.cpturbo.org/cpt/');
- # Variáveis que devem ser alteradas
- # 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)
- my($cptLogin, $cptPass) = ('user', 'senha');
- $cookies = HTTP::Cookies->new();
- $Thtml = HTML::TreeBuilder->new;
- # Fazendo login no CPT
- $ua = LWP::UserAgent->new;
- # 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
- $ua->cookie_jar(HTTP::Cookies->new('file' => 'cookies.txt', 'autosave' => 1));
- print "Content-type: text/plain\n\n";
- print "Script em execução...\n\n";
- $response = $ua->request(POST $urlPrefix.'index.php?app=core&module=global§ion=login&do=process', [username => $cptLogin, password => $cptPass, referer => $urlPrefix. 'index.php', rememberMe => 1]);
- $headers = $response->headers_as_string;
- $code = $response->code;
- if($code == 302) { # 'Moved'
- # capturando e armazenando os cookies dos headers
- 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
- # $2 guarda o nome do cookie, $3 o valor
- $cookies->set_cookie(0, $2, $3, '/', $urlPrefix, 80, 0, 0, 86400, 0);
- if($2 == 'cpt_1212pass_hash') { # Esse é o cookie que salva a sessão do usuário logado
- $logado = true;
- }
- }
- } else {
- print 'Falha ao efetuar requisição HTTP.';
- exit 0;
- }
- if(!defined($logado)) {
- print 'Não foi possível logar-se no CPT.';
- exit 0;
- }
- # Acessando a página principal e enviando o html de retorno para a sub rotina
- $response = $ua->request(GET $urlPrefix.'index.php?act=idx');
- $content = $response->content;
- $code = $response->code;
- salvarTopicos($content);
- # Rotina que utiliza recursividade para acessar o link de todos os tópicos e salvar o HTML deles
- sub salvarTopicos {
- 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]
- if(!defined($subTop)) {$subTop = '';}
- if(!defined($subFor)) {$subFor = '';}
- if($pagina !=~ /^[+-]?\d+$/) {$pagina = 0;}
- # Captura e acessa todos os sub fórums da página
- while($html =~ (/(<li>|<h4>)<a href=".*?showforum=(\d+)" title='Ir para o fórum'>(.*?)<\/a>/gi)) {
- $|++;
- print "\n\n", $2, ': ', $3, "\n";
- $forumNome = $3;
- $forumId = $2;
- # Cria a pasta de cada fórum
- mkdir 'arquivos/'. $subFor. $3, 0777 unless -d 'arquivos/'. $3;
- # Acessa a página de cada fórum e extrai seu html
- $response = $ua->request(GET $urlPrefix. 'index.php?showforum='. $2);
- $content = $response->content;
- salvarTopicos($content, $subTop. $forumNome. '/', $subFor. $forumNome. '/');
- repag($forumId, $pagina + 40, $subTop. $forumNome. '/');
- }
- # Captura e acessa todos os tópicos da página
- while($html =~ (/showtopic.(\d+)\".*?em (\d+) (.*?) (\d+)...(\d+):(\d+).*?>(.*?)<\/a>/gi)) {
- $|++;
- saveTopicHTML($1, $7, $forumNome. '/');
- }
- }
- sub repag {
- my($fid, $pst, $path) = (shift, shift, shift);
- $|++;
- print " ";
- print "\n\n Página ", (($pst / 40) + 1),"\n";
- $rp = $ua->request(GET $urlPrefix. 'index.php?showforum='. $fid. '&st='. $pst);
- $co = $rp->content;
- if($co !=~ (/Nenhum tópico encontrado/i)) {
- while($co =~ (/showtopic.(\d+)\".*?em (\d+) (.*?) (\d+)...(\d+):(\d+).*?>(.*?)<\/a>/gi)) {
- saveTopicHTML($1, $7, $path);
- }
- repag($forumId, $pst + 40, $path);
- } else {
- return false;
- }
- }
- sub saveTopicHTML {
- my($topicId, $topicName, $path) = (shift, shift, shift);
- $|++;
- # Acessa a página de cada fórum e extrai seu html
- $response = $ua->request(GET $urlPrefix. 'index.php?showtopic='. $topicId);
- $content = $response->content;
- # Trata o HTML, pegando só aquilo que é realmente necessário (O post principal)
- $Thtml->parse($content);
- @posts = $Thtml->look_down(
- '_tag' => 'div',
- 'class' => 'topic hfeed',
- sub {
- $content_clean = $_[0]->as_HTML;
- }
- );
- $content_clean = <<ENDHTML;
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br" lang="pt-br">
- <head>
- <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
- <meta name="author" content="Pedro Papadópolis" />
- <link rel="shortcut icon" href='http://www.cpturbo.org/cpt/favicon.ico' />
- <link rel="image_src" href='http://www.cpturbo.org/cpt/public/style_images/cpturbo/meta_image.png' />
- <link rel="stylesheet" type="text/css" media='screen' href="http://www.cpturbo.org/cpt/public/min/index.php?ipbv=31005&f=public/style_css/prettify.css" />
- <link rel="stylesheet" type="text/css" media='screen' href="../estilo.css" />
- <title>CPTurbo Forum Crawler</title>
- <style type="text/css">
- a {
- color: #666;
- font-weight: bold;
- }
- a:hover {
- color: #999;
- }
- </style>
- </head>
- <body id='ipboard_body'>
- <div id="ipbwrapper">
- <center>
- <div id='content' class='clear'>
- $content_clean
- </div>
- </div>
- </center>
- </body>
- </html>
- ENDHTML
- print " ";
- # Salva o conteúdo HTML de cada tópico nos arquivos
- open ARQUIVO, ">>", 'arquivos/'. $path. $topicName. '.html';
- if(!defined(ARQUIVO)) {
- print "Tópico ", $topicName, " ...... Erro ao salvar\n";
- } else {
- print "Tópico ", $topicName, " ...... Salvo com sucesso\n";
- print ARQUIVO $content_clean;
- close ARQUIVO;
- }
- }
- exit 0;
Add Comment
Please, Sign In to add comment