%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
<?php
require_once __DIR__ . '/config/config.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
exit;
}
$vid = (string) post_param('vid');
$sid = (string) post_param('sid');
$path = (string) post_param('path');
$t = (string) post_param('t');
// Validasi id anonim (huruf/angka saja).
if (!preg_match('/^[A-Za-z0-9]{6,40}$/', $vid) || !preg_match('/^[A-Za-z0-9]{6,40}$/', $sid)) {
http_response_code(204);
exit;
}
// Normalisasi path: buang query/fragment, harus diawali '/', batasi panjang.
$path = explode('#', explode('?', $path, 2)[0], 2)[0];
if ($path === '' || $path[0] !== '/') {
$path = '/';
}
$path = mb_substr($path, 0, 255);
// Jangan lacak area admin maupun endpoint ini sendiri.
if (strncmp($path, '/admin', 6) === 0 || strncmp($path, '/track', 6) === 0) {
http_response_code(204);
exit;
}
try {
if ($t === 'view') {
$title = trim((string) post_param('title'));
$title = $title !== '' ? mb_substr($title, 0, 255) : null;
db()->prepare(
'INSERT INTO analytics_visitor (vid, hits) VALUES (?, 1)
ON DUPLICATE KEY UPDATE hits = hits + 1, last_seen = NOW()'
)->execute([$vid]);
db()->prepare(
'INSERT INTO analytics_pageview (vid, sid, path, title) VALUES (?, ?, ?, ?)'
)->execute([$vid, $sid, $path, $title]);
} elseif ($t === 'dur') {
$dur = (int) post_param('dur');
$dur = max(0, min($dur, 86400)); // buang nilai anomali (>24 jam)
db()->prepare(
'UPDATE analytics_pageview SET duration = ?
WHERE vid = ? AND sid = ? AND path = ? AND duration IS NULL
ORDER BY id DESC LIMIT 1'
)->execute([$dur, $vid, $sid, $path]);
}
} catch (Throwable $e) {
// Analitik tidak boleh mengganggu situs — diamkan.
}
http_response_code(204);