O script foi feito para facilitar a vida de quem precisa baixar diariamente o Diário Oficial da União.
Está simplificado e comentado, contendo a parte essencial e suficiente para o que se propõe.
Basta executá-lo no prompt de comando ou chamá-lo em um script shell.
Foi feito para ser executado sem nenhuma dependência externa além da linguagem Perl e dos módulos usados: DateTime, LWP::Simple, LWP::Simple::Cookies e CAM::PDF. Estes módulos podem ser instalados facilmente digitando no prompt:
Com os módulos instalados, é só colocar o script para funcionar. Ex.: para baixar o Diário Oficial da Seção 2 do DOU, basta digitar no prompt de comando:
$ perl in_lwp.pl 2
Que ele irá baixar todas as páginas do DOU-2 e criar um PDF contendo todas elas.
Os diários disponíveis testados são: 1, 2, 3, 20 e 1010.
Changelog: Com a mudança da localização da página dos Jornais na Imprensa Oficial, houve a necessidade de se alterar o script em duas linhas que fazem referência às URLs.
$|=1; # variável que indica para fazer "flush" após cada operação de escrita
my $jornal= shift; # recebe o numero do jornal desejado passado como parâmetro ( 1, 2, 3, 20 ou 1010)
print "Jornal: $jornal\n";
use DateTime;
my $dt=DateTime->now; # recupera a data do sistema
$ymd=$dt->ymd; # string da data no formato yyyy-mm-dd
$dmy=$dt->dmy("/"); # string da data no formato dd/mm/yyyy
print "Data: $dmy\n";
use LWP::Simple; # módulo para fazer as requisições http de forma simples
use LWP::Simple::Cookies ( autosave => 1,
file => "lwp_cookies.dat" ); # módulo que trata automaticamente do armazenamento e envio de cookies feitos com as requisições de LWP::Simple
$doc = get("http://www.in.gov.br/visualiza/index.jsp?jornal=$jornal&pagina=1&data=$dmy"); #requisição inicial da página do caderno
if ( $doc=~/&totalArquivos=(\d*)"/ ){ # verifica quantas páginas o caderno tem
$paginas=$1;
print "Paginas: $paginas\n";
foreach $i ( 1..$paginas) { # loop para fazer a requisição de todas as páginas
my $arq="IN-Jornal $jornal - $ymd - pag_$i.pdf"; # nome local do arquivo pdf a ser recuperado
getstore("http://www.in.gov.br/servlet/INPDFViewer?jornal=$jornal&pagina=$i&data=$dmy&captchafield=firistAccess",
$arq ) && print "$arq (ok)\n" ; # faz a requisição e armazena
if ( $i == 1) { # se for a primeira página...
use CAM::PDF;
$bigpdf = CAM::PDF->new("$arq"); # a primeira página será a base para anexar os outros pdf
} else {
my $anotherpdf = CAM::PDF->new("$arq"); # demais páginas pdf
$bigpdf->appendPDF($anotherpdf); # anexadas à primeira
}
}
$bigpdf->cleanoutput("IN-Jornal $jornal - $ymd.pdf"); #salva o pdf com todas as páginas
}else { print "IN-Jornal $jornal não disponível!\n" } #avisa se o caderno não está disponível
[3] Comentário enviado por ademirff63 em 08/01/2014 - 16:42h
Faça o download da versão 2 do script, pois o código fonte exibido na página ainda está mostrando a primeira versão.
As seguintes linhas foram modificadas (apenas as URL do site da imprensa nacional que foram alteradas em meados de dezembro):
[6] Comentário enviado por removido em 22/09/2014 - 19:04h
Toda vez que rodo com um caderno do DOu com muitas paginas, aleatoriamente , ( as vezes na pagina 3, as vezes na 30, as vezes na 16, etc...) o script interrompe a execução com a seguinte mensagem : :
Can't call method "getRootDict" on an undefined value at /usr/local/share/perl/5.14.2/CAM/PDF.pm line 3786.
alguem sabe, como pelo menos , prosseguir o loop de downloads, ainda que perdendo aquela pagina especifica que deu problemas??? Grato
[7] Comentário enviado por ademirff63 em 22/09/2014 - 19:59h
Para fazer o download dos pdf sem criar o pdf único com todas as páginas e assim não correr o risco de se querer anexar uma página vazia (que não foi recuperada por qualquer motivo) ao pdf completo, é só retirar as linhas seguintes do script, que fazem uso do módulo CAM::PDF:
if ( $i == 1) { # se for a primeira página...
use CAM::PDF;
$bigpdf = CAM::PDF->new("$arq"); # a primeira página será a base para anexar os outros pdf
} else {
my $anotherpdf = CAM::PDF->new("$arq"); # demais páginas pdf
$bigpdf->appendPDF($anotherpdf); # anexadas à primeira
}
}
$bigpdf->cleanoutput("IN-Jornal $jornal - $ymd.pdf"); #salva o pdf com todas as páginas
E se tiver o pdftk instalado no seu linux, há mais de uma maneira de fazer isto com perl: é só substituir todas as linhas citadas pela seguinte linha, que deve ser colocada como a última do script:
[8] Comentário enviado por ademirff63 em 14/01/2015 - 12:48h
Se alguém precisar do DOU ou do DOESP diariamente e quiser saber quando o pdf inteiro estiver disponível para download no site em http://diariooficialhoje.com.br.
[9] Comentário enviado por ademirff63 em 07/01/2021 - 18:50h
Se alguém precisar do DOU ou do DOESP diariamente e quiser saber quando o pdf inteiro estiver disponível para download confira o novo domínio que criei: http://diariooficialhoje.com.br