« Chronobot » : différence entre les versions

De Wikipast
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
(Wikipastbot update)
Ligne 3 : Ligne 3 :
[[Chronobot]] est un bot programmé en langage [[Python]] et qui agit sur des pages [[Wikipast]]. Il permet de regrouper tous les événements qui se sont passés en une année dans une même page
[[Chronobot]] est un bot programmé en langage [[Python]] et qui agit sur des pages [[Wikipast]]. Il permet de regrouper tous les événements qui se sont passés en une année dans une même page
=Fonctionnement=
=Fonctionnement=
[[Chronobot]] va d'abord effectuer un scan sur l'ensemble des pages biographiques crées par les élèves du cours "Humanités Digitales" (2017). Il effectue ensuite un scan sur tous les événements relevés dans chaque page et en stocke la date (sous forme AAAA.MM.JJ) et la description dans une liste. Une fois cette liste en main, il crée une page pour chaque jour différent. Pour des raisons pratiques, il est plus logique de n'avoir qu'une seule page par année avec tous les événements relevés durant cette année classés chronologiquement. Pour ce faire, au lieu d'agir directement sur l'url de la page, [[Chronobot]] redirige chaque lien d'un jour vers l'url de l'année correspondante. Enfin, il y écrit l'événement en bas de la page de l'année correspondante. Quand il finit le scan, il ordonne tous les événements des pages années qui ont été modifiées. La gestion des doublons est résolue ultérieurement.
[[Chronobot]] va d'abord effectuer un <span style="color:red">scan</span> (correction(s): <span style="color:green">scat
</span>) sur l'ensemble des pages biographiques <span style="color:red">crées</span> (correction(s): <span style="color:green">créées, curées, cirées, créés, criées, crée, créer, ocrées, cries, créez, crues
</span>) par les élèves du cours "Humanités Digitales" (2017). Il effectue ensuite un <span style="color:red">scan</span> (correction(s): <span style="color:green">scat
</span>) sur tous les événements relevés dans chaque page et en stocke la date (sous forme AAAA.MM.JJ) et la description dans une liste. Une fois cette liste en main, il crée une page pour chaque jour différent. Pour des raisons pratiques, il est plus logique de n'avoir qu'une seule page par année avec tous les événements relevés durant cette année classés chronologiquement. Pour ce faire, au lieu d'agir directement sur l'<span style="color:red">url</span> (correction(s): <span style="color:green">urf
</span>) de la page, [[Chronobot]] redirige chaque lien d'un jour vers l'<span style="color:red">url</span> (correction(s): <span style="color:green">urf
</span>) de l'année correspondante. Enfin, il y écrit l'événement en bas de la page de l'année correspondante. Quand il finit le <span style="color:red">scan</span> (correction(s): <span style="color:green">scat
</span>), il ordonne tous les événements des pages années qui ont été modifiées. La gestion des doublons est résolue ultérieurement.


==Généralités==
==Généralités==
Ligne 11 : Ligne 17 :
==Liste des fonctions==
==Liste des fonctions==
=== Fonctions principales ===
=== Fonctions principales ===
* ''select_page.py'' parcourt les différentes pages sur une séléection précise de Users (ceux du cours SHS) et en retourne les pages crées sous formes de chaînes brutes (String). Les images (.png) sont ôtées ainsi que
* ''select_page.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
* ''recherchedates.py'' prend en argument une page donnée (string) et en sort une liste année/événement
</span>)'' parcourt les différentes pages sur une <span style="color:red">séléection</span> (correction(s): <span style="color:green">sélection
* ''modify_links.py'' modifie toutes les pages des dates pour qu'elles soient redirigées vers la page de l'année.  
</span>) précise de Users (ceux du cours SHS) et en retourne les pages <span style="color:red">crées</span> (correction(s): <span style="color:green">créées, curées, cirées, créés, criées, crée, créer, ocrées, cries, créez, crues
* ''create_new_site.py'' crée une page [[Wikipast]] avec le contenu donné
</span>) sous formes de chaînes brutes (String). Les images (.<span style="color:red">png</span> (correction(s): <span style="color:green">
* ''order.py'' ordonne une page dans l'ordre chronologique et ''order_all.py'' effectue ''order.py'' sur toutes les pages une fois qu'elles sont toutes écrites.
</span>)) sont ôtées ainsi que
* ''place_evenement.py'' écrit un événement dans une page.
* ''<span style="color:red">recherchedates</span> (correction(s): <span style="color:green">
* ''event_not_in_page.py'' gère les doublons en comparant deux strings-évenements caractère par caractère. Il considère ainsi deux évenements identiques s'ils contiennent les mêmes suites de caractères. Il ne tient pas compte des virgules (,), points (.) et espaces ( ) s'ils sont différents dans les deux strings.   
</span>).<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)'' prend en argument une page donnée (string) et en sort une liste année/événement
* ''<span style="color:red">modify</span> (correction(s): <span style="color:green">
</span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins
</span>).<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)'' modifie toutes les pages des dates pour qu'elles soient <span style="color:red">redirigées</span> (correction(s): <span style="color:green">
</span>) vers la page de l'année.  
* ''<span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_new_site.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)'' crée une page [[Wikipast]] avec le contenu donné
* ''<span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>).<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)'' ordonne une page dans l'ordre chronologique et ''<span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>).<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)'' effectue ''<span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>).<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)'' sur toutes les pages une fois qu'elles sont toutes écrites.
* ''place_<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>).<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)'' écrit un événement dans une page.
* ''event_not_in_page.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)'' gère les doublons en comparant deux strings-<span style="color:red">évenements</span> (correction(s): <span style="color:green">évènements, événements
</span>) caractère par caractère. Il considère ainsi deux <span style="color:red">évenements</span> (correction(s): <span style="color:green">évènements, événements
</span>) identiques s'ils contiennent les mêmes suites de caractères. Il ne tient pas compte des virgules (,), points (.) et espaces ( ) s'ils sont différents dans les deux strings.   
=== Fonctions secondaires ===
=== Fonctions secondaires ===
* ''retrieve_content.py'' prend en input le nom d'une page et retourne tout le texte contenu en syntaxe wiki.
* ''<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
* ''split_date.py'' prend en input une date 'aaaa.mm.jj' et retourne une array [année, mois, jour].
</span>)_content.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)'' prend en input le nom d'une page et retourne tout le texte contenu en syntaxe <span style="color:red">wiki</span> (correction(s): <span style="color:green">kiki, tiki
</span>).
* ''<span style="color:red">split</span> (correction(s): <span style="color:green">salit
</span>)_date.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)'' prend en input une date '<span style="color:red">aaaa</span> (correction(s): <span style="color:green">
</span>).mm.<span style="color:red">jj</span> (correction(s): <span style="color:green">je, j, jà
</span>)' et retourne une <span style="color:red">array</span> (correction(s): <span style="color:green">
</span>) [année, mois, jour].


