Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # anta.sh -- puxa artigos da homepage de <oantagonista.com>
- # v0.10.41 mar/2020 by mountaineerbr
- #padrões
- #intervalo de tempo entre reacessos da opt '-r':
- TEMPO=(6m 3${RANDOM: -1})
- #TEMPO=
- #curl e wget connection-timeout
- #timeout
- TOUT=30
- #retries
- RETRIES=4
- #tentativas do script
- TENTATIVAS=6
- #obs: além das tentativas do curl/wget
- #debug log file:
- LOGF=/tmp/anta.log
- #caminho do script para funão de auto-update
- SCRIPT="${BASH_SOURCE[0]}"
- #Ref tapir art: http://www.ascii-art.de/ascii/t/tapir.txt
- HELP="Anta.sh -- Puxa os artigos de <oantagonista.com>
- _,.,.__,--.__,-----.
- ,\"\" ')) \`.
- ,' e ))
- ( .='__, ,
- \`~\` \`-\ /._____,/ /
- | | ) ( ( ;
- | | | / / / /
- vvVVvvVvVVVvvVVVvvVVvVvvvVvPhSv
- SINOPSE
- anta.sh [-f] [INDEX|URL]
- anta.sh [-f] [-NUM|-pNUM]
- anta.sh -r [-sNUM]
- anta.sh [-huuv]
- Este script puxa os textos resumidos e integrais dos artigos do site
- <www.oantagonista.com>. Por padrão, se nenhuma opção for inserida, o
- script puxará a primeira páginas inicial com os resumos dos artigos e
- sairá. A opção '-pNUM' ou somente '-NUM' configura quantas páginas ini-
- ciais devem ser puxadas.
- O texto integral dos artigos pode ser recuperado com a opção '-f'. Com
- esta opção, também pode-se especificar URLs de artigos específicos.
- O número de INDEX de uma página inicial de <oantagonista.com> correspon-
- de a ordem cronológica da mais recente para a mais antiga. Assim, a pá-
- gina mais recente tem o número de INDEX igual a '1'. É possível puxar
- uma única página específica na ordem cronológica, como por exemplo a dé-
- cima página mais recente. Para isso, passe um único número de INDEX ao
- script.
- A opção '-r' faz um reacesso da primeira página inicial e puxa os resu-
- mos dos artigos a cada ~${TEMPO[*]} segundos. O intervalo de tempo entre
- reacessos pode ser definido por '-sNUM', em que NUM é um número natural
- em segundos, ou '-s \"NUMm\"', sendo 'm' para minutos, sendo aceitos os
- argumentos comumente passados ao comando 'sleep' para esta opção.
- Ao final da realização de trabalhos, será impresso a data e hora e, em
- seguida, alguns números. Os números entre parenteses, quando se utiliza
- a opção '-r', são o intervalo de tempo entre reacessos. Nos demais modos,
- será impresso entre colchetes o tempo de realização da tarefa em segundos.
- Em casos mais específicos, como fazer o download de um grande volume de
- páginas, pode-se ajustar o tempo de 'timeout' e de retentativas na cabe-
- ça do código-fonte deste script.
- LIMITES DE ACESSO
- Nos termos de uso do próprio site, há somente uma limitação:
- << 2.2.1. Você se compromete a não utilizar qualquer sistema automatiza-
- do, inclusive, mas sem se limitar a 'robôs', 'spiders' ou 'offline
- readers,' que acessem a Plataforma de maneira a enviar mais mensagens
- de solicitações aos servidores do site O Antagonista em um dado período
- de tempo do que seja humanamente possível responder no mesmo período a-
- través de um navegador convencional. >>
- <https://www.oantagonista.com/termos-de-uso>, acesso em set/2019.
- GARANTIA E REQUISITOS
- Este programa é software livre e está licenciado sob a GNU GPL versão 3
- ou superior e é oferecido sem suporte ou correção de bugs.
- Pacotes requeridos: Bash, cURL e/ou Wget. É recomendável instalar ambos
- cURL e Wget caso encontre bloqueios de limites de acesso do servidor.
- Se achou o script útil, conside me mandar um trocado! =)
- bc1qlxm5dfjl58whg6tvtszg5pfna9mn2cr2nulnjr
- BUGS
- Algumas sobreposições do texto com mensagens de carregamento eviadas
- pelo stderr.
- A opção para puxar artigos integrais das páginas inciais pode puxar o
- mesmo artigo em duplicata.
- EXEMPLOS DE USO
- ( 1 ) Puxar as primeiras quatro páginas iniciais do portal:
- $ anta.sh -p4
- $ anta.sh -4
- ( 2 ) Reacesar a página inicial a cada 10 minutos:
- $ anta.sh -r -s'10m'
- $ anta.sh -r -s600 #10m = 600 segundos
- ( 3 ) Textos completos dos artigos das primeiras 4 páginas do portal:
- $ anta.sh -f -p4
- Dica: use o paginador Less:
- $ anta.sh -f4 | less
- ( 4 ) Puxar artigos completos das URLs (neste caso, '-f' é opcional):
- $ anta.sh -f '/brasil/toffoli-nega-ter-recebido-e-acessado-relatorios-do-coaf/'
- $ anta.sh '/brasil/o-que-o-congresso-ressuscitou-na-lei-de-abuso-de-autoridade/' 'https://www.oantagonista.com/brasil/o-que-o-congresso-ressuscitou-na-lei-de-abuso-de-autoridade/'
- ( 5 ) Puxar artigos pelo número de INDEX de uma página específica:
- $ anta.sh 12512 #somente resumos dos artigos
- $ anta.sh -f 12512 #artigos integrais
- OPÇÕES
- -NUM Mesmo que opção '-p'.
- -d Debug, registra em /tmp/anta.log e anta.linksf.log.
- -f [INDEX|URLs]
- Texto integral dos artigos das páginas iniciais.
- -h Mostra esta ajuda.
- -p [NUM] Número de páginas a serem puxadas; padrão=1.
- -r Reacessar a página inicial em intervalos de tempo.
- -s [NUM] Intervalo de tempo entre reacessos da opção '-r'; aceita 'NUMm'
- para minutos e 'NUMs' para segundos; padrão~=240.
- -u Checar por atualização do script.
- -uu Auto-atualização do script.
- -v Mostra a versão do script."
- #Orign servers
- SERVERS=('www.oantagonista.com' 'cache.oantagonista.com' 'cms.oantagonista.com' 'm.oantagonista.com' 'wp.oantagonista.com' 'editores.oantagonista.com')
- #'oantagonista.com' -- redirect to antagonista+
- #'52.204.39.109'
- #'3.82.68.200'
- #'18.204.255.62'
- #'52.72.53.233'
- #'34.198.178.99'
- #'54.210.110.10'
- #'52.86.216.106'
- #'34.207.47.120'
- #'18.214.96.27'
- AGENTS=('User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)' 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1' 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41' 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36' 'User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; SGP771 Build/32.2.A.0.253; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.9[<0;45;17M8 Safari/537.36' 'User-Agent: Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; RM-1127_16056) AppleWebKit/537.36(KHTML, like Gecko) Chrome/42.0.2311.135 Mobile Safari/537.36 Edge/12.10536' 'User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; SGP771 Build/32.2.A.0.253; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Safari/537.36' 'User-Agent: Mozilla/5.0 (Linux; Android 7.0; SM-G892A Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.107 Mobile Safari/537.36' 'user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36' 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586' 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0' 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko' 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0' 'user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36')
- ## Funções
- # Filtro HTML e tradução de códigos
- #https://ascii.cl/htmlcodes.htm
- sedhtmlf() { sed -e 's/<\/div><\/span><p>/\n /g' -e 's/<\/time><div>/\n /g' -e 's/<\/time><\/span><p>/\n /g' -e 's/ga(".*//g' -e 's/window\._.*;//g' -e 's/<\/p><p class="paragraph-text.*<\/span><\/p><p>/\n/g' -e 's/<p>/&\n/g' -e 's/<br\/><br\/>/&\n/g' -e 's/<[^>]*>//g' -e 's/\r//g' -e 's/\xc2\xa0/ /g' -e 's/ / /g' -e 's/—/--/g' -e 's/ / /g' -e 's/!/\!/g' -e 's/"/\"/g' -e 's/#/\#/g' -e 's/$/$/g' -e 's/%/%/g' -e 's/&/\&/g' -e "s/'/'/g" -e 's/(/(/g' -e 's/)/)/g' -e 's/*/*/g' -e 's/+/+/g' -e 's/,/,/g' -e 's/-/-/g' -e 's/././g' -e 's///\//g' -e 's/@/@/g' -e 's/–/-/g' -e 's/—/--/g' -e "s/‘/'/g" -e "s/X’/'/g" -e 's/‚/,/g' -e 's/“/\"/g' -e 's/”/\"/g' -e 's/„/\"/g' -e 's/…/.../g' -e 's/€/EUR/g' -e 's/&/\&/g' -e 's/ / /g' -e 's/!/\!/g' -e 's/"/\"/g' -e 's/#/\#/g' -e 's/$/$/g' -e 's/%/%/g' -e 's/&/\&/g' -e "s/'/'/g" -e 's/(/(/g' -e 's/)/)/g' -e 's/*/*/g' -e 's/+/+/g' -e 's/,/,/g' -e 's/-/-/g' -e 's/././g' -e 's///\//g' -e 's/@/@/g' -e 's/–/–/g' -e 's/—/—/g' -e 's/‘/‘/g' -e 's/’/’/g' -e 's/‚/‚/g' -e 's/“/“/g' -e 's/”/”/g' -e 's/„/„/g' -e 's/†/†/g' -e 's/‡/‡/g' -e 's/•/•/g' -e 's/…/…/g' -e 's/‰/‰/g' -e 's/€/€/g' -e 's/™/™/g';}
- # Check for errors
- cerrf()
- {
- if grep -Fq -e 'Você será redirecionado para a página inicial' -e 'Page not found' <<< "${PAGE}"; then
- printf 'Página não encontrada -- %s.\n' "${COMP}" 1>&2
- exit 1
- elif [[ -z "${PAGE}" ]] || grep -Fiq -e 'has been limited' -e 'you were blocked' \
- -e 'to restrict access' -e 'access denied' -e 'temporarily limited' \
- -e 'you have been blocked' -e 'has been blocked' -e 'Error processing request' <<< "${PAGE}"; then
- return 1
- elif ! grep -q '[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]' <<< "${PAGE}"; then
- return 1
- fi
- return 0
- }
- # Cheque por update
- updatef() {
- #check version of this script
- VER_0="$(grep -Fm1 '# v' "${SCRIPT}")"
- #check upstream version
- CODE="$(${UPAPP[0]} "https://raw.githubusercontent.com/mountaineerbr/scripts/master/anta.sh")"
- VER_1="$(grep -Fm1 '# v' <<<"${CODE}")"
- #check script versions
- if [[ "${VER_1}" != "${VER_0}" ]]; then
- if [[ "${UPOPT}" -eq 1 ]]; then
- printf "Atualização disponível. Passe \'-uu\' para atualizar.\n"
- printf '<https://github.com/mountaineerbr/scripts/blob/master/anta.sh>\n'
- else
- printf '%s\n' "${CODE}" > "${SCRIPT}"
- fi
- else
- printf 'O script está atualizado.\n'
- fi
- exit
- }
- # Puxar páginas iniciais e testar por erros;
- #tamanho: até ~2020 =~ 650KB; mar/2020 = 34KB, compressed 8.7KB
- puxarpgsf() {
- # Se for só uma página inicial, acesse site sem subdominios (evita bloqueios)
- [[ "${PAGINAS}" -eq 1 ]] && [[ -z "${FULLOPT}" ]] && COMP='/'
- # Tentar puxar quantas páginas iniciais quiser e testar por erros
- N=2;while [[ "${N}" -le "$((TENTATIVAS))" ]]; do
- #puxar a página
- PAGE="$(${YOURAPP[${RANDOM} % ${#YOURAPP[@]}]} "${AGENTS[${RANDOM} % ${#AGENTS[@]}]}" "${SERVERS[${RANDOM} % ${#SERVERS[@]}]}/${COMP#/}")"
- #debug, código da página
- [[ -n "${DEBUG}" ]] && printf -- '>>> PAGE\n%s\n\n' "${PAGE}" >> "${LOGF}"
- #checar por erro
- cerrf && return 0
- #havendo erro, chamar curl mais uma vez
- printf 'Tentativa %s \r' "${N}" 1>&2
- #aumentar um no contador
- ((N++))
- #debug, n tentativas
- [[ -n "${DEBUG}" ]] && printf -- '>>> Tentativa: %s\n\n' "${N}" >> "${LOGF}"
- sleep 5
- done
- # Check if it was succesfull at last or exit with error
- cerrf && return 0 || return 1
- }
- # Pegar os textos curtos das Página(s) Inicial(is)
- anta() {
- #timer de tempo de tarefa
- SECONDS=0
- # O for loop para pegar quantas páginas quiser
- for ((i=PAGINAS;i>=1;i--)); do
- #barra de acompanhamento
- printf 'Página %s/%s \r' "${i}" "${PAGINAS}" 1>&2
- #debug, ref das páginas baixadas
- [[ -n "${DEBUG}" ]] && printf -- '>>> Página: %s / %s\n\n' "${i}" "${PAGINAS}" >> "${LOGF}"
- #puxar a página
- COMP="/pagina/${i}/"
- if ! puxarpgsf; then
- printf '\nAcesso limitado. [%s]\n' "${SECONDS}" 1>&2
- [[ -z "${ROLLOPT}" ]] && exit 1
- fi
- #cópia de links
- LINKS2="$(grep -Fi 'data-link=' <<< "${PAGE}" | sed -e 's/\(^.*data-link="\)\(.*\)\(" .*$\)/\2/')"
- #print links
- tac <<< "${LINKS2}"
- printf '===\n'
- #imprime a página e processa
- sedhtmlf <<< "${PAGE}" | grep --group-separator='===' --color=never -B10 -A4 -e '[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9] ' | sed -e '$s/$/\n===\n/' -e '/^Ver mais.*/d' -e 's/^\s\s*//g' | tac -rs'^===' | awk NF
- #also works: grep -F -B13 '<p>' <<<"$PAGE" | sedhtmlf | awk NF
- #parar se foi especificado número de index de pg específica
- [[ -n "${ONLYONE}" ]] && return 0
- done
- #hora que terminou
- [[ -n "${ROLLOPT}" ]] && PRINTT="(${TEMPO[*]})"
- printf 'Puxado em %s. %s [%s]\n' "$(date)" "${PRINTT}" "${SECONDS}"
- }
- # -r Anta Rolante
- antaroll() {
- #set to first page
- PAGINAS=1
- XAGAIN=780
- AGAIN="${XAGAIN}"
- while :; do
- # Loop para puxar as notícias
- while :; do
- anta || break
- sleep "${TEMPO[@]}"
- done
- #grand retry timer
- ((AGAIN>=1800)) && AGAIN="${XAGAIN}"
- AGAIN="$((AGAIN+180))"
- #grand retry
- printf 'Aguardando %s minutos..\n' "$((AGAIN/60))" 1>&2
- sleep "${AGAIN}"
- done
- }
- # -f Artigos inteiros
- fulltf() {
- #ver se notícia é do MoneyTimes
- if grep -Fiq 'moneytimes/' <<< "${COMP}"; then
- printf 'Notícia do <moneytimes.com.br>.\n'
- printf '%s\n' "${COMP}"
- printf '====\n'
- return 0
- else
- #puxa página do artigo texto integral
- if ! puxarpgsf; then
- printf '\nAcesso limitado. [%s]\n' "${SECONDS}" 1>&2
- exit 1
- fi
- fi
- {
- #cabeçalho
- grep -Fe '="entry-title' -e 'entry-date published' <<<"${PAGE}"
- #processa página
- grep '^\s*<p>' <<<"${PAGE}"
- } | sedhtmlf | sed -Ee 's/^(\t|\b|\s)*//g' -e '/^$/d' -e 's/\s\s*/ /g'
- #-e 's/ga(.*);//g'
- #print link
- printf '%s\n' "${COMP}"
- printf '====\n'
- return 0
- }
- # Puxar links das páginas inciais para os artigos completos
- linksf() {
- #timer de tempo execução de tarefa
- SECONDS=0
- # Check for user-suppplied links
- if [[ ${*} = */* ]]; then
- for i in ${@}; do
- # Arrumar variável para passar nos testes da 'puxarpgsf'
- PAGINAS=0
- COMP="${i,,}"
- COMP="${COMP/https:\/\/www.oantagonista.com}"
- fulltf
- done
- else
- # Get Links from initial pages
- for ((i=PAGINAS;i>=1;i--)); do
- #barra de acompanhamento
- printf 'Links %s/%s \r' "${i}" "${PAGINAS}" 1>&2
- #prepara o link da página inicial a ser puxada
- export COMP="/pagina/${i}/"
- #puxa pgs iniciais
- puxarpgsf
- #pega links para artigos integrais
- LINKS="$(grep -Fi 'data-link=' <<< "${PAGE}" | sed -e 's/\(^.*data-link="\)\(.*\)\(" .*$\)/\2/')"
- #debug, dump links
- [[ -n "${DEBUG}" ]] && printf -- '>>> Links:\n%s\n\n' "${LINKS}" >> "${LOGF}"
- #crawl each
- for COMP in $(tac <<< "${LINKS//https:\/\/www.oantagonista.com/}"); do
- fulltf
- #sleep 1
- done
- #parar se foi especificado número de index de pg específica
- [[ -n "${ONLYONE}" ]] && return 0
- done
- #hora que terminou tarefa
- printf 'Puxado em %s. [%s]\n' "$(date)" "${SECONDS}"
- fi
- }
- # Test if cURL and Wget are available
- if command -v curl &>/dev/null; then
- YOURAPP=("curl --compressed -s --retry ${RETRIES} --connect-timeout ${TOUT} -L -b non-existing -H")
- UPAPP=('curl -s')
- fi
- if command -v wget &>/dev/null; then
- YOURAPP+=("wget -t${RETRIES} -T${TOUT} -qO- --header")
- UPAPP+=('wget -qO-')
- elif [[ -z "${YOURAPP[*]}" ]]; then
- printf 'Requer cURL e/ou Wget.\n' 1>&2
- exit 1
- fi
- #########################################################AQUI###########################################################
- ## Parse options
- while getopts ':dfwhp:rs:uv0123456789' opt; do
- case ${opt} in
- ( [0-9] )
- # Páginas para Puxar
- PAGINAS="${PAGINAS}${opt}"
- ;;
- ( d )
- # Debugging, manter dump de dados
- DEBUG=1
- printf '>>> Date: %s\n\n' "$(date)" >> "${LOGF}"
- ;;
- ( f|w )
- # Textos completos (Full text)
- FULLOPT=1
- ;;
- ( h )
- # Show Help
- printf '%s\n' "${HELP}"
- exit 0
- ;;
- ( p )
- # Páginas para Puxar
- PAGINAS="${OPTARG}"
- ;;
- ( r )
- # Anta Rolante
- ROLLOPT=1
- ;;
- ( s )
- #tempo entre reacessos
- TEMPO=(${OPTARG})
- ;;
- ( u )
- # Checar update
- [[ -z "${UPOPT}" ]] && UPOPT=1 || UPOPT=2
- ;;
- ( v )
- # Version of Script
- grep -Fm1 '# v' "${BASH_SOURCE[0]}"
- exit 0
- ;;
- ( \? )
- # Invalid opt
- printf 'Opção inválida: -%s' "${OPTARG}" 1>&2
- exit 1
- ;;
- esac
- done
- shift $((OPTIND -1))
- ## Mais testes
- #padrão é uma página
- PAGINAS="${PAGINAS:-1}"
- #usar opção -f se especificar uma URL
- if [[ ${*} = */* ]]; then
- printf 'Link detectado!\r' 1>&2
- FULLOPT=1
- unset ROLLOPT
- #pegar só uma página por número
- elif [[ ${1} = [0-9]* ]]; then
- printf 'Index detectado!\r' 1>&2
- PAGINAS="${1}"
- ONLYONE=1
- unset ROLLOPT
- fi
- #desmarcar opções incompatíveis
- if [[ -n "${ROLLOPT}" ]] && [[ "${PAGINAS}" -gt 1 ]]; then
- PAGINAS=1
- fi
- ## Puxar funções das opções
- #opção -f, textos completo
- if [[ -n "${FULLOPT}" ]]; then
- linksf "${@}"
- #opção -r, anta rolante
- elif [[ -n "${ROLLOPT}" ]]; then
- antaroll
- #opção de checagem por atualização do script
- elif [[ -n "${UPOPT}" ]] ; then
- updatef
- else
- #opção padrão, puxar primeira pg e sair
- anta
- fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement