« PageUpdaterBot » : différence entre les versions

De Wikipast
Aller à la navigation Aller à la recherche
(Annulation des modifications 37590 de Orthobot (discussion))
 
(31 versions intermédiaires par 7 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
<!-- PUB METAINFOS : ID = &beginID&149&endID& -->
<!-- PUB METAINFOS : ID = &beginID&1632&endID& -->
= Résumé des fonctionnalités =
= Résumé des fonctionnalités =
[[PageUpdaterBot]] est un robot qui s'occupe de compléter les différentes pages sur Wikipast à partir d'hyperliens. [[PageUpdaterBot]] vérifie que sur chaque page, tous les hyperliens (excepté les dates) mènent vers une page existante et que les entrées correspondantes existent et soient placées aux bons endroits.  Si la page associée à l'hyperlien n'existe pas, [[PageUpdaterBot]] crée la page et place l'entrée associée dans cette page.
[[PageUpdaterBot]] est un robot qui s'occupe de compléter les différentes pages sur Wikipast à partir d'hyperliens. [[PageUpdaterBot]] vérifie que sur chaque page, tous les hyperliens (excepté les dates) mènent vers une page existante et que les entrées correspondantes existent et soient placées aux bons endroits.  Si la page associée à l'hyperlien n'existe pas, [[PageUpdaterBot]] crée la page et place l'entrée associée dans cette page.


= Description technique =
= Description technique =
[[PageUpdaterBot]] va analyser le contenu de la page entrée par entrée. Pour chaque entrée, le bot extrait les hyperliens qu'elle contient, en excluant la date et celui de la page en cours d'analyse. [[PageUpdaterBot]] va ensuite vérifier que chaque hyperlien redirige vers une page existante, que l'entrée existe bien dans cette page et qu'elle est placée au bon endroit. Si l'un de ces trois critères n'est pas remplis, [[PageUpdaterBot]] va créer la page, ajouter l'entrée, ou réordonner chronologiquement les entrées. Afin de faciliter le traitement, un ''PUB_id'' est associé à chaque entrée sous la forme d'un commentaire <code><nowiki><!-- PUB METAINFOS : entryID = &beginID&42&endID& entryHash = &beginHASH&6936b65604c6f91fab6552c2b2bdad9a&endHASH& --></nowiki></code> placé à la fin de la ligne.  
La principale fonction de [[PageUpdaterBot]] est de répercuter les modifications faites sur une page particulière sur toutes les autres pages concernée par l'entrée. [[PageUpdaterBot]] commence par analyser le contenu de chaque page entrée par entrée. Pour chacune d'entre elles, le bot extrait les hyperliens qu'elle contient,à l'exception de la date et de celui de la page en cours d'analyse.  


Une des principales fonctions de [[PageUpdaterBot]] est de répercuter les modifications faites sur une page particulière sur toutes les autres pages concernée par l'entrée. Le cas où des entrées seraient présentes sous des formes différentes sur deux pages est donc pris en charge. Pour vérifier que les entrées sont les mêmes, leurs ''PUB_id'' sont comparés. Pour déterminer quelle entrée a été modifiée en dernier, un hash de l'entrée est ajouté au ''PUB_id''. Si le hash de l'entrée ne correspond plus à celui stocké, c'est que cette ligne à été modifiée. C'est donc cette entrée qui sera copiée sur toutes les pages. Si les deux entrées sont modifiées, la première que rencontre le bot sera conservée. Si une entrée de la page mère n'a pas de ''PUB_id'', l'algorithme lui en donnera un. Si une entrée de la page fille ne possédait pas de ''PUB_id'', la liste d'hyperliens et de références qu'elle contient est comparée avec toutes celle de la page mère. Si une correspondance est trouvée, les ''PUB_id'' correspondants seront ajoutés.
[[PageUpdaterBot]] va exécuter une action dans trois différents cas: si la page référencée dans l'hyperlien n'existe pas, si l'entrée en question n'est pas présente dans la page référencée ou si une entrée a été modifiée dans l'une des deux pages. Dans le premier cas, [[PageUpdaterBot]] crée la page et y ajoute l'entrée. Dans le deuxième cas, il ajoute l'entrée à la liste présente dans la page référencée puis trie toutes les entrées par ordre chronologique. Dans le dernier cas, l'entrée la plus récente remplace l'entrée la plus ancienne.  
Afin de faciliter le traitement, un commentaire est associé à chaque entrée. Le commentaire possède la forme suivante :  <code><nowiki> <!-- PUB METAINFOS : entryID = &beginID&42&endID& entryHash = &beginHASH&6936b65604c6f91fab6552c2b2bdad9a&endHASH& --> </nowiki></code>. Il est placé à la suite de l'entrée dans le code source de la page. Pour chaque entrée, [[PageUpdaterBot]] vérifie tout d'abord qu'elle possède un id et un hash. Si tel n'est pas le cas, il lui ajoute un nouvel id et un nouvel hash, qui n'est rien d'autre que le md5 du texte de l'entrée. Le dernier id utilisé sur wikipast est écrit dans le commentaire au somment de la présente page. Si l'entrée possède un commentaire, dans le cas où [[PageUpdaterBot]] est déjà passé une fois, [[PageUpdaterBot]] va aller sur les pages référencées par les hyperliens, appelées pages filles par la suite. Plusieurs cas de figure sont considérés. Si l'entrée est absente de la page fille (l'id ne s'y trouve pas), c'est qu'elle a été supprimée manuellement. L'entrée est supprimée de la page mère. Si l'entrée est encore présente sur la page fille (une entrée avec le même id s'y trouve ou une entrée sans commentaire mais contenant les mêmes hyperliens et références), le bot compare l'entrée sur les deux pages avec leur hash respectif. Si le hash de l'entrée ne correspond plus au hash écrit dans le commentaire, c'est que l'entrée a été modifiée depuis le dernier passage de [[PageUpdaterBot]]. L'entrée avec le hash différent est gardée sur les deux pages. Le hash est mis à jour.  


[[PageUpdaterBot]] possède aussi un mode de nettoyage, qui supprime les ''PUB_id'' dans toutes les pages de Wikipast. Pour cela il faut l'appeler avec le paramètre ''clean''.
[[PageUpdaterBot]] possède aussi un mode de nettoyage, qui supprime les ''PUB_id'' dans toutes les pages de Wikipast. Pour cela il faut l'appeler avec le paramètre ''clean''.
Ligne 16 : Ligne 18 :


Sur le Wikipast du 16.05.17, le script a trié toute la base de donnée en 2 minutes 10 secondes. Comme le script s'arrête quand il y a du texte entre deux entrées, [[PageUpdaterBot]] n'a considéré que un quart des entrées au premier passage du script.
Sur le Wikipast du 16.05.17, le script a trié toute la base de donnée en 2 minutes 10 secondes. Comme le script s'arrête quand il y a du texte entre deux entrées, [[PageUpdaterBot]] n'a considéré que un quart des entrées au premier passage du script.
Sur le Wikipast du 16.05.17, le script a nettoyé toute la base de donnée en 1 minute 1 seconde.
Sur le Wikipast du 16.05.17, le script a trié toute la base de donnée en 5 minutes 14 secondes.


== Fréquence d'utilisation / Scheduling du bot ==
== Fréquence d'utilisation / Scheduling du bot ==
Ligne 22 : Ligne 28 :


== Limites du bot ==
== Limites du bot ==
Le traitement que peut être source d'erreur si un utilisateur maladroit modifie accidentellement le ''PUB_id'' à la fin de chaque entrée, ce qui rend ce bot vulnérable au mauvais comportement des utilisateurs. Il serait envisageable d'ajouter une sorte de "checksum" pour contrôler si le commentaire a été affecté par un utilisateur et dans ce cas recommencer la construction des IDs à partir de zéro. De plus, dans le cas où une section contiendrait des entrées sous forme de liste, puis quelques paragraphes de textes, et enfin à nouveau une liste d'entrée, seul la première liste d'entrée sera prise en charge.
Le traitement peut être source d'erreur si un utilisateur maladroit modifie accidentellement le ''PUB_id'' à la fin de chaque entrée, ce qui rend ce bot vulnérable au mauvais comportement des utilisateurs. Il serait envisageable d'ajouter une sorte de "checksum" pour contrôler si le commentaire a été affecté par un utilisateur et dans ce cas recommencer la construction des IDs à partir de zéro. De plus, dans le cas où une section contiendrait des entrées sous forme de liste, puis quelques paragraphes de textes, et enfin à nouveau une liste d'entrée, seul la première liste d'entrée sera prise en charge.


Dans le cas ou deux entrées ayant le même ''PUB_id'' ont été modifiées de façon différente, la modification ne sera pas répercutées sur toutes les pages au premier passage du bot. Il faudra un nouveau passage pour unifier toutes les entrées.
Dans le cas ou deux entrées ayant le même ''PUB_id'' ont été modifiées de façon différente, la modification ne sera pas répercutées sur toutes les pages au premier passage du bot. Il faudra un nouveau passage pour unifier toutes les entrées.
Ligne 32 : Ligne 38 :
Un utilisateur met à jour la page [[Henri Dunant]] et entre l'information suivante :
Un utilisateur met à jour la page [[Henri Dunant]] et entre l'information suivante :


