up
This commit is contained in:
@@ -164,23 +164,103 @@ class WhatsAppWebhook {
|
||||
$mediaUrl = $message['image']['url'] ?? ($message['image']['id'] ?? null);
|
||||
$mimeType = $message['image']['mime_type'] ?? null;
|
||||
$filename = $message['image']['filename'] ?? null;
|
||||
|
||||
// Intentar descargar y almacenar imagen localmente
|
||||
try {
|
||||
$ms = new MediaService();
|
||||
$res = null;
|
||||
if ($mediaUrl && preg_match('#^https?://#i', $mediaUrl)) {
|
||||
// Si venía URL directa, descargar desde URL
|
||||
$content = $ms->downloadUrl($mediaUrl);
|
||||
if ($content !== false) {
|
||||
$subdir = date('Y/m');
|
||||
$dir = 'uploads/media/' . $subdir;
|
||||
if (!is_dir(__DIR__ . '/../' . $dir)) mkdir(__DIR__ . '/../' . $dir, 0755, true);
|
||||
$ext = $ms->extensionFromMime($mimeType) ?: pathinfo(parse_url($mediaUrl, PHP_URL_PATH), PATHINFO_EXTENSION) ?: 'jpg';
|
||||
$fname = uniqid('m_') . '.' . $ext;
|
||||
$path = __DIR__ . '/../' . $dir . '/' . $fname;
|
||||
file_put_contents($path, $content);
|
||||
$res = ['local_file' => $dir . '/' . $fname];
|
||||
// crear thumb
|
||||
if ($ms->isImageMime($mimeType)) {
|
||||
$thumbPath = __DIR__ . '/../' . $dir . '/thumb_' . $fname . '.jpg';
|
||||
if ($ms->createThumbnail($path, $thumbPath)) {
|
||||
$res['local_thumb'] = $dir . '/thumb_' . $fname . '.jpg';
|
||||
}
|
||||
}
|
||||
}
|
||||
} elseif ($mediaUrl) {
|
||||
// mediaUrl probablemente es media id -> usar fetchAndStoreFromGraph
|
||||
$res = $ms->fetchAndStoreFromGraph($mediaUrl, date('Y/m'));
|
||||
}
|
||||
if ($res) {
|
||||
$localFile = $res['local_file'] ?? null;
|
||||
$localThumb = $res['local_thumb'] ?? null;
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
error_log('Media download failed: ' . $e->getMessage());
|
||||
// Encolar para reintento si tenemos un media id (no descargar documentos aquí)
|
||||
try {
|
||||
if ($mediaUrl && !preg_match('#^https?://#i', $mediaUrl)) {
|
||||
$this->db->insert('media_queue', [
|
||||
'media_id' => $mediaUrl,
|
||||
'subdir' => date('Y/m'),
|
||||
'status' => 'pending',
|
||||
'created_at' => date('Y-m-d H:i:s')
|
||||
]);
|
||||
}
|
||||
} catch (Exception $e2) {
|
||||
error_log('Failed to enqueue media download: ' . $e2->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
} elseif (isset($message['audio'])) {
|
||||
$messageType = 'audio';
|
||||
$mediaUrl = $message['audio']['url'] ?? ($message['audio']['id'] ?? null);
|
||||
$mimeType = $message['audio']['mime_type'] ?? null;
|
||||
$filename = $message['audio']['filename'] ?? null;
|
||||
|
||||
// Descargar audio y guardar local (opcional)
|
||||
try {
|
||||
$ms = new MediaService();
|
||||
if ($mediaUrl && !preg_match('#^https?://#i', $mediaUrl)) {
|
||||
$res = $ms->fetchAndStoreFromGraph($mediaUrl, date('Y/m'));
|
||||
if ($res) {
|
||||
$localFile = $res['local_file'] ?? null;
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
error_log('Audio download failed: ' . $e->getMessage());
|
||||
}
|
||||
|
||||
} elseif (isset($message['video'])) {
|
||||
$messageText = $message['video']['caption'] ?? '';
|
||||
$messageType = 'video';
|
||||
$mediaUrl = $message['video']['url'] ?? ($message['video']['id'] ?? null);
|
||||
$mimeType = $message['video']['mime_type'] ?? null;
|
||||
$filename = $message['video']['filename'] ?? null;
|
||||
|
||||
// Descargar video y guardar local (opcional)
|
||||
try {
|
||||
$ms = new MediaService();
|
||||
if ($mediaUrl && !preg_match('#^https?://#i', $mediaUrl)) {
|
||||
$res = $ms->fetchAndStoreFromGraph($mediaUrl, date('Y/m'));
|
||||
if ($res) {
|
||||
$localFile = $res['local_file'] ?? null;
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
error_log('Video download failed: ' . $e->getMessage());
|
||||
}
|
||||
|
||||
} elseif (isset($message['document'])) {
|
||||
$messageText = $message['document']['filename'] ?? '';
|
||||
$messageType = 'document';
|
||||
$mediaUrl = $message['document']['url'] ?? ($message['document']['id'] ?? null);
|
||||
$mimeType = $message['document']['mime_type'] ?? null;
|
||||
$filename = $message['document']['filename'] ?? null;
|
||||
|
||||
// Do NOT download documents automatically; keep media id so browser will redirect and download
|
||||
}
|
||||
|
||||
// Log debug (temporal) para verificar cómo llegan media_url/filename
|
||||
@@ -205,6 +285,13 @@ class WhatsAppWebhook {
|
||||
if (isset($mimeType) && $mimeType !== null) {
|
||||
$saveData['mime_type'] = $mimeType;
|
||||
}
|
||||
// Si se descargó y almacenó localmente, añadir las rutas locales
|
||||
if (isset($localFile) && $localFile) {
|
||||
$saveData['local_file'] = $localFile;
|
||||
}
|
||||
if (isset($localThumb) && $localThumb) {
|
||||
$saveData['local_thumb'] = $localThumb;
|
||||
}
|
||||
|
||||
// Si el mensaje incluye contexto (es respuesta a otro mensaje)
|
||||
if (isset($message['context']) && isset($message['context']['id'])) {
|
||||
|
||||
Reference in New Issue
Block a user