Como Automatizar a Leitura de Faturas e Envio via WhatsApp com Python

Aprenda a criar um pipeline em Python para monitorar pastas locais, extrair dados de faturas em PDF e disparar mensagens automáticas pelo WhatsApp.

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:

  1. Monitoramento de Diretório (File Watcher): Detecção de novos arquivos PDF salvos na pasta de saída do ERP ou sistema de faturamento.
  2. 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.
  3. Camada de Disparo via WhatsApp: Envio do documento e do texto de cobrança utilizando uma API RESTful de mensageria.
  4. 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.is
directory and event.srcpath.lower().endswith(‘.pdf’):
print(f”Novo documento detectado: {event.src
path}”)
processarfatura(Path(event.srcpath))

def iniciarmonitoramento(caminhopasta: str):
eventhandler = InvoiceHandler()
observer = Observer()
observer.schedule(event
handler, 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”: API
KEY}
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(caminho
pdf, ‘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.

Preencha o formulário abaixo para que eu consiga entrar em contato com você.