Advertisement
xerxeslins

Backup dos artigos do VOL

Jan 25th, 2015
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 9.53 KB | None | 0 0
  1. #!/bin/sh
  2. #---------------------------------------------------------------------------------
  3. #
  4. # volbackup.sh
  5. #
  6. # Versão 1.0 beta
  7. #
  8. # Script usado para salvar todos os artigos de um usuário
  9. # do site Viva o Linux - www.vivaolinux.com.br
  10. #
  11. #
  12. #
  13. # *** precisa do wkhtmltopdf instalado ***
  14. #
  15. #
  16. # Por Xerxes Lins
  17. # Contato: http://www.vivaolinux.com.br/~xerxeslins
  18. #
  19. # Recife, 21 de janeiro de 2013
  20. #---------------------------------------------------------------------------------
  21. #
  22. #
  23. # Tem como entrada o nome de um usuário do Viva o linux, busca seus artigos,
  24. # salva-os em HTML e em PDF.
  25. #
  26. # A conversão para PDF pode gerar arquivos com defeito devido limitações do
  27. # software WkHTMLtoPDF.
  28. #
  29. # O sistema Ubuntu usa DASH ao invés de BASH, por isso antes de executar este
  30. # script, caso use Ubuntu, use primeiro o comando:
  31. #
  32. # $ sudo dpkg-reconfigure dash
  33. #
  34. # E quando perguntado se deseja usar o DASH responda NÃO.
  35. # Depois disso pode usar o script no Ubuntu sem problemas.
  36. #
  37. # Torne o script executável:
  38. # $ chmod +x volbackup.sh
  39. #
  40. # Execute:
  41. # $ sh ./volbackup
  42. #
  43. #
  44. #---------------------------------------------------------------------------------
  45. #
  46. #
  47. #
  48. # Histórico:
  49. #
  50. # versão 1.0b (2013-21-01)
  51. # versão 1.1b (2013-12-02)
  52. #
  53. # * corrigido o bug de dizer onde movia os artigos ($dir2 e não $dir)
  54. # * adicionado aviso para trocar DASH por BASH para quem usa Ubuntu
  55. #
  56. # Licença: GPL
  57. #
  58. #
  59. #---------------------------------------------------------------------------------
  60.  
  61.  
  62.  
  63. dir=~/.volbackup   # define o diretório onde ocorrerão os procedimentos do script
  64. dir2=~/artigos_vol   # diretório onde os artigos serão salvos
  65. sleeptime=10      # tempo padrão do comando "sleep" antes de usar o comando "curl" (para evitar flood)
  66.  
  67.  
  68. # Criação dos diretórios principais:
  69.  
  70. # Caso o diretório $dir exista, ele será REcriado.
  71. # Se não, ele será criado.
  72. if [ -d "$dir" ]; then  
  73.   rm -rf "$dir"
  74.   mkdir "$dir"  
  75. else
  76.   mkdir "$dir"  
  77. fi
  78.  
  79.  
  80. # Caso o diretório $dir2 exista, ele será REcriado.
  81. # Se não, ele será criado.
  82. # Inclui subdiretórios (HTML e PDF)
  83. if [ -d "$dir2" ]; then
  84.   rm -rf "$dir2"
  85.   mkdir $dir2
  86.   mkdir $dir2/PDF
  87.   mkdir $dir2/HTML  
  88. else
  89.   mkdir $dir2
  90.   mkdir $dir2/PDF
  91.   mkdir $dir2/HTML
  92. fi
  93.  
  94.  
  95. # Buscar pelo usuário do qual se quer fazer o backup:
  96.  
  97. # Pergunta o nome do usuário
  98. clear
  99. echo "Deseja salvar os artigos de que usuário?"
  100. echo
  101. read entrada
  102. clear
  103.  
  104. # Da entrada do usuário acima pega-se apenas a primeira palavra
  105. # Ex.:
  106. # Se o usuário digitar "Xerxes Lins"
  107. # Será usado apenas "Xerxes"
  108. login=$(echo " $entrada " | awk '{print $1;}')
  109.  
  110. # Um alerta sobre o usuário removido
  111. if [ $login = "removido" ]; then
  112.   echo "Usuário removido herda TODOS os artigos dos usuários que foram removidos, ou seja, são muitos artigos!"
  113.   echo "Para continuar, pressione Enter. Para sair use Ctrl+C."
  114.   read tecla_user
  115. fi
  116.  
  117. echo "Buscando usuário $login no Viva o Linux..."
  118.  
  119. # Define o endereço completo da página do usuário do qual será feito a cópia dos artigos
  120. pagina_do_usuario=http://www.vivaolinux.com.br/~$login
  121.  
  122. # Arquivo descartável para verificar se o usuário existe no Viva o Linux
  123. FILE=$dir/.saida_usuario.txt
  124.  
  125. # Joga a saída do Curl no arquivo descartável definido acima
  126. curl --silent $pagina_do_usuario > $FILE
  127.  
  128.  
  129. # Se encontrar o usuário (ou seja, se o $FILE não for vazio), o script continua, se não ele encerra.
  130. if [[ -s $FILE ]] ; then
  131.   echo "Usuário $login encontrado."
  132.   sleep 2
  133.   else
  134.     echo "Usuário não encontrado!"
  135.     sleep 1
  136.     echo "Saindo..."
  137.     exit 1
  138. fi ;
  139.  
  140.  
  141. # Quantas páginas há no índice de artigos do usuário?
  142.  
  143. # Arquivo descartável para verificar se o usuário publicou artigos
  144. FILE=$dir/.saida_indice.txt
  145.  
  146. curl --silent "http://www.vivaolinux.com.br/artigos/userview.php?login=$login" > $FILE
  147.  
  148. tem_artigo=$(cat $FILE | grep '<tr><td><b>Nenhum artigo foi encontrado.</b></td></tr>')
  149.  
  150. # Se não achar o índice de artigos, encerra o programa
  151. if [[ -z $tem_artigo ]] ; then
  152.   echo "$login publicou artigos no Viva o Linux!"
  153.   sleep 2
  154.   else
  155.     echo "Usuário $login não publicou artigos no Viva o Linux."
  156.     sleep 1
  157.     echo "Saindo..."
  158.     exit 1
  159. fi ;
  160.  
  161. # Captura da página do índice, as linhas referentes às opções de páginas
  162. # (vai capturar todas menos uma, a SELECTED)
  163. echo "Aguarde enquanto dados são coletados..."
  164. sleep $sleeptime
  165. 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
  166.  
  167. # Conta quantas linhas tem no arquivo saida_indice.txt
  168. num_pag=$(awk '{x++} END {print x}' $FILE)
  169.  
  170.  
  171.  
  172. # Incrementa 1 à contagem para ficar certo já que
  173. # A primeira linha sempre é excluída
  174. let num_pag++
  175.  
  176. # Pega da última linha do arquivo, o útimo numero da página
  177. # que corresponde ao total de páginas do índice de artigos
  178. #num_pag=$(cat $dir/saida_indice.txt | tail -1 | sed 's/<.*>//g')
  179.  
  180. #num_pag=1 # Define outro número de páginas para fins de teste
  181.  
  182.  
  183. # Listar todos os artigos:
  184.  
  185. # Loop para verificar em cada uma das páginas do índice
  186. for ((i=1;i<=$num_pag;i++)); do
  187.  
  188.  
  189.   echo "Coletando informações da página $i de $num_pag do índice de artigos de $login..."
  190.  
  191.  
  192.   # Extrai o conteúdo da página do índice e joga em ".extração_da_pagina.txt"
  193.   # para poder "garimpar" os links depois
  194.   sleep $sleeptime
  195.   curl --silent "http://www.vivaolinux.com.br/artigos/userview.php?login=$login&&pagina=$i" > $dir/.extracao_da_pagina.txt
  196.  
  197.  
  198.  
  199.   # Garimpando os links...
  200.   # Este comando extrai todos os links dos artigos de dentro do arquivo ".extração_da_pagina.txt"
  201.   # E envia para o arquivo ".links" para criar uma lista com todos os links
  202.   cat $dir/.extracao_da_pagina.txt | egrep '^<h1><a href="/artigo/' | sed 's/^[\<h1\>\<a\ href\="]*[/]//; s/[">].*$//' >> $dir/.links.txt
  203. done
  204.  
  205. # Pega o número de linhas do arquivo ".links.txt", ou seja, o número de artigos que o autor tem!
  206. num_de_artigos=$(awk '{x++} END {print x}' $dir/.links.txt)
  207.  
  208. echo
  209. echo "Artigos encontrados:"
  210. echo
  211. sleep 2
  212.  
  213. # Lista os artigos
  214. cat $dir/.links.txt | sed 's/^artigo\///g' | sed 's/.$//'
  215. echo
  216. echo "$login publicou $num_de_artigos artigos no Viva o Linux."
  217. sleep 5
  218.  
  219.  
  220. # Salvando os artigos:
  221.  
  222. # loop para salvar artigos um por um.
  223. for ((i=1;i<=$num_de_artigos;i++)); do
  224.  
  225.  
  226.  
  227.   # seleciona uma a uma as linhas do arquivo ".links.txt",  quer dizer...
  228.   # seleciona um por um o artigo que será salvo
  229.   caminho=$(head -$i $dir/.links.txt | tail -1)
  230.  
  231.  
  232.    
  233.   # /artigo/nome-do-artigo/
  234.   # fica: nome-do-artigo
  235.   nome_artigo=$(echo $caminho | sed 's/^artigo\///g' | sed 's/.$//')
  236.    
  237.  
  238.  
  239.   echo "Preparando-se para salvar o artigo número $i de um total de $num_de_artigos artigos... "
  240.   sleep 5
  241.  
  242.  
  243.   x=1 # número da página do artigo, começa sempre na primeira (1)  
  244.   proxima_pagina=sim # por padrão considera que o artigo tem a próxima página  
  245.  
  246.  
  247.  
  248.   # Loop para repetir o procedimento em cada página do artigo
  249.   while [ "$proxima_pagina" = 'sim' ]; do
  250.  
  251.     echo "Salvando página $x..."
  252.     sleep $sleeptime
  253.  
  254.     # Joga o conteúdo da página do artigo para extração
  255.     curl --silent "http://www.vivaolinux.com.br/$caminho?pagina=$x" > $dir/.extracao_da_pagina2.txt
  256.    
  257.    
  258.     # Aqui começa a extração das informações...
  259.  
  260.     # Título do artigo
  261.     titulo_artigo=$(cat $dir/.extracao_da_pagina2.txt | egrep '^<title>' | sed 's/<title>Linux://g' | sed 's/<.title>//g')
  262.  
  263.     # Descrição do artigo
  264.     descricao_artigo=$(cat $dir/.extracao_da_pagina2.txt | egrep '^<meta name="description" content="' | sed 's/<meta name="description" content="//g' | sed 's/">//g')
  265.    
  266.     # Conteúdo que será o corpo da página html  
  267.     cat $dir/.extracao_da_pagina2.txt | sed '1,/^<div id=HOTWordsTxt name=HOTWordsTxt>/ d' | sed '/^<span class="floatleft"/,$ d' >> $dir/.corpo_html.txt
  268.  
  269.     # Incrementa $x (número da página) para passar para a próxima página do artigo (loop)
  270.     let x++
  271.    
  272.     proxima_pagina=nao # para sair do loop
  273.    
  274.     # Mas caso exista outra página (linha de código abaixo verifica isso) valor muda para "sim" e o loop continua.    
  275.     grep -qs 'gina >></a></span>' $dir/.extracao_da_pagina2.txt && proxima_pagina=sim
  276.    
  277.    
  278.  
  279.   done
  280.  
  281.  
  282. # Criação da página HTML:
  283.  
  284.   # Joga o conteúdo que vai ser o corpo da página HTML na variável $corpo_html
  285.   # Sendo que faz isso dando uma organizada no conteúdo.
  286.   # Por exemplo: colocanado quebras de linhas para separar as imagens dos textos.
  287.   # Lembrando que pode não funcionar algumas vezes devido a formatação do moderador.
  288.   corpo_html=$(cat $dir/.corpo_html.txt | sed 's/><\/div>/><\/div><br\/><br\/>/g' | sed 's/^<div /<br\/><br\/><div /g')
  289.  
  290.   # Cria a página HTML
  291.   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
  292.  
  293.   # Converte para PDF
  294.   echo "Convertendo artigo para PDF..."
  295.   wkhtmltopdf -q $dir2/HTML/$nome_artigo.html $dir2/PDF/$nome_artigo.pdf
  296.   echo "Feito!"
  297.   echo "Artigo salvo!"
  298.   echo
  299.  
  300.   # Apaga arquivo descartável que recebeu o corpo da página HTML para receber conteúdo de outra página
  301.   rm $dir/.corpo_html.txt
  302.  
  303. done
  304.  
  305. echo Os artigos foram movidos para $dir2!
  306. 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