=Exemples de pages créées=
=Exemples de pages créées=
* [[1990.02.23]] -> redirection vers [[1990]]
* [[1990.02.23]] -> <span style="color:red">redirection</span> (correction(s): <span style="color:green">
* [[1990.06]] -> redirection vers [[1990]]
</span>) vers [[1990]]
* [[1990.06]] -> <span style="color:red">redirection</span> (correction(s): <span style="color:green">
</span>) vers [[1990]]
* [[1990]]
* [[1990]]


=Critiques et faiblesses du bot=
=Critiques et faiblesses du bot=
* Optimisation du code (plusieurs minutes pour s'exéctuer sur toutes les pages.)  
* Optimisation du code (plusieurs minutes pour s'<span style="color:red">exéctuer</span> (correction(s): <span style="color:green">
* Si une année a déjà été crée avant notre bot et une phrase a été ajoutée, par exemeple "Grande année" redigirigée vers "1995" comportait une phrase commançant par "Grande année". Pour résoudre ce problème, deux solutions sont enbisageables : la première, assez radicale, est d'effacer la ligne en question dans la page Wikpast. La seconde (celle choisie, plus douce) est  
</span>) sur toutes les pages.)  
* Gestion des doublons : pourrait être amélioré dans la comparaison de deux événements similaires. Actuellement, seules deux événements écrits exactement pareils ne sont pas dédoublés (par la fonction ''event_not_in_page.py''), mais on pourrait imaginer qu'un événement du type [[Mariage]] qui serait écrit comme "A se marie avec B" dans la page de A et "B se marie avec A" dans la page de B, et qui serait donc relevé deux fois.  
* Si une année a déjà été crée avant notre bot et une phrase a été ajoutée, par <span style="color:red">exemeple</span> (correction(s): <span style="color:green">exemple
* Normalisation des dates sur les pages de la database (car par exemple une inversion mois-jour pas prise en compte actuellement)
</span>) "Grande année" <span style="color:red">redigirigée</span> (correction(s): <span style="color:green">
* Classement chronologique des événements dans les pages de la database
</span>) vers "1995" comportait une phrase <span style="color:red">commançant</span> (correction(s): <span style="color:green">commandant, commençant
</span>) par "Grande année". Pour résoudre ce problème, deux solutions sont <span style="color:red">enbisageables</span> (correction(s): <span style="color:green">envisageables
</span>) : la première, assez radicale, est d'effacer la ligne en question dans la page Wikpast. La seconde (celle choisie, plus douce) est  
* Gestion des doublons : pourrait être amélioré dans la comparaison de deux événements similaires. Actuellement, seules deux événements écrits exactement pareils ne sont pas dédoublés (par la fonction ''event_not_in_page.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)''), mais on pourrait imaginer qu'un événement du type [[Mariage]] qui serait écrit comme "A se marie avec B" dans la page de A et "B se marie avec A" dans la page de B, et qui serait donc relevé deux fois.  
* Normalisation des dates sur les pages de la <span style="color:red">database</span> (correction(s): <span style="color:green">
</span>) (car par exemple une inversion mois-jour pas prise en compte actuellement)
* Classement chronologique des événements dans les pages de la <span style="color:red">database</span> (correction(s): <span style="color:green">
</span>)
* Section "Mois" dans les pages années
* Section "Mois" dans les pages années


=Scheduling=
=Scheduling=


Tant que le nombre d'utilisateurs reste en accord avec le nombre d'étudiants dans le cours "Humanités Digitales" de l'EPFL, le bot va tourner une fois par semaine. Si wikiapst devient un site ouvert au public, il faudra éventuellement le lancer plus fréquemment.  
Tant que le nombre d'utilisateurs reste en accord avec le nombre d'étudiants dans le cours "Humanités Digitales" de l'EPFL, le bot va tourner une fois par semaine. Si <span style="color:red">wikiapst</span> (correction(s): <span style="color:green">
</span>) devient un site ouvert au public, il faudra éventuellement le lancer plus fréquemment.  


=Code source=
=Code source=


==main_one_page.py et main.py==
==main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
===main_one_page.py===
</span>)_page.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>) et main.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)==
===main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>)_page.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)===
  <nowiki>
  <nowiki>
from create_new_site import create_new_site
from <span style="color:red">create</span> (correction(s): <span style="color:green">croate
from create_site import create_site
</span>)_new_site import <span style="color:red">create</span> (correction(s): <span style="color:green">croate
from modify_links import modify_links
</span>)_new_site
from place_evenement import place_evenement
from <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_site import <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_site
from <span style="color:red">modify</span> (correction(s): <span style="color:green">
</span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins
</span>) import <span style="color:red">modify</span> (correction(s): <span style="color:green">
</span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins
</span>)
from place_<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>) import place_<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)
from event_not_in_page import event_not_in_page
from event_not_in_page import event_not_in_page
from recherchedates2 import recherchedates2
from <span style="color:red">recherchedates</span> (correction(s): <span style="color:green">
</span>)2 import <span style="color:red">recherchedates</span> (correction(s): <span style="color:green">
</span>)2
#ajouter ici les autres fonctions dont on aura besoin
#ajouter ici les autres fonctions dont on aura besoin


