From b57fc16ab36455390c627fbddfa30a3d2fb61f6f Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Sat, 21 Feb 2026 12:30:56 -0500 Subject: [PATCH] fix: archivos >200KB usan URL publica, evita uploadMedia() con OpenSSL 3.x El contenedor falla al subir a Facebook archivos >~200KB por renegociacion TLS de OpenSSL 3.x (errno 55). Solucion sin rebuild: - Archivos <=200KB: uploadMedia() como antes (funciona OK) - Archivos >200KB: enviar URL publica - WhatsApp descarga desde el servidor directamente, sin pasar por el contenedor ni por OpenSSL Aplica a imagenes, documentos, videos y audios. --- api/send_media_message.php | 60 +++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/api/send_media_message.php b/api/send_media_message.php index 6812b06..44c563c 100644 --- a/api/send_media_message.php +++ b/api/send_media_message.php @@ -188,24 +188,21 @@ try { } if ($isLocalUrl) { - error_log("send_media_message.php - URL local detectada, subiendo archivo a WhatsApp primero"); - set_time_limit(300); // Tiempo extra para archivos grandes - + error_log("send_media_message.php - URL local detectada, procesando archivo"); + set_time_limit(300); + // Obtener la ruta local del archivo $parsedUrl = parse_url($mediaUrl); $relativePath = $parsedUrl['path']; - - // Construir ruta absoluta usando el path completo (no solo basename) + $docRoot = __DIR__ . '/..'; $localFilePath = $docRoot . $relativePath; - - // Si no existe, intentar con solo el basename en uploads/ + if (!file_exists($localFilePath)) { $uploadDir = __DIR__ . '/../uploads/'; $localFilePath = $uploadDir . basename($relativePath); } - - // Último intento: buscar recursivamente en uploads/ + if (!file_exists($localFilePath)) { $searchName = basename($relativePath); $found = glob(__DIR__ . '/../uploads/**/' . $searchName); @@ -213,33 +210,39 @@ try { $localFilePath = $found[0]; } } - - error_log("send_media_message.php - Ruta local del archivo: " . $localFilePath . " - existe: " . (file_exists($localFilePath) ? 'SI' : 'NO') . " - size: " . (file_exists($localFilePath) ? filesize($localFilePath) : 'N/A')); + + error_log("send_media_message.php - Ruta local: {$localFilePath} - existe: " . (file_exists($localFilePath) ? 'SI' : 'NO') . " - size: " . (file_exists($localFilePath) ? filesize($localFilePath) : 'N/A')); smm_log("Local file: {$localFilePath} exists=" . (file_exists($localFilePath) ? 'yes' : 'no') . " size=" . (file_exists($localFilePath) ? filesize($localFilePath) : 'N/A')); - + if (!file_exists($localFilePath)) { throw new Exception('Archivo no encontrado en el servidor: ' . $localFilePath); } - - // Detectar MIME type - $mimeType = mime_content_type($localFilePath); - error_log("send_media_message.php - MIME type detectado: " . $mimeType); - - // Subir archivo a WhatsApp + + $mimeType = mime_content_type($localFilePath); + $fileBytes = filesize($localFilePath); + + // ── Estrategia de envío según tamaño del archivo ──────────────────────── + // El contenedor usa OpenSSL 3.x que hace renegociación TLS con Facebook + // al subir payloads >~200 KB → errno 55 "Connection reset by peer". + // Solución: para archivos grandes, enviar la URL pública y dejar que + // WhatsApp descargue el archivo directamente desde nuestro servidor. + // Solo archivos pequeños (≤200 KB) usan uploadMedia() desde el contenedor. + $UPLOAD_SIZE_LIMIT = 200 * 1024; // 200 KB + + if ($fileBytes <= $UPLOAD_SIZE_LIMIT) { + // ── Ruta A: subir vía API (archivo pequeño, sin riesgo TLS) ───────── + error_log("send_media_message.php - Archivo pequeño ({$fileBytes}B ≤ {$UPLOAD_SIZE_LIMIT}B), usando uploadMedia()"); + smm_log("Ruta A: uploadMedia size={$fileBytes}"); try { $uploadResult = $whatsapp->uploadMedia($localFilePath, $mimeType); error_log("send_media_message.php - Archivo subido a WhatsApp: " . json_encode($uploadResult)); smm_log("Upload result: " . json_encode($uploadResult)); - + if (isset($uploadResult['id'])) { - // Usar el media_id de WhatsApp en lugar de URL $mediaId = $uploadResult['id']; - // Save uploaded media id for DB and debugging $uploaded_media_id = $mediaId; error_log("send_media_message.php - Media ID obtenido: " . $mediaId); smm_log("Media ID obtained: " . $mediaId); - - // Enviar mensaje usando media_id (pasar isVoice para audio) $response = sendMediaByIdToWhatsApp($whatsapp, $recipient, $mediaId, $mediaType, $caption, $filename, $isVoice); smm_log("Send media by id response: " . json_encode($response)); } else { @@ -250,6 +253,17 @@ try { error_log("send_media_message.php - Error subiendo a WhatsApp: " . $e->getMessage()); throw new Exception('Error al subir archivo a WhatsApp: ' . $e->getMessage()); } + + } else { + // ── Ruta B: archivo grande → enviar URL pública (WhatsApp descarga) ── + // Evita uploadMedia() desde el contenedor (falla por OpenSSL 3.x >200KB). + // WhatsApp descargará el archivo directamente desde nuestro servidor público. + error_log("send_media_message.php - Archivo grande ({$fileBytes}B > {$UPLOAD_SIZE_LIMIT}B), usando URL pública: {$mediaUrl}"); + smm_log("Ruta B: URL pública size={$fileBytes} url={$mediaUrl}"); + $response = sendMediaByLinkToWhatsApp($whatsapp, $recipient, $mediaUrl, $mediaType, $caption, $filename); + smm_log("Send by link response: " . json_encode($response)); + } + } else { // URL pública, usar método normal con link error_log("send_media_message.php - URL pública detectada, usando link directo: " . $mediaUrl);