HEX
Server: Apache
System: Linux vpshost11508.publiccloud.com.br 5.15.179-grsec-vpshost-10.lc.el8.x86_64 #1 SMP Mon Apr 7 12:04:45 -03 2025 x86_64
User: wicomm2 (10002)
PHP: 8.3.0
Disabled: apache_child_terminate,dl,escapeshellarg,escapeshellcmd,exec,link,mail,openlog,passthru,pcntl_alarm,pcntl_exec,pcntl_fork,pcntl_get_last_error,pcntl_getpriority,pcntl_setpriority,pcntl_signal,pcntl_signal_dispatch,pcntl_sigprocmask,pcntl_sigtimedwait,pcntl_sigwaitinfo,pcntl_strerror,pcntl_wait,pcntl_waitpid,pcntl_wexitstatus,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,php_check_syntax,php_strip_whitespace,popen,proc_close,proc_open,shell_exec,symlink,system
Upload Files
File: /home/storage/5/78/dd/wicomm2/public_html/clientes/lookai/ga4_fetch.php
<?php
require __DIR__ . '/vendor/autoload.php';

use Google\Analytics\Data\V1beta\BetaAnalyticsDataClient;
use Google\Analytics\Data\V1beta\DateRange;
use Google\Analytics\Data\V1beta\Dimension;
use Google\Analytics\Data\V1beta\Metric;
use Google\Analytics\Data\V1beta\FilterExpression;
use Google\Analytics\Data\V1beta\Filter;
use Google\Analytics\Data\V1beta\Filter\StringFilter;
use Google\Analytics\Data\V1beta\FilterExpressionList;

$cfg = require __DIR__ . '/config.php';
date_default_timezone_set('America/Sao_Paulo');

$client = new BetaAnalyticsDataClient(['credentials' => $cfg['ga4']['credentials']]);

$dateRange = new DateRange([
  'start_date' => date('Y-m-01'),
  'end_date' => date('Y-m-d')
]);

$respDaily = $client->runReport([
  'property' => "properties/{$cfg['ga4']['property_id']}",
  'dateRanges' => [$dateRange],
  'dimensions' => [new Dimension(['name' => 'date'])],
  'metrics' => [
    new Metric(['name' => 'sessions']),
    new Metric(['name' => 'engagedSessions']),
    new Metric(['name' => 'totalUsers']),
    new Metric(['name' => 'newUsers']),
    new Metric(['name' => 'bounceRate']),
    new Metric(['name' => 'averageSessionDuration']),
    new Metric(['name' => 'addToCarts']),
    new Metric(['name' => 'checkouts']),
    new Metric(['name' => 'ecommercePurchases']),
    new Metric(['name' => 'totalRevenue'])
  ]
]);

// Mapear métricas por nome para garantir alinhamento correto
$metricHeaders = [];
foreach ($respDaily->getMetricHeaders() as $idx => $mh) {
  $metricHeaders[$mh->getName()] = $idx;
}
$mv = function($mValues, $name) use ($metricHeaders) {
  return isset($metricHeaders[$name]) ? (float) $mValues[$metricHeaders[$name]]->getValue() : 0.0;
};

$daily = [];
foreach ($respDaily->getRows() as $row) {
  $d = $row->getDimensionValues();
  $m = $row->getMetricValues();
  $date = $d[0]->getValue();
  if (preg_match('/^\d{8}$/', $date)) {
    $date = substr($date, 0, 4) . '-' . substr($date, 4, 2) . '-' . substr($date, 6, 2);
  }
  $daily[] = [
    'date' => $date,
    'sessions' => $mv($m, 'sessions'),
    'users' => $mv($m, 'totalUsers'),
    'new_users' => $mv($m, 'newUsers'),
    'bounce_rate' => $mv($m, 'bounceRate'),
    'avg_session_duration_sec' => $mv($m, 'averageSessionDuration'),
    'add_to_carts' => $mv($m, 'addToCarts'),
    'checkouts' => $mv($m, 'checkouts'),
    'transactions' => $mv($m, 'ecommercePurchases'),
    'revenue' => $mv($m, 'totalRevenue')
  ];
}