*[[1864.08.22]] / [[Genève]]. [[Création]] par [[Henri Dunant]] de la [[Croix rouge]]. [http://letemps.archives.world/page/JDG_1897_12_31/1/%22Henri%20Dunant%22]<!-- PUB METAINFOS : entryID = &beginID&144&endID& entryHash = &beginHASH&803106f9c58254cba3a7d0bc156c36fd&endHASH& -->
*[[1864.08.22]] / [[Genève]]. [[Création]] par [[Henri Dunant]] de la [[Croix rouge]]. [http://letemps.archives.world/page/JDG_1897_12_31/1/%22Henri%20Dunant%22]


En admettant que l'entrée n'est pas encore présente dans [[Genève]], [[Création]] et que la page [[Croix rouge]] n'existe pas, le bot commence par associer un ''PUB_id'' à la nouvelle entrée et copie la ligne dans la page [[Genève]] ainsi que [[Création]]. Le bot trie chronologiquement les entrées dans chacune des 2 pages. L'entrée se retrouve donc à la bonne place. Comme la page [[Croix rouge]] n'existe pas, le bot crée la page et recopie la ligne dans cette nouvelle page. Finalement, les entrées de la page [[Henri Dunant]] sont ordonnées chronologiquement.
En admettant que l'entrée n'est pas encore présente dans [[Genève]], [[Création]] et que la page [[Croix rouge]] n'existe pas, le bot commence par associer un ''PUB_id'' à la nouvelle entrée et copie la ligne dans la page [[Genève]] ainsi que [[Création]]. Le bot trie chronologiquement les entrées dans chacune des 2 pages. L'entrée se retrouve donc à la bonne place. Comme la page [[Croix rouge]] n'existe pas, le bot crée la page et recopie la ligne dans cette nouvelle page. Finalement, les entrées de la page [[Henri Dunant]] sont ordonnées chronologiquement.
Ligne 42 : Ligne 48 :
Un utilisateur met à jour la page [[Création]] et supprime l'information suivante :
Un utilisateur met à jour la page [[Création]] et supprime l'information suivante :


*[[1864.08.22]] / [[Genève]]. [[Création]] par [[Henri Dunant]] de la [[Croix rouge]]. [http://letemps.archives.world/page/JDG_1897_12_31/1/%22Henri%20Dunant%22]<!-- PUB METAINFOS : entryID = &beginID&144&endID& entryHash = &beginHASH&803106f9c58254cba3a7d0bc156c36fd&endHASH& -->
*[[1864.08.22]] / [[Genève]]. [[Création]] par [[Henri Dunant]] de la [[Croix rouge]]. [http://letemps.archives.world/page/JDG_1897_12_31/1/%22Henri%20Dunant%22]


Le bot supprime l'entrée dans les pages [[Croix rouge]], [[Henri Dunant]] et [[Genève]] en détectant qu'un id est associé à une entrée dans ces 3 pages mais pas dans la page [[Création]].
Le bot supprime l'entrée dans les pages [[Croix rouge]], [[Henri Dunant]] et [[Genève]] en détectant qu'un id est associé à une entrée dans ces 3 pages mais pas dans la page [[Création]].
Ligne 71 : Ligne 77 :
== Code ==
== Code ==
Le code est disponible sur le [https://github.com/cedricviaccoz/PageUpdaterBot repository GitHub]
Le code est disponible sur le [https://github.com/cedricviaccoz/PageUpdaterBot repository GitHub]
[[PageUpdaterBot BioPathBot]]

Dernière version du 30 mai 2017 à 11:39

Résumé des fonctionnalités

PageUpdaterBot est un robot qui s'occupe de compléter les différentes pages sur Wikipast à partir d'hyperliens. PageUpdaterBot vérifie que sur chaque page, tous les hyperliens (excepté les dates) mènent vers une page existante et que les entrées correspondantes existent et soient placées aux bons endroits. Si la page associée à l'hyperlien n'existe pas, PageUpdaterBot crée la page et place l'entrée associée dans cette page.

Description technique

La principale fonction de PageUpdaterBot est de répercuter les modifications faites sur une page particulière sur toutes les autres pages concernée par l'entrée. PageUpdaterBot commence par analyser le contenu de chaque page entrée par entrée. Pour chacune d'entre elles, le bot extrait les hyperliens qu'elle contient,à l'exception de la date et de celui de la page en cours d'analyse.

PageUpdaterBot va exécuter une action dans trois différents cas: si la page référencée dans l'hyperlien n'existe pas, si l'entrée en question n'est pas présente dans la page référencée ou si une entrée a été modifiée dans l'une des deux pages. Dans le premier cas, PageUpdaterBot crée la page et y ajoute l'entrée. Dans le deuxième cas, il ajoute l'entrée à la liste présente dans la page référencée puis trie toutes les entrées par ordre chronologique. Dans le dernier cas, l'entrée la plus récente remplace l'entrée la plus ancienne.

Afin de faciliter le traitement, un commentaire est associé à chaque entrée. Le commentaire possède la forme suivante : <!-- PUB METAINFOS : entryID = &beginID&42&endID& entryHash = &beginHASH&6936b65604c6f91fab6552c2b2bdad9a&endHASH& --> . Il est placé à la suite de l'entrée dans le code source de la page. Pour chaque entrée, PageUpdaterBot vérifie tout d'abord qu'elle possède un id et un hash. Si tel n'est pas le cas, il lui ajoute un nouvel id et un nouvel hash, qui n'est rien d'autre que le md5 du texte de l'entrée. Le dernier id utilisé sur wikipast est écrit dans le commentaire au somment de la présente page. Si l'entrée possède un commentaire, dans le cas où PageUpdaterBot est déjà passé une fois, PageUpdaterBot va aller sur les pages référencées par les hyperliens, appelées pages filles par la suite. Plusieurs cas de figure sont considérés. Si l'entrée est absente de la page fille (l'id ne s'y trouve pas), c'est qu'elle a été supprimée manuellement. L'entrée est supprimée de la page mère. Si l'entrée est encore présente sur la page fille (une entrée avec le même id s'y trouve ou une entrée sans commentaire mais contenant les mêmes hyperliens et références), le bot compare l'entrée sur les deux pages avec leur hash respectif. Si le hash de l'entrée ne correspond plus au hash écrit dans le commentaire, c'est que l'entrée a été modifiée depuis le dernier passage de PageUpdaterBot. L'entrée avec le hash différent est gardée sur les deux pages. Le hash est mis à jour.

PageUpdaterBot possède aussi un mode de nettoyage, qui supprime les PUB_id dans toutes les pages de Wikipast. Pour cela il faut l'appeler avec le paramètre clean.

Discussion

Performances

L'algorithme possède une complexité en O(n^2) par page. En effet, PageUpdaterBot compare toutes les entrées de la page mère avec toutes celles de la page fille. Le bot a des performances raisonnables compte tenu du faible nombre de pages contenu sur WikiPast.

Sur le Wikipast du 16.05.17, le script a trié toute la base de donnée en 2 minutes 10 secondes. Comme le script s'arrête quand il y a du texte entre deux entrées, PageUpdaterBot n'a considéré que un quart des entrées au premier passage du script.

Sur le Wikipast du 16.05.17, le script a nettoyé toute la base de donnée en 1 minute 1 seconde.

Sur le Wikipast du 16.05.17, le script a trié toute la base de donnée en 5 minutes 14 secondes.

Fréquence d'utilisation / Scheduling du bot

Ce bot devrait être appliqué une fois par jour au wiki.

Limites du bot

Le traitement peut être source d'erreur si un utilisateur maladroit modifie accidentellement le PUB_id à la fin de chaque entrée, ce qui rend ce bot vulnérable au mauvais comportement des utilisateurs. Il serait envisageable d'ajouter une sorte de "checksum" pour contrôler si le commentaire a été affecté par un utilisateur et dans ce cas recommencer la construction des IDs à partir de zéro. De plus, dans le cas où une section contiendrait des entrées sous forme de liste, puis quelques paragraphes de textes, et enfin à nouveau une liste d'entrée, seul la première liste d'entrée sera prise en charge.

Dans le cas ou deux entrées ayant le même PUB_id ont été modifiées de façon différente, la modification ne sera pas répercutées sur toutes les pages au premier passage du bot. Il faudra un nouveau passage pour unifier toutes les entrées.

Si une entrée est mal conçue et ne contient pas l'hyperlien de sa propre page, le bot ajoutera l'entrée sur les pages référencées mais une modification sur un de ces dernières n'entrainera pas la modification sur la page de base. (Voir exemple 3)

Exemples

Exemple 1

Un utilisateur met à jour la page Henri Dunant et entre l'information suivante :

En admettant que l'entrée n'est pas encore présente dans Genève, Création et que la page Croix rouge n'existe pas, le bot commence par associer un PUB_id à la nouvelle entrée et copie la ligne dans la page Genève ainsi que Création. Le bot trie chronologiquement les entrées dans chacune des 2 pages. L'entrée se retrouve donc à la bonne place. Comme la page Croix rouge n'existe pas, le bot crée la page et recopie la ligne dans cette nouvelle page. Finalement, les entrées de la page Henri Dunant sont ordonnées chronologiquement.

De plus, un hash est associé à chacune des entrées afin de détecter une quelconque modification et ainsi mettre à jour les pages qui y sont référencées.

Exemple 2

Un utilisateur met à jour la page Création et supprime l'information suivante :

Le bot supprime l'entrée dans les pages Croix rouge, Henri Dunant et Genève en détectant qu'un id est associé à une entrée dans ces 3 pages mais pas dans la page Création.

Exemple 3

Un utilisateur met à jour la page Henri Dunant et écrit une entrée problématique :

Le bot modifie l'entrée sur la page Croix rouge. Puis un autre utilisateur supprime l'entrée sur la page Croix rouge. Le bot ne supprimera pas l'entrée sur la page Henri Dunant car aucun hyperlien la référençant n'est présent.

Groupe

Nom et Prénom
Fournier Romain
Giorla Matteo
Pannatier Arnaud
Viaccoz Cédric

Code

Le code est disponible sur le repository GitHub

PageUpdaterBot BioPathBot