def main_one_page(page):
def main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>)_page(page):
     page=page.replace(" ","_")
     page=page.replace(" ","_")
     #modifie les dates pour rediger vers une année
     #modifie les dates pour rediger vers une année
     modify_links(page)
     <span style="color:red">modify</span> (correction(s): <span style="color:green">
</span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins
</span>)(page)


     #renvoie un array de deux colonnes: une colonne de dates et une colonne d'evenements
     #renvoie un <span style="color:red">array</span> (correction(s): <span style="color:green">
     elements=recherchedates2(page)
</span>) de deux colonnes: une colonne de dates et une colonne d'evenements
     elements=<span style="color:red">recherchedates</span> (correction(s): <span style="color:green">
</span>)2(page)
      
      
     for element in elements:
     for element in elements:
         evenement = element[1]
         <span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>) = element[1]
         date      = element[0]
         date      = element[0]
         annee    = date[:4]
         annee    = date[:4]
         #cree le site si il existe pas encore
         #cree le site si il existe pas encore
         create_site(annee)
         <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_site(annee)
                
                
         if event_not_in_page(annee,evenement):
         if event_not_in_page(annee,<span style="color:red">evenement</span> (correction(s): <span style="color:green">
             content=place_evenement(date,evenement)
</span>)):
             create_new_site(annee,content)
             content=place_<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)(date,<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>))
             <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_new_site(annee,content)


</nowiki>
</nowiki>


===main.py===
===main.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)===
  <nowiki>
  <nowiki>
'''
'''
Ligne 81 : Ligne 159 :


from select_page import select_page
from select_page import select_page
from main_one_page import main_one_page
from main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>)_page import main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>)_page
import datetime
import datetime
from order_all import order_all
from <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>) import <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>)


page_list=select_page()
page_list=select_page()
Ligne 91 : Ligne 175 :
     print('Je suis en train de faire la page: '+page)
     print('Je suis en train de faire la page: '+page)
     print("J'ai fait un "+str(i/len(page_list)*100)+'%')
     print("J'ai fait un "+str(i/len(page_list)*100)+'%')
     years_modified=years_modified+main_one_page(page)
     years_modified=years_modified+main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>)_page(page)
     i=i+1
     i=i+1
print("j'ai fini, il me reste qu'à tout ordonner")
print("j'ai fini, il me reste qu'à tout ordonner")
#ici il ordonne toutes les pages, parce que la fonction place_evenement
#ici il ordonne toutes les pages, parce que la fonction place_<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)
     #met les evenements juste à la fin de la page
     #met les evenements juste à la fin de la page
order_all(years_modified)
<span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>)(years_modified)


now = datetime.datetime.now()
now = datetime.datetime.now()
Ligne 118 : Ligne 206 :
</nowiki>
</nowiki>


==select_pages.py==
==select_pages.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)==


===Code source===
===Code source===
  <nowiki>
  <nowiki>
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
#return a list of str containing all the name of wikipast page, without the one beginin with "Fichier:" or the one beginin with 4 number (ex:"1945")
#return a list of str containing <span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>) the name of wikipast page, without the <span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>) beginin with "Fichier:" or the <span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>) beginin with 4 number (ex:"1945")
#only pages changed by user in the "whiteliste.txt" and done AFTER the date write in "lastdate.txt" are given
#only pages changed by user in the "whiteliste.txt" and done AFTER the date write in "lastdate.txt" are given
#to change the "lastdate.txt", please put those line where needed :
#to change the "lastdate.txt", please put those line where needed :
Ligne 133 : Ligne 225 :


def select_page():
def select_page():
     baseurl='http://wikipast.epfl.ch/wikipast/'
     baseurl='http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green">
</span>).ch/wikipast/'


     fichier=open('whiteliste.txt', 'r')
     fichier=open('whiteliste.txt', 'r')
     protected_logins=fichier.read()
     protected_logins=fichier.read()
     fichier.close()
     fichier.close()
     protected_logins=protected_logins.split('\n')
     protected_logins=protected_logins.<span style="color:red">split</span> (correction(s): <span style="color:green">salit
</span>)('\n')
     protected_logins=protected_logins[:(len(protected_logins)-1)]
     protected_logins=protected_logins[:(len(protected_logins)-1)]


Ligne 224 : Ligne 318 :




== recherchedates2.py ==
== <span style="color:red">recherchedates</span> (correction(s): <span style="color:green">
</span>)2.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>) ==
  <nowiki>
  <nowiki>
import requests
import requests
from bs4 import BeautifulSoup
from bs4 import BeautifulSoup
from retrieve_content import retrieve_content
from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content


def recherchedates2(page_name):
def <span style="color:red">recherchedates</span> (correction(s): <span style="color:green">
</span>)2(page_name):


     x=str(retrieve_content(page_name))
     x=str(<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content(page_name))


     x=x.split("\n")
     x=x.<span style="color:red">split</span> (correction(s): <span style="color:green">salit
</span>)("\n")
     dates=[]
     dates=[]
     for i in x:
     for i in x:
Ligne 249 : Ligne 350 :
</nowiki>
</nowiki>


==modify_links.py==
==<span style="color:red">modify</span> (correction(s): <span style="color:green">
</span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins
</span>).<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)==
  <nowiki>
  <nowiki>
'''
'''
cette fonction prend en input le nom d'une page.
cette fonction prend en input le nom d'une page.
Pour toutes les dates de type [[AAAA/MM/JJ]], elle crée le
Pour toutes les dates de type [[AAAA/MM/JJ]], elle crée le
lien de redirection vers la page de l'année.
lien de <span style="color:red">redirection</span> (correction(s): <span style="color:green">
</span>) vers la page de l'année.
Pour les dates de type [[AAAA]] elle ne fait
Pour les dates de type [[AAAA]] elle ne fait
rien puisqu'elles sont déjà un lien vers l'année
rien puisqu'elles sont déjà un lien vers l'année
Ligne 260 : Ligne 365 :
import requests
import requests
from bs4 import BeautifulSoup
from bs4 import BeautifulSoup
from retrieve_content import retrieve_content
from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content


months=["Janvier","F.C3.A9vrier","Mars","Avril","Mai","Juin","Juillet","Ao.C3.BBt","Septembre","Octobre","Novembre","D.C3.A9cembre"]
months=["Janvier","F.C3.A9vrier","Mars","Avril","Mai","Juin","Juillet","Ao.C3.BBt","Septembre","Octobre","Novembre","D.C3.A9cembre"]