// 2) Produtos (top itens por receita)
$respItems = $client->runReport([
  'property' => "properties/{$cfg['ga4']['property_id']}",
  'dateRanges' => [$dateRange],
  'dimensions' => [new Dimension(['name' => 'itemName'])],
  'metrics' => [
    new Metric(['name' => 'itemRevenue']),
    new Metric(['name' => 'itemsPurchased'])
  ],
  'limit' => 5000
]);

$items = [];
foreach ($respItems->getRows() as $row) {
  $d = $row->getDimensionValues();
  $m = $row->getMetricValues();
  $name = $d[0]->getValue() ?: '(sem nome)';
  $items[] = [
    'item_name' => $name,
    'item_revenue' => (float) $m[0]->getValue(),
    'items_purchased' => (float) $m[1]->getValue()
  ];
}

// 2b) Eventos globais de funil (view_item, add_to_cart etc.)
$respItemEvents = $client->runReport([
  'property' => "properties/{$cfg['ga4']['property_id']}",
  'dateRanges' => [$dateRange],
  'dimensions' => [new Dimension(['name' => 'eventName'])],
  'metrics' => [new Metric(['name' => 'eventCount'])],
  'dimensionFilter' => $filterExpression
]);

$itemEvents = [];
foreach ($respItemEvents->getRows() as $row) {
  $dims = $row->getDimensionValues();
  $metrics = $row->getMetricValues();
  $event = $dims[0]->getValue();
  $count = (float) $metrics[0]->getValue();
  $itemEvents[$event] = $count;
}

$respChannels = $client->runReport([
  'property' => "properties/{$cfg['ga4']['property_id']}",
  'dateRanges' => [$dateRange],
  'dimensions' => [new Dimension(['name' => 'sessionDefaultChannelGroup'])],
  'metrics' => [
    new Metric(['name' => 'sessions']),
    new Metric(['name' => 'totalRevenue']),
    new Metric(['name' => 'ecommercePurchases'])
  ],
  'limit' => 50
]);

$channels = [];
foreach ($respChannels->getRows() as $row) {
  $d = $row->getDimensionValues();
  $m = $row->getMetricValues();
  $channels[] = [
    'channel' => $d[0]->getValue(),
    'sessions' => (float) $m[0]->getValue(),
    'revenue' => (float) $m[1]->getValue(),
    'transactions' => (float) $m[2]->getValue()
  ];
}

$eventNames = [
  'view_item',
  'add_to_cart',
  'begin_checkout',
  'add_profile_info',
  'add_shipping_info',
  'add_payment_info',
  'purchase'
];

$expressions = [];
foreach ($eventNames as $ev) {
  $expressions[] = new FilterExpression([
    'filter' => new Filter([
      'field_name' => 'eventName',
      'string_filter' => new StringFilter(['value' => $ev])
    ])
  ]);
}

$filterExpression = new FilterExpression([
  'or_group' => new FilterExpressionList(['expressions' => $expressions])
]);

$respFunnel = $client->runReport([
  'property' => "properties/{$cfg['ga4']['property_id']}",
  'dateRanges' => [$dateRange],
  'dimensions' => [new Dimension(['name' => 'eventName'])],
  'metrics' => [new Metric(['name' => 'eventCount'])],
  'dimensionFilter' => $filterExpression
]);

$funnelEvents = [];
foreach ($respFunnel->getRows() as $row) {
  $d = $row->getDimensionValues();
  $m = $row->getMetricValues();
  $event = $d[0]->getValue();
  $funnelEvents[] = [
    'event_name' => $event,
    'count' => (float) $m[0]->getValue()
  ];
}

$out = [
  'generated_at' => date('c'),
  'daily' => $daily,
  'items' => $items,
  'channels' => $channels,
  'funnel_events' => $funnelEvents
];

if (!is_dir(dirname($cfg['data']['json_path']))) {
  mkdir(dirname($cfg['data']['json_path']), 0775, true);
}
file_put_contents($cfg['data']['json_path'], json_encode($out, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
echo "✅ GA4 atualizado: " . count($daily) . " dias, " . count($items) . " itens, " . count($channels) . " canais, " . count($funnelEvents) . " eventos de funil\n";