| Current Path : /home/seto/888mirror.pm/api/ |
| Current File : /home/seto/888mirror.pm/api/stats.php |
<?php
require_once __DIR__ . '/../includes/db.php';
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: https://mydash.pm');
$key = $_GET['key'] ?? '';
if ($key !== 'mydash_stats_2026') {
http_response_code(403);
echo json_encode(['error' => 'forbidden']);
exit;
}
$db = db();
$today = date('Y-m-d');
$yesterday = date('Y-m-d', strtotime('-1 day'));
$since_7d = date('Y-m-d H:i:s', strtotime('-7 days'));
$since_30d = date('Y-m-d H:i:s', strtotime('-30 days'));
$month_start = date('Y-m-01 00:00:00');
// Same filters as admin dashboard
$excl = "AND country NOT IN ('cn','us')";
$hetzner = "AND (ip NOT LIKE '2a01:4f8:%' AND ip NOT LIKE '2a01:4f9:%')";
$base = "AND country != '-' $excl $hetzner";
// Redirects today / yesterday / month / 7d / 30d
$redirects_today = (int)$db->query("SELECT COUNT(*) FROM redirect_clicks WHERE DATE(created_at) = '$today'")->fetchColumn();
$redirects_yesterday = (int)$db->query("SELECT COUNT(*) FROM redirect_clicks WHERE DATE(created_at) = '$yesterday'")->fetchColumn();
$redirects_month = (int)$db->query("SELECT COUNT(*) FROM redirect_clicks WHERE created_at >= '$month_start'")->fetchColumn();
$redirects_7d = (int)$db->query("SELECT COUNT(*) FROM redirect_clicks WHERE created_at >= '$since_7d'")->fetchColumn();
$redirects_30d = (int)$db->query("SELECT COUNT(*) FROM redirect_clicks WHERE created_at >= '$since_30d'")->fetchColumn();
// Impressions today — unique visitors, same as admin (DISTINCT visit_id, no bots/CN/US/Hetzner)
$impressions_today = (int)$db->query("
SELECT COUNT(DISTINCT visit_id) FROM stats
WHERE event_type = 'impression' AND DATE(created_at) = '$today' $base
")->fetchColumn();
// Clicks today — same filters
$clicks_today = (int)$db->query("
SELECT COUNT(*) FROM stats
WHERE event_type = 'click' AND DATE(created_at) = '$today' $base
")->fetchColumn();
// CTR today
$ctr_today = $impressions_today > 0 ? round($clicks_today / $impressions_today * 100, 1) : 0;
// Top brands 7d (by redirects)
$top_brands = $db->query("
SELECT b.name, COUNT(*) as cnt
FROM redirect_clicks rc JOIN brands b ON b.id = rc.brand_id
WHERE rc.created_at >= '$since_7d'
GROUP BY rc.brand_id ORDER BY cnt DESC LIMIT 5
")->fetchAll();
// Top countries 7d
$top_countries = $db->query("
SELECT country, COUNT(*) as cnt
FROM redirect_clicks
WHERE created_at >= '$since_7d' AND country != ''
GROUP BY country ORDER BY cnt DESC LIMIT 5
")->fetchAll();
// Hourly today (redirects)
$hourly = $db->query("
SELECT strftime('%H', created_at) as hour, COUNT(*) as cnt
FROM redirect_clicks
WHERE DATE(created_at) = '$today'
GROUP BY hour ORDER BY hour
")->fetchAll();
echo json_encode([
'redirects_today' => $redirects_today,
'redirects_yesterday' => $redirects_yesterday,
'redirects_month' => $redirects_month,
'redirects_7d' => $redirects_7d,
'redirects_30d' => $redirects_30d,
'impressions_today' => $impressions_today,
'clicks_today' => $clicks_today,
'ctr_today' => $ctr_today,
'top_brands' => $top_brands,
'top_countries' => $top_countries,
'hourly_today' => $hourly,
'generated_at' => date('Y-m-d H:i:s'),
]);