def modify_links(page_name):
def <span style="color:red">modify</span> (correction(s): <span style="color:green">
</span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins
</span>)(page_name):
     ###############
     ###############
     ###############
     ###############
     #retrieve dates
     #<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
     text=retrieve_content(page_name)
</span>) dates
     text=text.split("\n")
     text=<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content(page_name)
     text=text.<span style="color:red">split</span> (correction(s): <span style="color:green">salit
</span>)("\n")
     dates=[]
     dates=[]
     for line in text:
     for line in text:
Ligne 282 : Ligne 394 :
     ###############
     ###############
     ###############
     ###############
     #create pages with redirection code
     #<span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>) pages with <span style="color:red">redirection</span> (correction(s): <span style="color:green">
</span>) code
     user = "ChronoBOT"
     user = "ChronoBOT"
     passw = "sajas2017"
     passw = "sajas2017"
     baseurl='http://wikipast.epfl.ch/wikipast/'
     baseurl='http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green">
</span>).ch/wikipast/'
     summary='ChronoBOT page creation'
     summary='ChronoBOT page creation'


Ligne 318 : Ligne 433 :
</nowiki>
</nowiki>


==create_site.py==
==<span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_site.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)==


  <nowiki>
  <nowiki>
Ligne 328 : Ligne 445 :
import requests
import requests


def create_site(year):
def <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_site(year):
     #check if year is a four digit number
     #check if year is a four digit number
     year=str(year)
     year=str(year)
Ligne 337 : Ligne 455 :
     user = "ChronoBOT"
     user = "ChronoBOT"
     passw = "sajas2017"
     passw = "sajas2017"
     baseurl='http://wikipast.epfl.ch/wikipast/'
     baseurl='http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green">
</span>).ch/wikipast/'
     summary='ChronoBOT page creation'
     summary='ChronoBOT page creation'


     #check if page already exists
     #check if page already exists
     if(requests.get('http://wikipast.epfl.ch/wikipast/index.php/'+year)).status_code!=404:
     if(requests.get('http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green">
</span>).ch/wikipast/index.php/'+year)).status_code!=404:
          
          
         return
         return
Ligne 371 : Ligne 491 :




==order.py et order_all.py==
==<span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
===order.py===
</span>).<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>) et <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>).<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)==
===<span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>).<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)===
  <nowiki>
  <nowiki>
from smaller_than import smaller_than
from smaller_than import smaller_than


def order(text):#ça ordonne un text
def <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
     text1=text.split('\n')
</span>)(text):#ça ordonne un text
     text1=text.<span style="color:red">split</span> (correction(s): <span style="color:green">salit
</span>)('\n')
     #separate events from other useless lines in the page
     #separate events from other useless lines in the page
     newtext=[]
     newtext=[]
Ligne 387 : Ligne 516 :
             craptext.append(line)
             craptext.append(line)
      
      
     #case where page is empty, only has one line in it, or only has crap in it
     #case where page is empty, only has <span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>) line in it, or only has crap in it
     if len(newtext)<2:
     if len(newtext)<2:
         return text
         return text
Ligne 416 : Ligne 546 :
</nowiki>
</nowiki>


===order_all.py===
===<span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>).<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)===
  <nowiki>
  <nowiki>
from order import order
from <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
from retrieve_content import retrieve_content
</span>) import <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
from create_new_site import create_new_site
</span>)
from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content
from <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_new_site import <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_new_site


def order_all(years):#ça ordonne toutes les annees
def <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>)(years):#ça ordonne toutes les annees
     done=[]
     done=[]
     for year in years:
     for year in years:
         if year not in done:
         if year not in done:
             print('I am ordering page '+year)
             print('I am ordering page '+year)
             content=order(retrieve_content(year))
             content=<span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
             create_new_site(year,content)
</span>)(<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content(year))
             <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_new_site(year,content)
             done.append(year)
             done.append(year)
</nowiki>
</nowiki>


==place_evenement.py==
==place_<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>).<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)==
  <nowiki>
  <nowiki>
from retrieve_content import retrieve_content
from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
def place_evenement(annee,evenement): #format annee: 'aaaa'
</span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
                                     #format dans wikipast: '*[[aaaa.mm.jj]] (...)' seulement le début du format nous intéress
</span>)_content
     return retrieve_content(annee)+'\n'+evenement
def place_<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)(annee,<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)): #format annee: '<span style="color:red">aaaa</span> (correction(s): <span style="color:green">
</span>)'
                                     #format dans wikipast: '*[[<span style="color:red">aaaa</span> (correction(s): <span style="color:green">
</span>).mm.<span style="color:red">jj</span> (correction(s): <span style="color:green">je, j, jà
</span>)]] (...)' seulement le début du format nous intéress
     return <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content(annee)+'\n'+<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)
</nowiki>
</nowiki>


==event_not_in_page.py==
==event_not_in_page.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)==
  <nowiki>
  <nowiki>
'''
'''
cette fonction prend en input une annee et un evenement.
cette fonction prend en input une annee et un <span style="color:red">evenement</span> (correction(s): <span style="color:green">
Si cet evenement est déja dans la page de l'année il renvoie 0
</span>).
Si cet <span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>) est déja dans la page de l'année il renvoie 0
Si il n'est pas encore dans la page de l'année il renvoie 1
Si il n'est pas encore dans la page de l'année il renvoie 1
'''
'''


from retrieve_content import retrieve_content
from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content


def event_not_in_page(date,evenement):
def event_not_in_page(date,<span style="color:red">evenement</span> (correction(s): <span style="color:green">
     text=retrieve_content(str(date)).replace(' ','')
</span>)):
     text=<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content(str(date)).replace(' ','')
     text=text.replace(',','')
     text=text.replace(',','')
     text=text.replace('.','')
     text=text.replace('.','')
     pos=evenement.find(']]')
     pos=<span style="color:red">evenement</span> (correction(s): <span style="color:green">
     evenement=evenement[pos+2:].replace(' ','')
</span>).find(']]')
     evenement=evenement.replace(',','')
     <span style="color:red">evenement</span> (correction(s): <span style="color:green">
     evenement=evenement.replace('.','')
</span>)=<span style="color:red">evenement</span> (correction(s): <span style="color:green">
     if evenement in text:
</span>)[pos+2:].replace(' ','')
     <span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)=<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>).replace(',','')
     <span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)=<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>).replace('.','')
     if <span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>) in text:
         return 0
         return 0
     else:
     else:
Ligne 464 : Ligne 634 :
</nowiki>
</nowiki>


==retrieve_content.py==
==<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)==
  <nowiki>
  <nowiki>
'''
'''
cette fonction prend en input le nom d'une page
cette fonction prend en input le nom d'une page
et retourne tout le text qu'il y a dedans, en code wiki
et retourne tout le text qu'il y a dedans, en code <span style="color:red">wiki</span> (correction(s): <span style="color:green">kiki, tiki
</span>)
'''
'''
import requests
import requests
from bs4 import BeautifulSoup
from bs4 import BeautifulSoup


def retrieve_content(name):
def <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
     baseurl='http://wikipast.epfl.ch/wikipast/'
</span>)_content(name):
     baseurl='http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green">
</span>).ch/wikipast/'
     result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap')
     result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap')
     soup=BeautifulSoup(result.text, "html.parser")
     soup=BeautifulSoup(result.text, "html.parser")
Ligne 485 : Ligne 660 :
</nowiki>
</nowiki>


==split_date.py==
==<span style="color:red">split</span> (correction(s): <span style="color:green">salit
</span>)_date.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)==
  <nowiki>
  <nowiki>
def split_date(date): #format date: 'aaaa.mm.jj'  /!\ la date doit être au format string
def <span style="color:red">split</span> (correction(s): <span style="color:green">salit
</span>)_date(date): #format date: '<span style="color:red">aaaa</span> (correction(s): <span style="color:green">
</span>).mm.<span style="color:red">jj</span> (correction(s): <span style="color:green">je, j, jà
</span>)'  /!\ la date doit être au format string
     date=str(date); #on est jamais trop sûr
     date=str(date); #on est jamais trop sûr
     annee='';
     annee='';
Ligne 499 : Ligne 679 :
</nowiki>
</nowiki>


==smaller_than.py==
==smaller_than.<span style="color:red">py</span> (correction(s): <span style="color:green">pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy
</span>)==
  <nowiki>
  <nowiki>
def smaller_than(date1,date2):#need to be format aaaa.mm.dd
def smaller_than(date1,date2):#need to be format <span style="color:red">aaaa</span> (correction(s): <span style="color:green">
                                 #a year of format aaaa is always smaller
</span>).mm.dd
     #case aaaa
                                 #a year of format <span style="color:red">aaaa</span> (correction(s): <span style="color:green">
</span>) is always smaller
     #case <span style="color:red">aaaa</span> (correction(s): <span style="color:green">
</span>)
     if(len(date1)==4):
     if(len(date1)==4):
         return 1
         return 1

Version du 30 mai 2017 à 08:04


Chronobot est un bot programmé en langage Python et qui agit sur des pages Wikipast. Il permet de regrouper tous les événements qui se sont passés en une année dans une même page

Fonctionnement

Chronobot va d'abord effectuer un scan (correction(s): scat ) sur l'ensemble des pages biographiques crées (correction(s): créées, curées, cirées, créés, criées, crée, créer, ocrées, cries, créez, crues ) par les élèves du cours "Humanités Digitales" (2017). Il effectue ensuite un scan (correction(s): scat ) sur tous les événements relevés dans chaque page et en stocke la date (sous forme AAAA.MM.JJ) et la description dans une liste. Une fois cette liste en main, il crée une page pour chaque jour différent. Pour des raisons pratiques, il est plus logique de n'avoir qu'une seule page par année avec tous les événements relevés durant cette année classés chronologiquement. Pour ce faire, au lieu d'agir directement sur l'url (correction(s): urf ) de la page, Chronobot redirige chaque lien d'un jour vers l'url (correction(s): urf ) de l'année correspondante. Enfin, il y écrit l'événement en bas de la page de l'année correspondante. Quand il finit le scan (correction(s): scat ), il ordonne tous les événements des pages années qui ont été modifiées. La gestion des doublons est résolue ultérieurement.

Généralités

  • Concepteurs : Arnau Albà Jacas, Sonia Bouchiba, Jonathan Charrière, Sébastien Morel, Aurélien Verdier.
  • UserName : ChronoBOT

Liste des fonctions

Fonctions principales

  • select_page.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy

) parcourt les différentes pages sur une séléection (correction(s): sélection ) précise de Users (ceux du cours SHS) et en retourne les pages crées (correction(s): créées, curées, cirées, créés, criées, crée, créer, ocrées, cries, créez, crues ) sous formes de chaînes brutes (String). Les images (.png (correction(s): )) sont ôtées ainsi que

  • recherchedates (correction(s):

).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) prend en argument une page donnée (string) et en sort une liste année/événement

  • modify (correction(s):

)_links (correction(s): linos, lins ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) modifie toutes les pages des dates pour qu'elles soient redirigées (correction(s): ) vers la page de l'année.

  • create (correction(s): croate

)_new_site.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) crée une page Wikipast avec le contenu donné

  • order (correction(s): corder, border, orner, arder, onder

).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) ordonne une page dans l'ordre chronologique et order (correction(s): corder, border, orner, arder, onder )_all (correction(s): alu, allé, hall, alla, allô, ale, ail, allo ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) effectue order (correction(s): corder, border, orner, arder, onder ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) sur toutes les pages une fois qu'elles sont toutes écrites.

  • place_evenement (correction(s):

).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) écrit un événement dans une page.

  • event_not_in_page.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy

) gère les doublons en comparant deux strings-évenements (correction(s): évènements, événements ) caractère par caractère. Il considère ainsi deux évenements (correction(s): évènements, événements ) identiques s'ils contiennent les mêmes suites de caractères. Il ne tient pas compte des virgules (,), points (.) et espaces ( ) s'ils sont différents dans les deux strings.

Fonctions secondaires

  • retrieve (correction(s): retriever

)_content.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) prend en input le nom d'une page et retourne tout le texte contenu en syntaxe wiki (correction(s): kiki, tiki ).

  • split (correction(s): salit

)_date.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) prend en input une date 'aaaa (correction(s): ).mm.jj (correction(s): je, j, jà )' et retourne une array (correction(s): ) [année, mois, jour].

Exemples de pages créées

) vers 1990

  • 1990.06 -> redirection (correction(s):

) vers 1990

Critiques et faiblesses du bot

  • Optimisation du code (plusieurs minutes pour s'exéctuer (correction(s):

) sur toutes les pages.)

  • Si une année a déjà été crée avant notre bot et une phrase a été ajoutée, par exemeple (correction(s): exemple

) "Grande année" redigirigée (correction(s): ) vers "1995" comportait une phrase commançant (correction(s): commandant, commençant ) par "Grande année". Pour résoudre ce problème, deux solutions sont enbisageables (correction(s): envisageables ) : la première, assez radicale, est d'effacer la ligne en question dans la page Wikpast. La seconde (celle choisie, plus douce) est

  • Gestion des doublons : pourrait être amélioré dans la comparaison de deux événements similaires. Actuellement, seules deux événements écrits exactement pareils ne sont pas dédoublés (par la fonction event_not_in_page.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy

)), mais on pourrait imaginer qu'un événement du type Mariage qui serait écrit comme "A se marie avec B" dans la page de A et "B se marie avec A" dans la page de B, et qui serait donc relevé deux fois.

  • Normalisation des dates sur les pages de la database (correction(s):

) (car par exemple une inversion mois-jour pas prise en compte actuellement)

  • Classement chronologique des événements dans les pages de la database (correction(s):

)

  • Section "Mois" dans les pages années

Scheduling

Tant que le nombre d'utilisateurs reste en accord avec le nombre d'étudiants dans le cours "Humanités Digitales" de l'EPFL, le bot va tourner une fois par semaine. Si wikiapst (correction(s): ) devient un site ouvert au public, il faudra éventuellement le lancer plus fréquemment.

Code source

==main_one (correction(s): ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une )_page.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) et main.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )== ===main_one (correction(s): ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une )_page.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )===

from <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_new_site import <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_new_site
from <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_site import <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_site
from <span style="color:red">modify</span> (correction(s): <span style="color:green">
</span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins
</span>) import <span style="color:red">modify</span> (correction(s): <span style="color:green">
</span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins
</span>)
from place_<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>) import place_<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)
from event_not_in_page import event_not_in_page
from <span style="color:red">recherchedates</span> (correction(s): <span style="color:green">
</span>)2 import <span style="color:red">recherchedates</span> (correction(s): <span style="color:green">
</span>)2
#ajouter ici les autres fonctions dont on aura besoin

def main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>)_page(page):
    page=page.replace(" ","_")
    #modifie les dates pour rediger vers une année
    <span style="color:red">modify</span> (correction(s): <span style="color:green">
</span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins
</span>)(page)

    #renvoie un <span style="color:red">array</span> (correction(s): <span style="color:green">
</span>) de deux colonnes: une colonne de dates et une colonne d'evenements
    elements=<span style="color:red">recherchedates</span> (correction(s): <span style="color:green">
</span>)2(page)
    
    for element in elements:
        <span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>) = element[1]
        date      = element[0]
        annee     = date[:4]
        #cree le site si il existe pas encore
        <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_site(annee)
               
        if event_not_in_page(annee,<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)):
            content=place_<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)(date,<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>))
            <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_new_site(annee,content)


===main.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )===

'''
Alors ça c'est le main. Si on le lance ça crée
toutes las pages année normalement.
'''

from select_page import select_page
from main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>)_page import main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>)_page
import datetime
from <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>) import <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>)

page_list=select_page()
i=0
years_modified=[]
for page in page_list:
    print('Je suis en train de faire la page: '+page)
    print("J'ai fait un "+str(i/len(page_list)*100)+'%')
    years_modified=years_modified+main_<span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>)_page(page)
    i=i+1
print("j'ai fini, il me reste qu'à tout ordonner")
#ici il ordonne toutes les pages, parce que la fonction place_<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)
    #met les evenements juste à la fin de la page
<span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>)(years_modified)

now = datetime.datetime.now()
year=str(now.year)
month=str(now.month)
day=str(now.day)
hour=str(now.hour)
minute=str(now.minute)
if len(month)==1:
    month='0'+month
if len(day)==1:
    day='0'+day
if len(hour)==1:
    hour='0'+hour
if len(minute)==1:
    minute='0'+minute

fichier=open('lastdate.txt','w')
fichier.write(year+'-'+month+'-'+day+'T'+hour+':'+minute+':00Z')
fichier.close()

==select_pages.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==

Code source

# -*- coding: utf-8 -*-
#return a list of str containing <span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>) the name of wikipast page, without the <span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>) beginin with "Fichier:" or the <span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>) beginin with 4 number (ex:"1945")
#only pages changed by user in the "whiteliste.txt" and done AFTER the date write in "lastdate.txt" are given
#to change the "lastdate.txt", please put those line where needed :
#if needed, it strated with "2017-02-05T16:00:00Z"


import requests
from bs4 import BeautifulSoup

def select_page():
    baseurl='http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green">
</span>).ch/wikipast/'

    fichier=open('whiteliste.txt', 'r')
    protected_logins=fichier.read()
    fichier.close()
    protected_logins=protected_logins.<span style="color:red">split</span> (correction(s): <span style="color:green">salit
</span>)('\n')
    protected_logins=protected_logins[:(len(protected_logins)-1)]

    fichier=open('lastdate.txt', 'r')
    depuis_date=fichier.read()
    fichier.close()
       

    liste_pages=[]
    for user in protected_logins:
        result=requests.post(baseurl+'api.php?action=query&list=usercontribs&ucuser='+user+'&format=xml&ucend='+depuis_date)
        soup=BeautifulSoup(result.content,'html.parser')
        for primitive in soup.usercontribs.findAll('item'):
            title=primitive['title']
            if title[0:8]!='Fichier:':
                if not title[0:3].isnumeric():
                    liste_pages.append(title)

    liste_pages=list(set(liste_pages))
    return liste_pages



