Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- #---------------------------------------------------------------------------------
- #
- # volbackup.sh
- #
- # Versão 1.0 beta
- #
- # Script usado para salvar todos os artigos de um usuário
- # do site Viva o Linux - www.vivaolinux.com.br
- #
- #
- #
- # *** precisa do wkhtmltopdf instalado ***
- #
- #
- # Por Xerxes Lins
- # Contato: http://www.vivaolinux.com.br/~xerxeslins
- #
- # Recife, 21 de janeiro de 2013
- #---------------------------------------------------------------------------------
- #
- #
- # Tem como entrada o nome de um usuário do Viva o linux, busca seus artigos,
- # salva-os em HTML e em PDF.
- #
- # A conversão para PDF pode gerar arquivos com defeito devido limitações do
- # software WkHTMLtoPDF.
- #
- # O sistema Ubuntu usa DASH ao invés de BASH, por isso antes de executar este
- # script, caso use Ubuntu, use primeiro o comando:
- #
- # $ sudo dpkg-reconfigure dash
- #
- # E quando perguntado se deseja usar o DASH responda NÃO.
- # Depois disso pode usar o script no Ubuntu sem problemas.
- #
- # Torne o script executável:
- # $ chmod +x volbackup.sh
- #
- # Execute:
- # $ sh ./volbackup
- #
- #
- #---------------------------------------------------------------------------------
- #
- #
- #
- # Histórico:
- #
- # versão 1.0b (2013-21-01)
- # versão 1.1b (2013-12-02)
- #
- # * corrigido o bug de dizer onde movia os artigos ($dir2 e não $dir)
- # * adicionado aviso para trocar DASH por BASH para quem usa Ubuntu
- #
- # Licença: GPL
- #
- #
- #---------------------------------------------------------------------------------
- dir=~/.volbackup # define o diretório onde ocorrerão os procedimentos do script
- dir2=~/artigos_vol # diretório onde os artigos serão salvos
- sleeptime=10 # tempo padrão do comando "sleep" antes de usar o comando "curl" (para evitar flood)
- # Criação dos diretórios principais:
- # Caso o diretório $dir exista, ele será REcriado.
- # Se não, ele será criado.
- if [ -d "$dir" ]; then
- rm -rf "$dir"
- mkdir "$dir"
- else
- mkdir "$dir"
- fi
- # Caso o diretório $dir2 exista, ele será REcriado.
- # Se não, ele será criado.
- # Inclui subdiretórios (HTML e PDF)
- if [ -d "$dir2" ]; then
- rm -rf "$dir2"
- mkdir $dir2
- mkdir $dir2/PDF
- mkdir $dir2/HTML
- else
- mkdir $dir2
- mkdir $dir2/PDF
- mkdir $dir2/HTML
- fi
- # Buscar pelo usuário do qual se quer fazer o backup:
- # Pergunta o nome do usuário
- clear
- echo "Deseja salvar os artigos de que usuário?"
- echo
- read entrada
- clear
- # Da entrada do usuário acima pega-se apenas a primeira palavra
- # Ex.:
- # Se o usuário digitar "Xerxes Lins"
- # Será usado apenas "Xerxes"
- login=$(echo " $entrada " | awk '{print $1;}')
- # Um alerta sobre o usuário removido
- if [ $login = "removido" ]; then
- echo "Usuário removido herda TODOS os artigos dos usuários que foram removidos, ou seja, são muitos artigos!"
- echo "Para continuar, pressione Enter. Para sair use Ctrl+C."
- read tecla_user
- fi
- echo "Buscando usuário $login no Viva o Linux..."
- # Define o endereço completo da página do usuário do qual será feito a cópia dos artigos
- pagina_do_usuario=http://www.vivaolinux.com.br/~$login
- # Arquivo descartável para verificar se o usuário existe no Viva o Linux
- FILE=$dir/.saida_usuario.txt
- # Joga a saída do Curl no arquivo descartável definido acima
- curl --silent $pagina_do_usuario > $FILE
- # Se encontrar o usuário (ou seja, se o $FILE não for vazio), o script continua, se não ele encerra.
- if [[ -s $FILE ]] ; then
- echo "Usuário $login encontrado."
- sleep 2
- else
- echo "Usuário não encontrado!"
- sleep 1
- echo "Saindo..."
- exit 1
- fi ;
- # Quantas páginas há no índice de artigos do usuário?
- # Arquivo descartável para verificar se o usuário publicou artigos
- FILE=$dir/.saida_indice.txt
- curl --silent "http://www.vivaolinux.com.br/artigos/userview.php?login=$login" > $FILE
- tem_artigo=$(cat $FILE | grep '<tr><td><b>Nenhum artigo foi encontrado.</b></td></tr>')
- # Se não achar o índice de artigos, encerra o programa
- if [[ -z $tem_artigo ]] ; then
- echo "$login publicou artigos no Viva o Linux!"
- sleep 2
- else
- echo "Usuário $login não publicou artigos no Viva o Linux."
- sleep 1
- echo "Saindo..."
- exit 1
- fi ;
- # Captura da página do índice, as linhas referentes às opções de páginas
- # (vai capturar todas menos uma, a SELECTED)
- echo "Aguarde enquanto dados são coletados..."
- sleep $sleeptime
- curl --silent "http://www.vivaolinux.com.br/artigos/userview.php?login=$login&&pagina=1" | sed '1,/<option value=1 SELECTED>1/ d' | sed '/<\/select>/,$ d' > $FILE
- # Conta quantas linhas tem no arquivo saida_indice.txt
- num_pag=$(awk '{x++} END {print x}' $FILE)
- # Incrementa 1 à contagem para ficar certo já que
- # A primeira linha sempre é excluída
- let num_pag++
- # Pega da última linha do arquivo, o útimo numero da página
- # que corresponde ao total de páginas do índice de artigos
- #num_pag=$(cat $dir/saida_indice.txt | tail -1 | sed 's/<.*>//g')
- #num_pag=1 # Define outro número de páginas para fins de teste
- # Listar todos os artigos:
- # Loop para verificar em cada uma das páginas do índice
- for ((i=1;i<=$num_pag;i++)); do
- echo "Coletando informações da página $i de $num_pag do índice de artigos de $login..."
- # Extrai o conteúdo da página do índice e joga em ".extração_da_pagina.txt"
- # para poder "garimpar" os links depois
- sleep $sleeptime
- curl --silent "http://www.vivaolinux.com.br/artigos/userview.php?login=$login&&pagina=$i" > $dir/.extracao_da_pagina.txt
- # Garimpando os links...
- # Este comando extrai todos os links dos artigos de dentro do arquivo ".extração_da_pagina.txt"
- # E envia para o arquivo ".links" para criar uma lista com todos os links
- cat $dir/.extracao_da_pagina.txt | egrep '^<h1><a href="/artigo/' | sed 's/^[\<h1\>\<a\ href\="]*[/]//; s/[">].*$//' >> $dir/.links.txt
- done
- # Pega o número de linhas do arquivo ".links.txt", ou seja, o número de artigos que o autor tem!
- num_de_artigos=$(awk '{x++} END {print x}' $dir/.links.txt)
- echo
- echo "Artigos encontrados:"
- echo
- sleep 2
- # Lista os artigos
- cat $dir/.links.txt | sed 's/^artigo\///g' | sed 's/.$//'
- echo
- echo "$login publicou $num_de_artigos artigos no Viva o Linux."
- sleep 5
- # Salvando os artigos:
- # loop para salvar artigos um por um.
- for ((i=1;i<=$num_de_artigos;i++)); do
- # seleciona uma a uma as linhas do arquivo ".links.txt", quer dizer...
- # seleciona um por um o artigo que será salvo
- caminho=$(head -$i $dir/.links.txt | tail -1)
- # /artigo/nome-do-artigo/
- # fica: nome-do-artigo
- nome_artigo=$(echo $caminho | sed 's/^artigo\///g' | sed 's/.$//')
- echo "Preparando-se para salvar o artigo número $i de um total de $num_de_artigos artigos... "
- sleep 5
- x=1 # número da página do artigo, começa sempre na primeira (1)
- proxima_pagina=sim # por padrão considera que o artigo tem a próxima página
- # Loop para repetir o procedimento em cada página do artigo
- while [ "$proxima_pagina" = 'sim' ]; do
- echo "Salvando página $x..."
- sleep $sleeptime
- # Joga o conteúdo da página do artigo para extração
- curl --silent "http://www.vivaolinux.com.br/$caminho?pagina=$x" > $dir/.extracao_da_pagina2.txt
- # Aqui começa a extração das informações...
- # Título do artigo
- titulo_artigo=$(cat $dir/.extracao_da_pagina2.txt | egrep '^<title>' | sed 's/<title>Linux://g' | sed 's/<.title>//g')
- # Descrição do artigo
- descricao_artigo=$(cat $dir/.extracao_da_pagina2.txt | egrep '^<meta name="description" content="' | sed 's/<meta name="description" content="//g' | sed 's/">//g')
- # Conteúdo que será o corpo da página html
- cat $dir/.extracao_da_pagina2.txt | sed '1,/^<div id=HOTWordsTxt name=HOTWordsTxt>/ d' | sed '/^<span class="floatleft"/,$ d' >> $dir/.corpo_html.txt
- # Incrementa $x (número da página) para passar para a próxima página do artigo (loop)
- let x++
- proxima_pagina=nao # para sair do loop
- # Mas caso exista outra página (linha de código abaixo verifica isso) valor muda para "sim" e o loop continua.
- grep -qs 'gina >></a></span>' $dir/.extracao_da_pagina2.txt && proxima_pagina=sim
- done
- # Criação da página HTML:
- # Joga o conteúdo que vai ser o corpo da página HTML na variável $corpo_html
- # Sendo que faz isso dando uma organizada no conteúdo.
- # Por exemplo: colocanado quebras de linhas para separar as imagens dos textos.
- # Lembrando que pode não funcionar algumas vezes devido a formatação do moderador.
- corpo_html=$(cat $dir/.corpo_html.txt | sed 's/><\/div>/><\/div><br\/><br\/>/g' | sed 's/^<div /<br\/><br\/><div /g')
- # Cria a página HTML
- echo "<HTML><HEAD><TITLE> $nome_artigo </TITLE></HEAD><BODY> <h1>$titulo_artigo</h1> <br/><br/> Autor: <em>$login (www.vivaolinux.com.br/~$login) <br/><br/> <strong>$descricao_artigo</strong> </em> <br/><br/> $corpo_html </BODY></HEAD>" > $dir2/HTML/$nome_artigo.html
- # Converte para PDF
- echo "Convertendo artigo para PDF..."
- wkhtmltopdf -q $dir2/HTML/$nome_artigo.html $dir2/PDF/$nome_artigo.pdf
- echo "Feito!"
- echo "Artigo salvo!"
- echo
- # Apaga arquivo descartável que recebeu o corpo da página HTML para receber conteúdo de outra página
- rm $dir/.corpo_html.txt
- done
- echo Os artigos foram movidos para $dir2!
- echo "IMPORTANTE: os arquivos convertidos em PDF podem apresentar defeitos devido limitações do KwHTMLtoPDF!"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement