One Hat Cyber Team
Your IP :
216.73.216.36
Server IP :
162.240.179.46
Server :
Linux vps-14493116.nutrivittasaude.com.br 5.14.0-611.49.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Apr 21 16:39:08 EDT 2026 x86_64
Server Software :
Apache
PHP Version :
8.2.31
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
home
/
lifeprimeti
/
meta.lifeprimeti.com.br
/
api
/
View File Name :
campanhas_enviar.php
<?php require_once __DIR__ . '/../config/database.php'; require_once __DIR__ . '/../includes/digigo.php'; header('Content-Type: application/json; charset=utf-8'); $id = (int)($_GET['id'] ?? 0); $empresaId = (int)($_GET['empresa_id'] ?? 0); if (!$id || !$empresaId) { echo json_encode(['success' => false, 'error' => 'Parametros invalidos']); exit; } $stmt = $pdo->prepare("SELECT * FROM campanhas WHERE id = ? AND empresa_id = ? AND status = 'rascunho'"); $stmt->execute([$id, $empresaId]); $campanha = $stmt->fetch(); if (!$campanha) { echo json_encode(['success' => false, 'error' => 'Campanha nao encontrada ou ja enviada']); exit; } $metodo = $campanha['metodo_envio'] ?? 'email'; $destinosIds = $campanha['destinos'] ? json_decode($campanha['destinos'], true) : null; $delayMin = max(1, (int)($campanha['delay_min'] ?? 2)); $delayMax = max($delayMin, (int)($campanha['delay_max'] ?? 5)); $hInicio = $campanha['horario_inicio'] ?? '08:00'; $hFim = $campanha['horario_fim'] ?? '18:00'; $diaUtilOnly = !empty($campanha['dia_util_only']); // Build client query $sql = "SELECT id, nome, email, telefone, whatsapp FROM usuarios WHERE empresa_id = ? AND tipo = 'cliente' AND ativo = 1"; $params = [$empresaId]; if ($metodo === 'email') { $sql .= " AND email IS NOT NULL AND email != ''"; } elseif ($metodo === 'whatsapp') { $sql .= " AND (telefone IS NOT NULL AND telefone != '')"; } if (is_array($destinosIds) && !empty($destinosIds)) { $placeholders = implode(',', array_fill(0, count($destinosIds), '?')); $sql .= " AND id IN ($placeholders)"; $params = array_merge($params, $destinosIds); } $clientes = $pdo->prepare($sql); $clientes->execute($params); $lista = $clientes->fetchAll(); if (empty($lista)) { echo json_encode(['success' => false, 'error' => 'Nenhum cliente com contato disponivel para o metodo selecionado']); exit; } // Mark as sending $pdo->prepare("UPDATE campanhas SET status='enviada' WHERE id=?")->execute([$id]); $enviadas = 0; $erros = []; $total = count($lista); function podeEnviarAgora($hInicio, $hFim, $diaUtilOnly) { $agora = new DateTime(); $horaAtual = $agora->format('H:i'); $diaSemana = (int)$agora->format('w'); if ($diaUtilOnly && ($diaSemana === 0 || $diaSemana === 6)) return false; $inicioTs = strtotime($hInicio); $fimTs = strtotime($hFim); $atualTs = strtotime($horaAtual); return $atualTs >= $inicioTs && $atualTs <= $fimTs; } function proximoHorarioValido($hInicio, $hFim, $diaUtilOnly) { $agora = new DateTime(); if ($diaUtilOnly) { $diaSemana = (int)$agora->format('w'); if ($diaSemana === 0) $agora->modify('+1 day'); elseif ($diaSemana === 6) $agora->modify('+2 days'); } $inicio = new DateTime($agora->format('Y-m-d') . ' ' . $hInicio); $fim = new DateTime($agora->format('Y-m-d') . ' ' . $hFim); if ($agora > $fim) { $agora->modify('+1 day'); if ($diaUtilOnly) { while (in_array((int)$agora->format('w'), [0, 6])) $agora->modify('+1 day'); } $inicio = new DateTime($agora->format('Y-m-d') . ' ' . $hInicio); } elseif ($agora < $inicio) { return $inicio; } return $agora; } if ($metodo === 'email') { require_once __DIR__ . '/../includes/email.php'; $idx = 0; while ($idx < $total) { if (!podeEnviarAgora($hInicio, $hFim, $diaUtilOnly)) { $proximo = proximoHorarioValido($hInicio, $hFim, $diaUtilOnly); $sleepSec = max(1, $proximo->getTimestamp() - time()); sleep(min($sleepSec, 300)); continue; } $cliente = $lista[$idx]; $corpo = $campanha['corpo_html']; $corpo = str_replace(['{{nome}}', '{{email}}'], [$cliente['nome'], $cliente['email']], $corpo); $ok = enviarEmail($cliente['email'], $campanha['assunto'], $corpo, $empresaId); if ($ok) $enviadas++; else $erros[] = $cliente['email']; $idx++; if ($idx < $total) usleep(rand($delayMin, $delayMax) * 1000000); } } elseif ($metodo === 'whatsapp') { require_once __DIR__ . '/../includes/whatsapp.php'; $idx = 0; while ($idx < $total) { if (!podeEnviarAgora($hInicio, $hFim, $diaUtilOnly)) { $proximo = proximoHorarioValido($hInicio, $hFim, $diaUtilOnly); $sleepSec = max(1, $proximo->getTimestamp() - time()); sleep(min($sleepSec, 300)); continue; } $cliente = $lista[$idx]; $telefone = preg_replace('/\D/', '', $cliente['telefone'] ?? ''); if (strlen($telefone) < 10) { $erros[] = $cliente['nome'] . ' (telefone invalido)'; $idx++; continue; } $texto = $campanha['corpo_html']; $texto = str_replace(['{{nome}}', '{{email}}'], [$cliente['nome'], $cliente['email'] ?? ''], $texto); $texto = strip_tags($texto); $ok = enviarWhatsAppMeta($empresaId, $telefone, $texto); if (!empty($ok['success'])) $enviadas++; else $erros[] = $cliente['telefone']; $idx++; if ($idx < $total) usleep(rand($delayMin, $delayMax) * 1000000); } } elseif ($metodo === 'digigo') { $companyCfg = DigiGOClient::getCompanyConfig($pdo, $empresaId); $digigoModo = $companyCfg['digigo_modo'] ?? 'proprio'; if ($digigoModo === 'global') { $globalCfg = DigiGOClient::getGlobalConfig($pdo); if (!DigiGOClient::isGloballyConfigured($globalCfg)) { echo json_encode(['success' => false, 'error' => 'DigiGO Global indisponivel']); exit; } $baseUrl = $globalCfg['digigo_base_url']; } else { if (empty($companyCfg['digigo_base_url'])) { echo json_encode(['success' => false, 'error' => 'DigiGO Proprio nao configurado']); exit; } $baseUrl = $companyCfg['digigo_base_url']; } if (empty($companyCfg['digigo_connected'])) { echo json_encode(['success' => false, 'error' => 'WhatsApp DigiGO nao conectado']); exit; } $client = new DigiGOClient($baseUrl, $companyCfg['digigo_user_token'], false); try { $client->sessionStatus(); } catch (Exception $e) {} try { $client->sessionConnect(); } catch (Exception $e) {} $idx = 0; while ($idx < $total) { if (!podeEnviarAgora($hInicio, $hFim, $diaUtilOnly)) { $proximo = proximoHorarioValido($hInicio, $hFim, $diaUtilOnly); $sleepSec = max(1, $proximo->getTimestamp() - time()); sleep(min($sleepSec, 300)); continue; } $cliente = $lista[$idx]; $telefone = preg_replace('/\D/', '', $cliente['whatsapp'] ?: $cliente['telefone'] ?? ''); if (strlen($telefone) < 10) { $erros[] = $cliente['nome'] . ' (telefone invalido)'; $idx++; continue; } if (strlen($telefone) === 10 || strlen($telefone) === 11) $telefone = '55' . $telefone; $texto = $campanha['corpo_html']; $texto = str_replace(['{{nome}}', '{{email}}'], [$cliente['nome'], $cliente['email'] ?? ''], $texto); $texto = strip_tags($texto); try { $client->sendText($telefone, $texto); $enviadas++; } catch (Exception $e) { $erros[] = $telefone . ': ' . $e->getMessage(); } $idx++; if ($idx < $total) usleep(rand($delayMin, $delayMax) * 1000000); } } $pdo->prepare("UPDATE campanhas SET enviadas=COALESCE(?,0), total_destinatarios=COALESCE(?,0) WHERE id=?") ->execute([$enviadas, $total, $id]); echo json_encode([ 'success' => true, 'enviadas' => $enviadas, 'total' => $total, 'erros' => $erros ]);