Whitelist

Frederickaplan
Maud
Vbuntinx
Testbot
SparqlBot
IB
SourceBot
PageUpdaterBot
Orthobot
BioPathBot
ChronoBOT
Amonbaro
AntoineL
AntoniasBanderos
Arnau
Arnaudpannatier
Aureliver
Brunowicht
Burgerpop
Cedricviaccoz
Christophe
Claudioloureiro
Ghislain
Gregoire3245
Hirtg
Houssm
Icebaker
JenniCin
JiggyQ
JulienB
Kl
Kperrard
Leandro Kieliger
Marcus
Martin
MatteoGiorla
Mireille
Mj2905
Musluoglucem
Nacho
Nameless
Nawel
O'showa
PA
Qantik
QuentinB
Raphael.barman
Roblan11
Romain Fournier
Sbaaa
Snus
Sonia
Tboyer
Thierry
Titi
Vlaedr
Wanda


== recherchedates (correction(s): )2.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) ==

import requests
from bs4 import BeautifulSoup
from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content

def <span style="color:red">recherchedates</span> (correction(s): <span style="color:green">
</span>)2(page_name):

    x=str(<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content(page_name))

    x=x.<span style="color:red">split</span> (correction(s): <span style="color:green">salit
</span>)("\n")
    dates=[]
    for i in x:
        d_start=i.find("[[")
        if (d_start!=-1) and i[d_start+2:d_start+6].isnumeric():
            d_start=d_start+2
            d_end=i[d_start:].find("]]")+d_start
            date=i[d_start:d_end]
            d_start=d_start-2
            even='*'+i[d_start:]
            dates.append([date,even])
            
    return(dates)

==modify (correction(s): )_links (correction(s): linos, lins ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==

'''
cette fonction prend en input le nom d'une page.
Pour toutes les dates de type [[AAAA/MM/JJ]], elle crée le
lien de <span style="color:red">redirection</span> (correction(s): <span style="color:green">
</span>) vers la page de l'année.
Pour les dates de type [[AAAA]] elle ne fait
rien puisqu'elles sont déjà un lien vers l'année
'''
import requests
from bs4 import BeautifulSoup
from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content

months=["Janvier","F.C3.A9vrier","Mars","Avril","Mai","Juin","Juillet","Ao.C3.BBt","Septembre","Octobre","Novembre","D.C3.A9cembre"]

def <span style="color:red">modify</span> (correction(s): <span style="color:green">
</span>)_<span style="color:red">links</span> (correction(s): <span style="color:green">linos, lins
</span>)(page_name):
    ###############
    ###############
    #<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>) dates
    text=<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content(page_name)
    text=text.<span style="color:red">split</span> (correction(s): <span style="color:green">salit
</span>)("\n")
    dates=[]
    for line in text:
        d_start=line.find("[[")
        if (d_start!=-1) and line[d_start+2:d_start+6].isnumeric():
            d_start=d_start+2
            d_end=line[d_start:].find("]]")+d_start
            date=line[d_start:d_end]
            if len(date)!=4:
                dates.append(date)

    ###############
    ###############
    #<span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>) pages with <span style="color:red">redirection</span> (correction(s): <span style="color:green">
</span>) code
    user = "ChronoBOT"
    passw = "sajas2017"
    baseurl='http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green">
</span>).ch/wikipast/'
    summary='ChronoBOT page creation'

    # Login request
    payload={'action':'query','format':'json','utf8':'','meta':'tokens','type':'login'}
    r1=requests.post(baseurl + 'api.php', data=payload)

    #login confirm
    login_token=r1.json()['query']['tokens']['logintoken']
    payload={'action':'login','format':'json','utf8':'','lgname':user,'lgpassword':passw,'lgtoken':login_token}
    r2=requests.post(baseurl + 'api.php', data=payload, cookies=r1.cookies)

    #get edit token2
    params3='?format=json&action=query&meta=tokens&continue='
    r3=requests.get(baseurl + 'api.php' + params3, cookies=r2.cookies)
    edit_token=r3.json()['query']['tokens']['csrftoken']

    edit_cookie=r2.cookies.copy()
    edit_cookie.update(r3.cookies)

    for date in dates:
        year=date[:4]
        if(int(date[5:7])<13):
            month=months[int(date[5:7])-1]
            content="#REDIRECT [["+year+"#"+month+"]]"
        else:
            content="#REDIRECT [["+year+"]]"
    
        # save action
        payload={'action':'edit','assert':'user','format':'json','utf8':'','text':content,'summary':summary,'title':date,'token':edit_token}
        r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)

==create (correction(s): croate )_site.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==

'''
cette fonction prend en input une année, et crée un site en blanc
pour cette année
Si le site existe déjà, il ne fait rien
'''
import requests

def <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_site(year):
    #check if year is a four digit number
    year=str(year)
    if(len(year)!=4)or not(year.isnumeric()):
        
        return
    
    user = "ChronoBOT"
    passw = "sajas2017"
    baseurl='http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green">
</span>).ch/wikipast/'
    summary='ChronoBOT page creation'

    #check if page already exists
    if(requests.get('http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green">
</span>).ch/wikipast/index.php/'+year)).status_code!=404:
        
        return

    # Login request
    payload={'action':'query','format':'json','utf8':'','meta':'tokens','type':'login'}
    r1=requests.post(baseurl + 'api.php', data=payload)

    #login confirm
    login_token=r1.json()['query']['tokens']['logintoken']
    payload={'action':'login','format':'json','utf8':'','lgname':user,'lgpassword':passw,'lgtoken':login_token}
    r2=requests.post(baseurl + 'api.php', data=payload, cookies=r1.cookies)

    #get edit token2
    params3='?format=json&action=query&meta=tokens&continue='
    r3=requests.get(baseurl + 'api.php' + params3, cookies=r2.cookies)
    edit_token=r3.json()['query']['tokens']['csrftoken']

    edit_cookie=r2.cookies.copy()
    edit_cookie.update(r3.cookies)

    content=""
    
    # save action
    payload={'action':'edit','assert':'user','format':'json','utf8':'','text':content,'summary':summary,'title':year,'token':edit_token}
    r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)


