« Programmation Python/Programmer en deux minutes/l'interface de Wikipédia pour programmer » : différence entre les versions
Contenu supprimé Contenu ajouté
m JackPotte a déplacé la page Interface de programmation/Services Web vers Programmation Python/Programmer en deux minutes/l'interface de Wikipédia pour programmer sans laisser de redirection : Fusion |
Fusion d'historiques |
||
Ligne 1 :
<noinclude>{{Python}}</noinclude>
Nous allons écrire un script en Python et l'exécuter dans une console. Le script va utiliser deux ensembles de commandes définis dans la bibliothèque fournie à l'installation du langage.
[[mw:API/fr|L'interface avec Wikipédia]] se fait via des requêtes à :
https://fr.wikipedia.org/w/api.php?
Par exemple :
https://fr.wikipedia.org/w/api.php?action=query&prop=info|revisions&titles=Accueil
== Structure de l'API Wikipédia ==
{{ApiEx
|desc=Obtenir les informations à propos de la dernière révision de la page [[Accueil]] :
Ligne 186 ⟶ 187 :
{{boîte déroulante fin}}
== Dernier modifieur de la page ==
'''1.''' Ouvrir un éditeur de texte, coller le script suivant (sans caractères spéciaux comme "é" si le fichier est en ASCII au lieu de Unicode)...
{|width=70% align=center
|{{boîte déroulante début|titre=modifieur_de_la_page.py}}
<source lang=python>
#!/usr/bin/python
# -*- coding: latin-1 -*-
# Pour Python 3, remplacez la ligne ci-dessous par import urllib.request, re
import urllib
import re # import des modules à partir de la bibliothèque d'instructions de base,
# 'urllib' pour URL library et 're' pour regular expression.
nom_de_page = "Accueil"
url = "http://fr.wikipedia.org/w/api.php?action=query&prop=info|revisions&titles=%s&format=xml" % nom_de_page
# affichage
# Python 3 : page = urllib.request.urlopen(url)
page = urllib.urlopen(url)
# Python 3 : infos = str(page.read(), 'utf_8')
infos = page.read() # lit le résultat de la requête à l'url ci-dessus
page.close()
print("Les informations demandées concernant" + nom_de_page + "sont les suivantes, en XML :\n\n" + infos) # Rajoutez des parenthèses pour Python 3 !
# extraction
print("\n...recherche l'expression rationnelle...") # Rajoutez des parenthèses pour Python 3 !
reviseur = re.findall(' user="(.*?)" ',infos) # recherche l'expression rationnelle
print("\nDernier reviseur : " + reviseur) # Rajoutez des parenthèses pour Python 3 !
</source>
{{boîte déroulante fin}}
|}
...enregistrez ce script (par exemple <code>modifieur_de_la_page.py</code>) et exécutez-le. Le script utilise [http://fr.wikipedia.org/w/api.php?action=query&prop=info|revisions&titles=Accueil&format=xmlfm cette requête] pour afficher le dernier modifieur de la page d'[[Accueil|accueil]].
'''Note''' : il s'agit de la méthode utilisant les bibliothèques natives de Python. Une alternative est d'utiliser le framework [[:mw:Manual:Pywikibot|Pywikibot]], qui se charge de l'API de MediaWiki à la place du développeur, rendant la tâche beaucoup plus simple pour des scripts plus perfectionnés.
== Boucle des modifieurs du bistro ==
'''2.''' Obtenir la liste des derniers modifieurs des Bistros du mois dernier. Ouvrir l'éditeur de texte, écrire ce script utilisant plusieurs fois [http://fr.wikipedia.org/w/api.php?action=query&prop=info|revisions&titles=Accueil cette requête]... Si vous souhaitez utiliser le code suivant avec Python 3, faites les mêmes modifications que dans le script précédent. C'est-à-dire : rajoutez des parenthèses aux <code>print</code> ; chargez la classe <code>urllib.request</code> (au lieu d'<code>urllib</code> tout court) ; utilisez la fonction <code>urllib.request.urlopen</code> (au lieu de <code>urllib.urlopen</code>) ; transformez le résultat de <code>read</code> en chaîne de caractères (<code>infos = str(url.read(), 'utf_8')</code>).
{|width=70% align=center
|{{boîte déroulante début|titre= boucle_reviseur_bistro.py}}
<source lang=python>
#!/usr/bin/python
# -*- coding: latin-1 -*-
import urllib # import des modules de la bibliothèque d'instructions fournie à l'installation.
import re
a = 0
space = ' '
nospace = ''
while a < 31:
a = a+1 # a est un nombre entier (integer)
b = str(int(a)) # et b une chaine de caractères (string)
nom = "Wikipedia:Le_Bistro/"+b+"_avril_2009"
nom = nom.replace(space, nospace) # supprime les espace
url = urllib.urlopen("http://fr.wikipedia.org/w/api.php?action=query" +
"&prop=info|revisions&titles=%s&format=xml" % nom )
infos = url.read()
url.close()
reviseur = re.findall(' user="(.*?)" ', infos) # recherche l'expression rationnelle
for chacun in reviseur:
print("\nDernier reviseur du bistro du " + b + " avril 2009 : " + chacun)
</source>
{{boîte déroulante fin}}
|}
...enregistrez ce script (par exemple <code>boucle_reviseur_bistro.py</code>) et exécutez-le.
== Tous les modifieurs de la page ==
'''3.''' La liste des modifieurs de la page d'accueil entre deux dates, et les commentaires de révisions : ouvrir l'éditeur de texte, écrire ce script, faire les mêmes modifications pour Python 3 le cas échéant... Ce script utilise [//fr.wikipedia.org/w/api.php?action=query&prop=revisions&rvstart=20090311000000&revend=20090511000000&titles=Accueil cette requête].
{|width=70% align=center
|{{boîte déroulante début|titre=liste_des_reviseurs.py}}
<source lang=python>
#!/usr/bin/python
# -*- coding: latin-1 -*-
import urllib # import des modules de la bibliothèque d'instructions fournie à l'installation.
import re
debut = str(int(20090311000000)) # date pour commencer a lister, ici 11 mars 2009.
fin = str(int(20090511000000))
nom = "Accueil"
url = urllib.urlopen("http://fr.wikipedia.org/w/api.php?action=query" +
"&prop=revisions&rvstart=%s&revend=%s&titles=%s&format=xml" % (debut, fin, nom))
infos = url.read()
url.close()
# recherche et affiche les réviseurs
#
reviseur = re.findall(' user="(.*?)" ',infos)
for chacun in reviseur:
print("Reviseur : " + chacun)
# recherche et affiche les commentaires
commentaire = re.findall(' comment="(.*?)" ',infos)
for comment in commentaire:
print("\nCommentaire de revision : " + comment)
</source>
{{boîte déroulante fin}}
|}
'''Félicitations''', vous utilisez Wikipédia via son '''[[mw:API/fr|API]]''' !
Vous pouvez poursuivre cet exercice en programmant du python sur une base vierge, ou alors utiliser [[Programmation Python/Programmer en deux minutes/l'interface de Wikipédia pour programmer/la librairie d'instructions Pywikipedia|la librairie d'instructions Pywikipedia]] et [[w:Aide:Pywikipedia|les scripts Pywikipedia hébergés par Wikimédia]]. Par exemple, vous devriez être capable de lire un script tel que :
{|width=70% align=center
|{{boîte déroulante début|titre=[http://svn.wikimedia.org/viewvc/pywikipedia/trunk/pywikipedia/statistics_in_wikitable.py?view=markup <code>statistics_in_wikitable.py</code>]}}
<source lang=python>
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
\03{lightyellow}This bot renders statistics provided by [[Special:Statistics]] in a table on a wiki page.\03{default}
Thus it creates and updates a Statistics wikitable.
The following parameters are supported:
\03{lightred}-screen\03{default} If True, doesn't do any changes, but only shows the statistics.
\03{lightgreen}-page\03{default} On what page statistics are rendered.
If not existing yet, it is created.
If existing, it is updated.
"""
__version__ = '$Id$'
import wikipedia
import pagegenerators
import query
import time
# This is the title of the wikipage where to render stats.
your_page = "Logstats"
summary_update = {
'en':u'Updating some statistics.',
}
summary_creation = {
'en':u'Creating statistics log page.',
}
class StatisticsBot:
def __init__ (self, screen, your_page):
"""
Constructor. Parameter:
* screen - If True, doesn't do any real changes,
but only shows some stats.
"""
self.screen = screen
self.your_page = your_page
self.dict = self.getdata() # Try to get data.
self.site = wikipedia.getSite()
def run(self):
if self.screen:
wikipedia.output("Bot is running to output stats.")
self.idle(1) # Run a function to idle
self.outputall()
if not self.screen:
self.outputall() # Output all datas on screen.
wikipedia.output("\nBot is running. " +
"Going to treat \03{lightpurple}%s\03{default}..." %
self.your_page )
self.idle(2)
self.treat()
# getdata() returns a dictionnary of the query to
# api.php?action=query&meta=siteinfo&siprop=statistics
def getdata(self):
# This method return data in a dictionnary format.
# View data with: api.php?action=query&meta=siteinfo&siprop=statistics&format=jsonfm
params = {
'action' :'query',
'meta' :'siteinfo',
'siprop' :'statistics',
}
wikipedia.output("\nQuerying api for json-formatted data...")
try:
data = query.GetData(params,self.site, encodeTitle = False)
except:
url = self.site.protocol() + '://' + self.site.hostname() + self.site.api_address()
wikipedia.output("The query has failed. Have you check the API? Cookies are working?")
wikipedia.output(u"\n>> \03{lightpurple}%s\03{default} <<" % url)
if data != None:
wikipedia.output("Extracting statistics...")
data = data['query'] # "query" entry of data.
dict = data['statistics'] # "statistics" entry of "query" dict.
return dict
def treat(self):
page = wikipedia.Page(self.site, self.your_page)
if page.exists():
wikipedia.output(u'\nWikitable on ' +
u'\03{lightpurple}%s\03{default} will be completed with:\n' % self.your_page )
text = page.get()
newtext = self.newraw()
wikipedia.output(newtext)
choice = wikipedia.inputChoice(
u'Do you want to add these on wikitable?', ['Yes', 'No'], ['y', 'N'], 'N')
text = text[:-3] + newtext
summ = wikipedia.translate(self.site, summary_update)
if choice == 'y':
try:
page.put(u''.join(text), summ)
except:
wikipedia.output(u'Impossible to edit. It may be an edit conflict... Skipping...')
else:
wikipedia.output(
u'\nWikitable on \03{lightpurple}%s\03{default} will be created with:\n' % self.your_page )
newtext = self.newtable()+self.newraw()
wikipedia.output(newtext)
summ = wikipedia.translate(self.site, summary_creation)
choice = wikipedia.inputChoice(
u'Do you want to accept this page creation?', ['Yes', 'No'], ['y', 'N'], 'N')
if choice == 'y':
try:
page.put(newtext, summ)
except wikipedia.LockedPage:
wikipedia.output(u"Page %s is locked; skipping." % title)
except wikipedia.EditConflict:
wikipedia.output(u'Skipping %s because of edit conflict' % title)
except wikipedia.SpamfilterError, error:
wikipedia.output(
u'Cannot change %s because of spam blacklist entry %s' % (title, error.url))
def newraw(self):
newtext = ('\n|----\n!\'\''+ self.date() +'\'\'') # new raw for date and stats
for name in self.dict:
newtext += '\n|'+str(abs(self.dict[name]))
newtext += '\n|----\n|}'
return newtext
def newtable(self):
newtext = ('\n{| class=wikitable style=text-align:center\n!'+ "date") # create table
for name in self.dict:
newtext += '\n|'+name
return newtext
def date(self):
return time.strftime('%Y/%m/%d', time.localtime(time.time()))
def outputall(self):
list = self.dict.keys()
list.sort()
for name in self.dict:
wikipedia.output("There are "+str(self.dict[name])+" "+name)
def idle(self, retry_idle_time):
time.sleep(retry_idle_time)
wikipedia.output(u"Starting in %i second..." % retry_idle_time)
time.sleep(retry_idle_time)
def main(your_page):
screen = False # If True it would not edit the wiki, only output statistics
_page = None
wikipedia.output("\nBuilding the bot...")
for arg in wikipedia.handleArgs(): # Parse command line arguments
if arg.startswith('-page'):
if len(arg) == 5:
_page = wikipedia.input(u'On what page do you want to add statistics?')
else:
_page = arg[6:]
if arg.startswith("-screen"):
screen = True
if not _page:
_page = your_page
if not screen:
wikipedia.output("The bot will add statistics on %s.\n" % _page )
bot = StatisticsBot(screen, _page) # Launch the instance of a StatisticsBot
bot.run() # Execute the 'run' method
if __name__ == "__main__":
try:
main(your_page)
finally:
wikipedia.stopme()
</source>
{{boîte déroulante fin}}
|}
:Le script <code>statistics_in_wikitable.py</code> importe quelques librairies d'instructions dont [[Programmation Python/Programmer en deux minutes/l'interface de Wikipédia pour programmer/la librairie d'instructions Pywikipedia|Pywikipedia]], définit trois variables, définit l'objet StatisticsBot, puis définit une fonction principale qui est exécutée à la fin du script (par l'instruction <code>try: main(your_page)</code>).
<noinclude>{{:Programmation Python/Programmer en deux minutes/Bas de page}}</noinclude>
|