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.
This commit is contained in:
+37
-23
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user