==order (correction(s): corder, border, orner, arder, onder ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy ) et order (correction(s): corder, border, orner, arder, onder )_all (correction(s): alu, allé, hall, alla, allô, ale, ail, allo ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )== ===order (correction(s): corder, border, orner, arder, onder ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )===

from smaller_than import smaller_than

def <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)(text):#ça ordonne un text
    text1=text.<span style="color:red">split</span> (correction(s): <span style="color:green">salit
</span>)('\n')
    #separate events from other useless lines in the page
    newtext=[]
    craptext=[]
    for line in text1:
        if (line[:3]=='*[[') and (line[3:7].isnumeric()):
            newtext.append(line)
        else:
            craptext.append(line)
    
    #case where page is empty, only has <span style="color:red">one</span> (correction(s): <span style="color:green">ont, gone, oie, ose, onde, on, ope, none, onc, ode, oye, zone, orne, ore, ne, âne, onze, once, ove, une
</span>) line in it, or only has crap in it
    if len(newtext)<2:
        return text

    #check for repeated lines
    provisional=[]
    for line in newtext:
        if line not in provisional:
            provisional.append(line)   
    newtext=provisional
    
    ok=0
    while(ok==0):
        ok=1
        for i in range(len(newtext)-1):
            pos1  = newtext[i].find(']]')
            date1 = newtext[i][3:pos1]
            pos2  = newtext[i+1].find(']]')
            date2 = newtext[i+1][3:pos2]
            if not smaller_than(date1,date2):
                ok=0
                event=newtext[i]
                newtext[i]=newtext[i+1]
                newtext[i+1]=event

    newtext='\n'.join(newtext)+'\n'+'\n'.join(craptext)
    return newtext

===order (correction(s): corder, border, orner, arder, onder )_all (correction(s): alu, allé, hall, alla, allô, ale, ail, allo ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )===

from <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>) import <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)
from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content
from <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_new_site import <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_new_site

def <span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)_<span style="color:red">all</span> (correction(s): <span style="color:green">alu, allé, hall, alla, allô, ale, ail, allo
</span>)(years):#ça ordonne toutes les annees
    done=[]
    for year in years:
        if year not in done:
            print('I am ordering page '+year)
            content=<span style="color:red">order</span> (correction(s): <span style="color:green">corder, border, orner, arder, onder
</span>)(<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content(year))
            <span style="color:red">create</span> (correction(s): <span style="color:green">croate
</span>)_new_site(year,content)
            done.append(year)

==place_evenement (correction(s): ).py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==

from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content
def place_<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)(annee,<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)): #format annee: '<span style="color:red">aaaa</span> (correction(s): <span style="color:green">
</span>)'
                                    #format dans wikipast: '*[[<span style="color:red">aaaa</span> (correction(s): <span style="color:green">
</span>).mm.<span style="color:red">jj</span> (correction(s): <span style="color:green">je, j, jà
</span>)]] (...)' seulement le début du format nous intéress
    return <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content(annee)+'\n'+<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)

==event_not_in_page.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==

'''
cette fonction prend en input une annee et un <span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>).
Si cet <span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>) est déja dans la page de l'année il renvoie 0
Si il n'est pas encore dans la page de l'année il renvoie 1
'''

from <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content import <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content

def event_not_in_page(date,<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)):
    text=<span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content(str(date)).replace(' ','')
    text=text.replace(',','')
    text=text.replace('.','')
    pos=<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>).find(']]')
    <span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)=<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)[pos+2:].replace(' ','')
    <span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)=<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>).replace(',','')
    <span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>)=<span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>).replace('.','')
    if <span style="color:red">evenement</span> (correction(s): <span style="color:green">
</span>) in text:
        return 0
    else:
        return 1

==retrieve (correction(s): retriever )_content.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==

'''
cette fonction prend en input le nom d'une page
et retourne tout le text qu'il y a dedans, en code <span style="color:red">wiki</span> (correction(s): <span style="color:green">kiki, tiki
</span>)
'''
import requests
from bs4 import BeautifulSoup

def <span style="color:red">retrieve</span> (correction(s): <span style="color:green">retriever
</span>)_content(name):
    baseurl='http://wikipast.<span style="color:red">epfl</span> (correction(s): <span style="color:green">
</span>).ch/wikipast/'
    result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap')
    soup=BeautifulSoup(result.text, "html.parser")
    code=''
    if soup.findAll("text")[0]['bytes']=='0':
        return code
    for primitive in soup.findAll("text"):
        code+=primitive.string
    return code

==split (correction(s): salit )_date.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==

def <span style="color:red">split</span> (correction(s): <span style="color:green">salit
</span>)_date(date): #format date: '<span style="color:red">aaaa</span> (correction(s): <span style="color:green">
</span>).mm.<span style="color:red">jj</span> (correction(s): <span style="color:green">je, j, jà
</span>)'  /!\ la date doit être au format string
    date=str(date); #on est jamais trop sûr
    annee='';
    mois='';
    jour='';
    for i in range(len(date)):
        if(i<4): annee=annee+date[i];
        if(i>4 and i<7): mois=mois+date[i];
        if(i>7 and i<10): jour=jour+date[i];
    return [annee, mois, jour];

==smaller_than.py (correction(s): pu, puy, by, pi, p., psy, y, pa, ph, fy, pc, gy )==

def smaller_than(date1,date2):#need to be format <span style="color:red">aaaa</span> (correction(s): <span style="color:green">
</span>).mm.dd
                                #a year of format <span style="color:red">aaaa</span> (correction(s): <span style="color:green">
</span>) is always smaller
    #case <span style="color:red">aaaa</span> (correction(s): <span style="color:green">
</span>)
    if(len(date1)==4):
        return 1
    if(len(date2)==4):
        return 0
    #case
    m1=date1[5:7]
    d1=date1[8:]
    m2=date2[5:7]
    d2=date2[8:]

    if(m1<m2):
        return 1
    elif(m1>m2):
        return 0
    elif(m1==m2):
        if(d1<=d2):
            return 1
        else:
            return 0