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:
+28
-14
@@ -188,24 +188,21 @@ try {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($isLocalUrl) {
|
if ($isLocalUrl) {
|
||||||
error_log("send_media_message.php - URL local detectada, subiendo archivo a WhatsApp primero");
|
error_log("send_media_message.php - URL local detectada, procesando archivo");
|
||||||
set_time_limit(300); // Tiempo extra para archivos grandes
|
set_time_limit(300);
|
||||||
|
|
||||||
// Obtener la ruta local del archivo
|
// Obtener la ruta local del archivo
|
||||||
$parsedUrl = parse_url($mediaUrl);
|
$parsedUrl = parse_url($mediaUrl);
|
||||||
$relativePath = $parsedUrl['path'];
|
$relativePath = $parsedUrl['path'];
|
||||||
|
|
||||||
// Construir ruta absoluta usando el path completo (no solo basename)
|
|
||||||
$docRoot = __DIR__ . '/..';
|
$docRoot = __DIR__ . '/..';
|
||||||
$localFilePath = $docRoot . $relativePath;
|
$localFilePath = $docRoot . $relativePath;
|
||||||
|
|
||||||
// Si no existe, intentar con solo el basename en uploads/
|
|
||||||
if (!file_exists($localFilePath)) {
|
if (!file_exists($localFilePath)) {
|
||||||
$uploadDir = __DIR__ . '/../uploads/';
|
$uploadDir = __DIR__ . '/../uploads/';
|
||||||
$localFilePath = $uploadDir . basename($relativePath);
|
$localFilePath = $uploadDir . basename($relativePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Último intento: buscar recursivamente en uploads/
|
|
||||||
if (!file_exists($localFilePath)) {
|
if (!file_exists($localFilePath)) {
|
||||||
$searchName = basename($relativePath);
|
$searchName = basename($relativePath);
|
||||||
$found = glob(__DIR__ . '/../uploads/**/' . $searchName);
|
$found = glob(__DIR__ . '/../uploads/**/' . $searchName);
|
||||||
@@ -214,32 +211,38 @@ try {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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'));
|
smm_log("Local file: {$localFilePath} exists=" . (file_exists($localFilePath) ? 'yes' : 'no') . " size=" . (file_exists($localFilePath) ? filesize($localFilePath) : 'N/A'));
|
||||||
|
|
||||||
if (!file_exists($localFilePath)) {
|
if (!file_exists($localFilePath)) {
|
||||||
throw new Exception('Archivo no encontrado en el servidor: ' . $localFilePath);
|
throw new Exception('Archivo no encontrado en el servidor: ' . $localFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Detectar MIME type
|
$mimeType = mime_content_type($localFilePath);
|
||||||
$mimeType = mime_content_type($localFilePath);
|
$fileBytes = filesize($localFilePath);
|
||||||
error_log("send_media_message.php - MIME type detectado: " . $mimeType);
|
|
||||||
|
|
||||||
// Subir archivo a WhatsApp
|
// ── 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 {
|
try {
|
||||||
$uploadResult = $whatsapp->uploadMedia($localFilePath, $mimeType);
|
$uploadResult = $whatsapp->uploadMedia($localFilePath, $mimeType);
|
||||||
error_log("send_media_message.php - Archivo subido a WhatsApp: " . json_encode($uploadResult));
|
error_log("send_media_message.php - Archivo subido a WhatsApp: " . json_encode($uploadResult));
|
||||||
smm_log("Upload result: " . json_encode($uploadResult));
|
smm_log("Upload result: " . json_encode($uploadResult));
|
||||||
|
|
||||||
if (isset($uploadResult['id'])) {
|
if (isset($uploadResult['id'])) {
|
||||||
// Usar el media_id de WhatsApp en lugar de URL
|
|
||||||
$mediaId = $uploadResult['id'];
|
$mediaId = $uploadResult['id'];
|
||||||
// Save uploaded media id for DB and debugging
|
|
||||||
$uploaded_media_id = $mediaId;
|
$uploaded_media_id = $mediaId;
|
||||||
error_log("send_media_message.php - Media ID obtenido: " . $mediaId);
|
error_log("send_media_message.php - Media ID obtenido: " . $mediaId);
|
||||||
smm_log("Media ID obtained: " . $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);
|
$response = sendMediaByIdToWhatsApp($whatsapp, $recipient, $mediaId, $mediaType, $caption, $filename, $isVoice);
|
||||||
smm_log("Send media by id response: " . json_encode($response));
|
smm_log("Send media by id response: " . json_encode($response));
|
||||||
} else {
|
} else {
|
||||||
@@ -250,6 +253,17 @@ try {
|
|||||||
error_log("send_media_message.php - Error subiendo a WhatsApp: " . $e->getMessage());
|
error_log("send_media_message.php - Error subiendo a WhatsApp: " . $e->getMessage());
|
||||||
throw new Exception('Error al subir archivo 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 {
|
} else {
|
||||||
// URL pública, usar método normal con link
|
// URL pública, usar método normal con link
|
||||||
error_log("send_media_message.php - URL pública detectada, usando link directo: " . $mediaUrl);
|
error_log("send_media_message.php - URL pública detectada, usando link directo: " . $mediaUrl);
|
||||||
|
|||||||
Reference in New Issue
Block a user