From 4eda6fc2977bbd6e6b366c98481c0b269cb4a046 Mon Sep 17 00:00:00 2001 From: Bruno Alphonsus de Oliveira Nascimento Date: Fri, 18 Sep 2020 12:48:57 -0300 Subject: [PATCH] =?UTF-8?q?Corre=C3=A7ao=20de=20bug=20de=20SSL=20e=20Atual?= =?UTF-8?q?iza=C3=A7ao=20do=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 ++++ README.md | 26 +++++++++++++++++++++++++- classes.py | 7 ++++--- 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..12f8598 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +__pycache__/ +doufinder.cfg +downloads + diff --git a/README.md b/README.md index 8c23f7c..7ab5a03 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,9 @@ Script que pesquisa no Diário Oficial da União termos de interesse e notifica - urllib3 - mailer - chardet (pdfminer) +- certifi -`pip install pdfminer.six urllib3 mailer chardet` +`pip install pdfminer.six urllib3 mailer chardet certifi` ## Utilização @@ -60,3 +61,26 @@ Sem estes parâmetros não é possível o envio das ocorrências aos interessado O parâmetro `DOWNLOAD_DIR` é necessário para que a função de pesquisa offline funcione. +## ERRO DE CERTIFICADO + +Recentemente, o acesso às páginas do jornal do diário oficial foi convertido +para HTTPS. A cadeia de certificados usada para o host `pesquisa.in.gov.br` +não está incluida nos certificados do sistema operacional (pode ser que esteja +incluída nos certificados do browser). Desta forma, o python não consegue +validar o certificado fornecido pelo resultado do "request". + +Para contornar o problema, é necessário incluir a cadeia de certificados de +https://pesquisa.in.gov.br no arquivo ca-cert.pem utilizado pelo python: + 1. Acesse pelo browser a url [https://pesquisa.in.gov.br](https://pesquisa.in.gov.br) + 2. Extraia a cadeia de certificados + 3. Abra um shell python e execute os seguintes comantes: + a. ```python import certifi``` + b. ```python certifi``` + c. ```python print(certifi.where())``` + 4. O resultado deve ser o caminho do arquivo cacert.pem que o python usa. + Ex.: .local/lib/python3.8/site-packages/certifi/cacert.pem + 5. Adicionar o conteúdo do certificado extraído no passo 2 ao final do + arquivo cacert.pem apontado pelo passo 3. + +Executando estes passos de maneira correta, o erro de validação de certificado +deve ser resolvido. diff --git a/classes.py b/classes.py index 8fec58b..3328c69 100644 --- a/classes.py +++ b/classes.py @@ -1,6 +1,7 @@ from globais import * import datetime import re +import certifi class Servidor: def __init__(self, nome = '', emails_notificacao = [], termos_pesquisa = []): @@ -17,7 +18,7 @@ class Pesquisa: def __init__(self, lista_servidores=None, diretorio_offline=None, offline=False, strdata=None): self.lista = lista_servidores - self.url = "http://pesquisa.in.gov.br/imprensa/servlet/INPDFViewer?jornal={0}&pagina={1}&data={2}&captchafield=firstAccess" + self.url = "https://pesquisa.in.gov.br/imprensa/servlet/INPDFViewer?jornal={0}&pagina={1}&data={2}&captchafield=firstAccess" if strdata is None: self.data_pesquisa = datetime.datetime.now().date().strftime("%d/%m/%Y") @@ -50,7 +51,7 @@ def processar(self, jornal, pagina_inicio=1, pagina_fim=1100, extra=False): 'Host':'pesquisa.in.gov.br', 'Upgrade-Insecure-Requests':'1'} - http = urllib3.PoolManager() + http = urllib3.HTTPSConnectionPool(host="pesquisa.in.gov.br", port=443, ca_certs=certifi.where()) full_url = self.url.format(jornal,pagina, self.data_pesquisa) print ("Seção {0}, Página {1}".format(jornal, pagina)) @@ -141,6 +142,6 @@ def enviar_ocorrencias(self, remetente, servidor_smtp, porta, usuario, senha): for ocorrencia in termo.ocorrencias: msg += '\t' + ocorrencia + '\n' - if msg is not '' : + if msg != '' : enviar_email(msg, servidor.emails_notificacao, remetente, servidor_smtp, porta, usuario, senha, False)