Como Automatizar a Leitura de Faturas e Envio via WhatsApp com Python
O processamento manual de faturamento em pequenas e médias empresas costuma seguir um roteiro repetitivo e ineficiente: o setor financeiro gera dezenas de boletos ou faturas em PDF em uma pasta do computador, abre o WhatsApp Web, localiza o contato de cada cliente, anexa o documento correspondente e envia uma mensagem padronizada.
Esse fluxo consome horas semanais e introduz riscos críticos de conformidade, como o envio acidental de dados financeiros para o destinatário errado. A solução para eliminar essa fricção operacional é a construção de um pipeline em Python focado em leitura de diretórios, extração direcionada de dados e mensageria programática.
A Arquitetura da Solução
Um sistema robusto de automação documental opera em quatro etapas sequenciais:
- Monitoramento de Diretório (File Watcher): Detecção de novos arquivos PDF salvos na pasta de saída do ERP ou sistema de faturamento.
- Extração e Validação de Dados: Leitura programática do PDF para identificar número do documento, valor, vencimento e o número de telefone do destinatário.
- Camada de Disparo via WhatsApp: Envio do documento e do texto de cobrança utilizando uma API RESTful de mensageria.
- Gestão de Estado e Auditoria: Movimentação do arquivo processado para pastas de sucesso ou falha, com registro detalhado em log.
1. Monitoramento da Pasta Local com watchdog
Em vez de executar scripts manuais ou tarefas periódicas que leem a pasta inteira repetidamente, a abordagem ideal utiliza eventos do sistema operacional através da biblioteca watchdog.
python
import time
from pathlib import Path
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class InvoiceHandler(FileSystemEventHandler):
def oncreated(self, event):
if not event.isdirectory and event.srcpath.lower().endswith(‘.pdf’):
print(f”Novo documento detectado: {event.srcpath}”)
processarfatura(Path(event.srcpath))
def iniciarmonitoramento(caminhopasta: str):
eventhandler = InvoiceHandler()
observer = Observer()
observer.schedule(eventhandler, path=caminho_pasta, recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
2. Extração Precisa dos Dados com pdfplumber
Uma vez detectado o arquivo, é necessário extrair as informações essenciais para a entrega. Caso o PDF contenha texto vetorial (gerado digitalmente), bibliotecas como pdfplumber ou pypdf oferecem alta performance sem a sobrecarga computacional de um OCR.
python
import re
import pdfplumber
from pathlib import Path
def extrairdadosfatura(caminho_pdf: Path) -> dict:
dados = {“telefone”: None, “cliente”: None, “vencimento”: None}
with pdfplumber.open(caminho_pdf) as pdf:
texto_completo = "n".join([pagina.extract_text() or '' for pagina in pdf.pages])
# Expressão regular para capturar telefones no padrão brasileiro: +55 (DD) 9XXXX-XXXX ou variações
match_telefone = re.search(r'(?:+?55s?)?(?:(?([1-9][0-9]))?s?)?(9[0-9]{4}[-s]?[0-9]{4})', texto_completo)
if match_telefone:
ddd = match_telefone.group(1) or "11"
numero = re.sub(r'D', '', match_telefone.group(2))
dados["telefone"] = f"55{ddd}{numero}"
return dados
Como especialista em IA e engenharia de software, observo que muitas empresas lidam com PDFs digitalizados via scanner ou com layouts variáveis. Nesses cenários, a abordagem puramente regex falha. A solução técnica consiste em integrar modelos leves de OCR (como Tesseract) aliados a modelos de Extração de Informação Baseada em Layout (LayoutLM) ou chamadas estruturadas via LLMs locais, garantindo tolerância a mudanças de formato sem quebrar o fluxo.
3. Disparo Estruturado via WhatsApp
Automações baseadas em emulação de navegador (como Selenium navegando no WhatsApp Web) são frágeis: quebram com atualizações de interface, exigem sessão gráfica ativa e não escalam.
A abordagem corporativa requer comunicação via API HTTP (seja a Cloud API oficial da Meta ou instâncias dedicadas de gateways como Evolution API ou Z-API rodando em containers Docker locais).
python
import requests
from pathlib import Path
APIURL = “http://localhost:8080/message/sendMedia/instanciafinanceiro”
APIKEY = “SUACHAVEDEAUTENTICACAO”
def enviarfaturawhatsapp(telefone: str, caminhopdf: Path):
headers = {“apikey”: APIKEY}
payload = {
“number”: telefone,
“mediatype”: “document”,
“mimetype”: “application/pdf”,
“caption”: “Olá! Segue em anexo a sua fatura deste mês. Qualquer dúvida, estamos à disposição.”,
“fileName”: caminhopdf.name
}
files = {‘file’: open(caminhopdf, ‘rb’)}
resposta = requests.post(API_URL, headers=headers, data=payload, files=files)
resposta.raise_for_status()
return resposta.json()
4. Idempotência e Tratamento de Falhas
Um dos pontos mais negligenciados em scripts de automação é a garantia de entrega única (idempotência). Para evitar reprocessamento ou envio duplicado de cobranças, o script deve mover o arquivo processado imediatamente após a confirmação do disparo:
- /pendentes: Pasta monitorada onde chegam os novos PDFs.
- /processados: Arquivos enviados com sucesso e registrados em banco SQLite/PostgreSQL.
- /erros: Documentos cujo telefone não foi identificado ou cujo envio falhou na API.
Conclusão e Próximos Passos
Substituir o trabalho manual de envio de faturas por um serviço em segundo plano reduz o tempo de ciclo financeiro de horas para segundos, além de eliminar o erro humano na distribuição de documentos confidenciais.
Se a sua operação lida com faturas não padronizadas, precisa de integrações seguras com a API do WhatsApp ou requer uma arquitetura com logs auditáveis e tratamento inteligente de falhas, entre em contato com Thiago Programador. Desenvolvemos soluções sob medida em Python e Inteligência Artificial para automatizar gargalos operacionais da sua empresa.


