Actualizar backend/main.py
This commit is contained in:
@@ -169,7 +169,8 @@ def get_plantillas():
|
||||
def post_plantillas_enviar(payload: dict = Body(...)):
|
||||
"""Envía una plantilla de WhatsApp (Chatwoot) a una lista de números.
|
||||
payload: {nombre, categoria, idioma, texto, telefonos:[...]}.
|
||||
Solo se envía a números peruanos con código 51 (formato 51XXXXXXXXX)."""
|
||||
Se envía a CUALQUIER país. NO se crean contactos nuevos: si el número no
|
||||
existe en Chatwoot, se salta y se reporta en 'no_encontrados'."""
|
||||
import os, requests, time
|
||||
CHATWOOT_URL = os.getenv("CHATWOOT_URL", "https://gestor.escueladerefrigeracion.edu.pe")
|
||||
TOKEN = os.getenv("CHATWOOT_TOKEN", "4anazHvZnvKLtup8biu5Zuoh")
|
||||
@@ -191,15 +192,18 @@ def post_plantillas_enviar(payload: dict = Body(...)):
|
||||
for x in ("+", " ", "-", "(", ")"): s = s.replace(x, "")
|
||||
return s
|
||||
|
||||
# Validar: debe empezar con 51 y tener 11 dígitos (51 + 9)
|
||||
# Se envía a CUALQUIER país. Solo se exige que sea un número (dígitos, min 8).
|
||||
validos, invalidos = [], []
|
||||
for t in telefonos_raw:
|
||||
s = normaliza(t)
|
||||
if s.isdigit() and s.startswith("51") and len(s) == 11:
|
||||
if s.isdigit() and len(s) >= 8:
|
||||
validos.append(s)
|
||||
else:
|
||||
invalidos.append(str(t))
|
||||
|
||||
# Números que NO existen como contacto en Chatwoot (no se crean, solo se reportan)
|
||||
no_encontrados = []
|
||||
|
||||
def chat_id(tel):
|
||||
tel_p = "+" + tel
|
||||
try:
|
||||
@@ -208,16 +212,11 @@ def post_plantillas_enviar(payload: dict = Body(...)):
|
||||
data = r.json()
|
||||
except Exception:
|
||||
return None
|
||||
cid = None
|
||||
if ok(r.status_code) and data.get("payload"):
|
||||
cid = data["payload"][0]["id"]
|
||||
else:
|
||||
rc = requests.post(f"{CHATWOOT_URL}/api/v1/accounts/{ACCOUNT_ID}/contacts",
|
||||
headers=headers, json={"phone_number": tel_p, "inbox_id": INBOX_ID}, timeout=20)
|
||||
if ok(rc.status_code):
|
||||
cid = rc.json()["payload"]["contact"]["id"]
|
||||
else:
|
||||
return None
|
||||
# Si NO existe el contacto → no crear, marcar como no encontrado
|
||||
if not (ok(r.status_code) and data.get("payload")):
|
||||
no_encontrados.append(tel)
|
||||
return None
|
||||
cid = data["payload"][0]["id"]
|
||||
rconv = requests.get(f"{CHATWOOT_URL}/api/v1/accounts/{ACCOUNT_ID}/contacts/{cid}/conversations",
|
||||
headers=headers, timeout=20)
|
||||
for conv in rconv.json().get("payload", []):
|
||||
@@ -246,8 +245,11 @@ def post_plantillas_enviar(payload: dict = Body(...)):
|
||||
fallidos.append(tel)
|
||||
time.sleep(1)
|
||||
|
||||
# "fallo_envio" = existían pero falló el envío (excluye los no_encontrados)
|
||||
fallo_envio = [t for t in fallidos if t not in set(no_encontrados)]
|
||||
return {"status": "ok", "enviados": enviados,
|
||||
"fallidos": fallidos, "invalidos": invalidos,
|
||||
"no_encontrados": no_encontrados, "fallo_envio": fallo_envio,
|
||||
"total": len(telefonos_raw)}
|
||||
|
||||
|
||||
@@ -473,4 +475,4 @@ def debug_cursos(ano: str = "2026", mes: str = "1"):
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
uvicorn.run("main:app", host="0.0.0.0", port=8001, reload=False)
|
||||
uvicorn.run("main:app", host="0.0.0.0", port=8001, reload=False)
|
||||
Reference in New Issue
Block a user