Stats : détail articles/books/recherches par réseau, par pays et par visiteur #92
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
La page
/admin/statsaffiche actuellement la répartition des visites par réseau (ASN) (nombre de hits total par AS). Elle ne précise pas ce que chaque réseau consulte, et ne propose pas de vue par pays ni par visiteur individuel.Problème
On ne peut pas savoir, pour un réseau donné (ex : un opérateur, un bot, un hébergeur) ou un pays donné :
Idem par visiteur (IP) : pas de vue permettant de voir le comportement d'un visiteur spécifique.
Ce qu'on veut
1. Vue par réseau (ASN) — détail du contenu
Dans le tableau "Répartition par réseau", rendre chaque ligne cliquable pour afficher un sous-détail avec :
/post/…) consultés par ce réseau/book/…) consultés par ce réseau2. Vue par pays
Ajouter un tableau "Répartition par pays" listant les pays classés par hits, avec pour chaque pays le même sous-détail dépliable (articles / books / recherches les plus consultés depuis ce pays).
3. Vue par visiteur (IP)
Ajouter une section "Par visiteur" listant les IPs les plus actives, avec pour chaque IP :
AsnLookup)Données disponibles
AccessLogParser::stats()retourne déjàpages,books,ips(hits par IP, triés)AsnLookuprésout déjà les 200 premières IPs → nom de réseau, ASN, paysSearchLogParserfournit les recherches (à corréler avec l'IP)Travail technique à faire
AccessLogParser: enrichirstats()(ou ajouterstatsByIp()) pour retourner, par IP, le détail despagesetbooksconsultésindex.php, actionadmin/ tabstats) :stats_visitors: top IPs avec détail contenu + résolution ASN/paysstats_as_detail: top articles/books/recherches par ASNstats_countries: agrégation par pays (depuis le champcountrydeAsnLookup) avec détail contenuadmin_stats.php) :Critères d'acceptation
Maquette approximative
Compléments après relecture du code
1. Sélecteur de période manquant
L'onglet Recherches accepte déjà
?days=7|14(ligne 2686 deindex.php), mais l'onglet Stats est figé à 14j ($cutoff14hardcodé ligne 2708). Il faudra aligner les deux : les vues par réseau / pays / visiteur doivent respecter le même filtre de période que les recherches.2.
SearchLogParserne permet pas la corrélation IP ↔ termesSearchLogParser::parseLine()stocke déjà les IPs en interne ($visitors[$q][$ip]), mais seuletopTerms()est exposée (comptage agrégé). Pour afficher les recherches dans le sous-détail par visiteur / réseau / pays, il faudra ajouter une méthodetermsByIp()retournant[ip => [terme => count]]— sans quoi la corrélation recherche ↔ IP est impossible sans re-parser les logs une 2e fois.3. Bots / crawlers non isolés
Le log Apache COMBINED contient le User-Agent (champ capturé dans le commentaire du regex de
AccessLogParsermais non parsé). Actuellement, toutes les vues (réseau, pays, visiteur) mélangent bots et trafic humain : un crawler actif gonfle les stats d'un AS ou d'un pays entier. Il faudrait :parseLine()Note d'implémentation :
AsnLookup::batchLookupne résout que le top 200 IPs (array_slice(..., 0, 200)dansindex.php). Pour la vue visiteur ce plafond est correct côté perf, mais il faut le documenter — les IPs au-delà du top 200 n'auront pas de résolution ASN/pays.