Des robots remettent périodiquement mes stats à zéro

Eléphanteau du PHP | 12 Messages

24 juin 2024, 08:02

Bonjour. J'écris des chansons que je mets sur mon site jpjb.eu.
Je suis nul en php, mais j'ai réussi en piquant des bouts de code à droite à gauche, à concocter une fonction de stats pour voir quelles chansons ont été écoutées (à la page d'accueil index.php). J'ai fait ça il y a trois ans, et ça marchait très bien au début, mais au fil du temps, j'ai des stats irréalistes, sans doute à cause des nombreux robots qui scannent tout. Je suppose qu'il n'y a aucune parade à ça, car je veux tout de même être référencé par Goût-gueule ou d'autres.

Mais mon problème est que de temps en temps (souvent dans la nuit du dimanche au lundi), ma page de stats est remise à zéro. Sans aller dans les détails pour l'instant, j'aimerais savoir si c'est un problème connu et s'il y a une parade à cela.

Merci d'avance et bonne journée. Rimpotche

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 juin 2024, 15:03

Bonjour,

Tout dépend de comment tu as réalisé ton compteur de stats.
Et notamment si tu as une fonction pour le remettre à zéro, car si c'est le cas, elle ne devrait pas être accessible publiquement et donc quand c'est fait dans les règles de l'art c'est totalement impossible qu'un robot puisse remettre à zéro des stats.

A noter qu'il existe un outil de stats gratuit que tu peux installer toi même qui s'appelle Matomo et qu'il est très complet :
https://fr.matomo.org/matomo-on-premise/
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 12 Messages

24 juin 2024, 17:07

Salut et merci pour la réponse. Au début, j'avais un fichier pour remettre à zéro en ligne. Mais quand le problème a commencé, je l'ai retiré et je resette depuis toujours à froid. La seule possibilité en ce cas, et pour mon niveau, c'est qu'un site ait gardé ce fichier. C'est un fichier texte qui est généré et il avait l'extension .txt. Je l'ai changé en extension .jac, qui ne doit pas être courante...

A propos de ton "tout dépend", j'ai laissé l'adresse du site dans mon premier message, donc si quelqu'un est assez compétent et aimable pour zyeuter mon code...

Merci pour le lien vers matomo, j'ai survolé et je retournerai étudier de plus près.

Mammouth du PHP | 2703 Messages

24 juin 2024, 17:36

code html horrible mais nul part de trace de stats. c'est normal si c'est fait en php.
donc sans nous en dire plus, on ne peut pas vous aider.

Eléphanteau du PHP | 12 Messages

25 juin 2024, 08:46

CORRECTION. Merci au modérateur d'enlever mon précédent message. Désolé, mais je n'ai pas l'habitude des forums.

Code : Tout sélectionner

<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Chansons de Jac PETIT-JEAN-BORET</title> <style type="text/css"> </style> </head> <body id="chansonsbody" onload="init()"> <div id="listes"> <?php $categs['lhelp'] = '../audio/chansons3/listes-help.htm'; // // J'ai omis une longue série de listes pour alléger // if(!empty($_GET['page']) && array_key_exists($_GET['page'], $pages)) { $page = $_GET['page']; } include($pages[$page]); $filenamec = '../hitchansons.jac'; $handlec = fopen($filenamec, 'r'); $outbufferc = ''; $foundc = false; $hitsc = 1; // reading data from file while ( !feof( $handlec ) ) { $bufferc = trim( fgets( $handlec ) ); if ( strlen( $bufferc ) > 0 ) { list( $pagef, $countc, $title ) = explode( '|', $bufferc ); if ( !$foundc && $pagef == $page ) { $hitsc = $countc + 1; $outbufferc .= $page . '|' . $hitsc . '|' . $title . "\n"; $foundc = true; } else { $outbufferc .= $bufferc . "\n"; } } } fclose($handlec); if (!$foundc) { $outbufferc .= $page . "|1\n"; } // writing updated data to file $handlec = fopen($filenamec, 'w'); fwrite($handlec, $outbufferc); fclose($handlec); // hits counter end --------------------- ?> </div> </body> <script type="text/javascript"> function init() { element = document.body; return; }; </script> </html>

Eléphanteau du PHP | 12 Messages

28 juin 2024, 20:16

Je suis passé aux oubliettes, on dirait...

Avatar du membre
Mammouth du PHP | 1609 Messages

03 juil. 2024, 13:40

Salut, le mode w vide le fichier je ne vois donc même pas comment vous pourriez avoir plus d'une ligne à la fois dans ce fichier.
'w' Ouvre en écriture seule ; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.

Sinon quitte à rechercher la ligne correspondant à la chanson pour incrémenter son compteur puis à insérer une nouvelle ligne pour cette même chanson alors qu'une ligne est déjà présente, il serait surement plus confortable d'utiliser un tableau et de le sérialiser.
$filepath = '../hitchansons.jac';
$hits = file_exists($filepath) ? unserialize(file_get_contents($filepath)) : [];

if (!isset($hits[$page])) {
    $hits[$page] = 0;
}

$hits[$page]++;
file_put_contents($filepath, serialize($hits));
Le fichier ne doit pas exister lors du premier appel de ce code pour éviter une erreur sur le unserialize.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 12 Messages

06 juil. 2024, 11:28

Merci beaucoup, Saian,
A première vue, je ne comprends pas grand chose, mais je vais faire des essais en ce sens...

Avatar du membre
Mammouth du PHP | 1609 Messages

06 juil. 2024, 14:45

On regarde si le fichier existe (file_exists), si il existe on récupère son contenu (file_get_contents) qu'on désérialise (unserialize) et qui est sensé être un tableau avec les compteurs par page. S'il n'existe pas on créé un tableau vide ([]).
Ensuite on regarde si le compteur de la page existe (isset), s'il n'existe pas on l'initialise à 0.
Ensuite on incrémente le compteur de 1 (++), puis finalement on remplace le contenu du fichier (file_put_contents) en sérialisant (serialize) le tableau mis à jour.
Développeur web depuis + de 20 ans