v1.6.31 : analyse complète des logs + détection bots
- AccessLogParser : tous chemins/statuts pour IPs publiques (ipAllPaths, ipAllDays, ipAgents) - Détection bots par patterns (data/bots.json, ~50 patterns initiaux) - Section « Agents détectés » en bas de page admin/stats avec badge 🤖 - Panneau d'édition des patterns bots (formulaire avec CSRF) - Drill-down IP : section « Autres chemins » (hors articles/livres) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+38
-12
@@ -1,11 +1,12 @@
|
||||
<?php
|
||||
$_statsSaved = isset($_GET['saved']);
|
||||
$_statsError = ($_GET['error'] ?? '') === 'write';
|
||||
$_readable = $adminData['stats_readable'] ?? false;
|
||||
$_books = $adminData['stats_books'] ?? [];
|
||||
$_asList = $adminData['stats_as'] ?? [];
|
||||
$_readable = $adminData['stats_readable'] ?? false;
|
||||
$_books = $adminData['stats_books'] ?? [];
|
||||
$_asList = $adminData['stats_as'] ?? [];
|
||||
$_pagesByDay = $adminData['stats_pages_by_day'] ?? [];
|
||||
$_ipData = $adminData['stats_ip_data'] ?? [];
|
||||
$_ipData = $adminData['stats_ip_data'] ?? [];
|
||||
$_botPatterns = $adminData['bot_patterns'] ?? [];
|
||||
?>
|
||||
|
||||
<?php if ($_statsSaved): ?>
|
||||
@@ -21,12 +22,13 @@ $_ipData = $adminData['stats_ip_data'] ?? [];
|
||||
</div>
|
||||
<?php else: ?>
|
||||
|
||||
<p class="text-muted small mb-4">14 derniers jours · visiteurs uniques · flux RSS XML</p>
|
||||
<p class="text-muted small mb-4">14 derniers jours · tous les chemins · flux RSS XML</p>
|
||||
|
||||
<script>
|
||||
var FOLIO_PAGES_BY_DAY = <?= json_encode($_pagesByDay, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) ?>;
|
||||
var FOLIO_AS_LIST = <?= json_encode($_asList, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) ?>;
|
||||
var FOLIO_IP_DATA = <?= json_encode($_ipData, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) ?>;
|
||||
var FOLIO_PAGES_BY_DAY = <?= json_encode($_pagesByDay, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) ?>;
|
||||
var FOLIO_AS_LIST = <?= json_encode($_asList, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) ?>;
|
||||
var FOLIO_IP_DATA = <?= json_encode($_ipData, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) ?>;
|
||||
var FOLIO_BOT_PATTERNS = <?= json_encode($_botPatterns, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) ?>;
|
||||
</script>
|
||||
|
||||
<div class="card mb-4">
|
||||
@@ -49,7 +51,6 @@ var FOLIO_IP_DATA = <?= json_encode($_ipData, JSON_UNESCAPED_SLASHES | JSON
|
||||
</div>
|
||||
|
||||
<div class="row g-4">
|
||||
|
||||
<!-- Livres -->
|
||||
<div class="col-lg-6">
|
||||
<div class="card h-100">
|
||||
@@ -65,7 +66,7 @@ var FOLIO_IP_DATA = <?= json_encode($_ipData, JSON_UNESCAPED_SLASHES | JSON
|
||||
<table class="table table-sm table-hover mb-0 small">
|
||||
<tbody>
|
||||
<?php
|
||||
$maxB = max($_books) ?: 1;
|
||||
$maxB = max($_books) ?: 1;
|
||||
$rankB = 0;
|
||||
foreach ($_books as $url => $hits):
|
||||
$rankB++;
|
||||
@@ -94,10 +95,35 @@ var FOLIO_IP_DATA = <?= json_encode($_ipData, JSON_UNESCAPED_SLASHES | JSON
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /row -->
|
||||
|
||||
<!-- Agents détectés -->
|
||||
<div class="card mt-4">
|
||||
<div class="card-header bg-transparent py-2 small fw-semibold d-flex justify-content-between align-items-center">
|
||||
<span>Agents détectés <span class="text-muted fw-normal" id="agents-count"></span></span>
|
||||
<button class="btn btn-sm btn-outline-secondary py-0" type="button"
|
||||
data-bs-toggle="collapse" data-bs-target="#agents-edit-panel">
|
||||
Gérer les patterns
|
||||
</button>
|
||||
</div>
|
||||
<div class="card-body p-0" id="stats-agents-container">
|
||||
<p class="text-muted p-3 mb-0">Chargement…</p>
|
||||
</div>
|
||||
|
||||
<!-- Panneau d'édition des patterns bots -->
|
||||
<div id="agents-edit-panel" class="collapse">
|
||||
<div class="card-footer bg-transparent border-top p-3">
|
||||
<p class="small text-muted mb-2">Un pattern par ligne (correspondance insensible à la casse, recherche partielle dans le User-Agent).</p>
|
||||
<form method="post" action="/?action=admin_save_bots">
|
||||
<input type="hidden" name="_csrf" value="<?= htmlspecialchars($_session['csrf'] ?? '') ?>">
|
||||
<textarea name="bot_patterns" class="form-control form-control-sm font-monospace mb-2"
|
||||
rows="12" style="font-size:.75rem"><?= htmlspecialchars(implode("\n", $_botPatterns)) ?></textarea>
|
||||
<button type="submit" class="btn btn-sm btn-primary">Enregistrer les patterns</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php endif; // readable?>
|
||||
|
||||
|
||||
<script src="/assets/js/admin-stats.js" defer></script>
|
||||
|
||||
Reference in New Issue
Block a user