Tutorial de bots/Llibreries a pywikipediabot
Pywikipedia conté diversos mòduls amb llibreries que es poden carregar als programes escrits en python per tal de facilitar la manipulació dels continguts de Viquièdia i d'altres wikis.
Per tal de poder-les fer servir primer cal importar-les amb la instrucció:
import nom_de_la_llibreria
Vegeu el capítol sobre ús de mòduls en Python per a més detalls.
Els principals mòduls són:
wikipedia.py Per tractar les pàgines de wikipèdia. catlib.py Per tractar categories. userlib.py Per usuaris. pagegenerators.py Per obtenir llistes de pàgines de diferents tipus.
wikipedia.py
[modifica]En aquest mòdul es troben les classes page (pàgina) i site (lloc mediawik)
per manipular una pàgina primer cal crear un objecte de tipus pàgina amb la instrucció
pagina = wikipedia.Page(lloc, títol_de_la_pàgina)
El que fa aquesta instrucció és crear l'objecte de tipus pàgina i emmagatzemar-lo a la variable pagina
, el paràmetre lloc ha de ser un objecte de tipus lloc mediawiki que es pot haver creat abans amb una instrucció site
emmagatzemant-la en una variable o es pot crear en la mateixa instrucció. Per exemple aquests dos codis creen el mateix objecte:
lloc = wikipedia.getSite("ca","wikipedia")
objecte_pagina_que_te_el_titol_peu = wikipedia.Page(lloc, "peu")
Fa el mateix que:
objecte_pagina_que_te_el_titol_peu = wikipedia.Page(wikipedia.getSite("ca","wikipedia"), "peu")
En el dos casos es crea un objecte que permet manipular la pàgina de la Viquipèdia que té per títol "peu".
Fixeu-vos que la sintaxis de la instrucció per crear el lloc mediawiki requereix passar-li dos paràmetres: el codi de la llengua i el nom del projecte.
Un cop es té un objecte corresponent a una pàgina se li poden aplicar els mètodes que proporciona el mòdul pywikipedia.
Mètodes get() i put()
[modifica]Els mètodes més habituals són get()
i put()
Observeu el següent programa:
import wikipedia.py
objecte_pagina_de_la_pagina_de_proves = wikipedia.Page(wikipedia.getSite("ca","wikipedia"), u"Viquipèdia:Pàgina de proves")
text_actual_de_la_pagina_de_proves = objecte_pagina_de_la_pagina_de_proves.get()
text_nou_de_la_pagina_de_proves = u"prova d'edició amb bot" + text_actual_de_la_pagina_de_proves
objecte_pagina_de_la_pagina_de_proves.put(text_nou_de_la_pagina_de_proves,u"Proves de programació d'un bot")
Primer es crea un objecte que correspon a la pàgina de proves de la Viquipèdia en català. Llavors es llegeix aquesta pàgina i el seu contingut s'emmagatzema en la variable text_actual_de_la_pagina_de_proves
. El contingut d'una pàgina és una cadena i per tant es pot manipular com qualsevol cadena. Per això la següent instrucció crea una nova cadena empalmant "prova d'edició amb bot" al començament del contingut de la pàgina de proves. Per acabar el mètode put de l'objecte pàgina de proves permet gravar aquest nou contingut. Si observeu ara la pàgina de proves vuereu que s'ha fet una modificació afegint la cadena "prova d'edició amb bot" al començament de tot i que el comentari d'edició és: "Proves de programació d'un bot".
Altres mètodes de la classe pàgina
[modifica]A demés dels mètodes get() i put() la classe pàgina ofereix altres mètodes útils:
- Per reanomenar la pàgina
move(nou_titol,motiu) : Li canvia el nom. És com el reanomena manual
- Per obtenir informacions de la pàgina
title : El nom de la pàgina. És útil perquè no sempre s'obté l'objecte pàgina creant-lo a partir del títol. El resultat és una cadena. interwiki : Retorna una llista d'objectes de tipus pàgina amb tots els interwikis que hi ha a la pàgina. categories : Retorna una llista d'objectes de tipus pàgina amb totes les categories de la pàgina. linkedPages : Retorna una llista d'objectes de tipus pàgina amb tots els enllaços interns que hi ha a la pàgina. imagelinks : Retorna una llista d'objectes de tipus pàgina amb totes les imatges. templates : Retorna una llista d'objectes de tipus pàgina amb les plantilles templatesWithParams : Retorna una llista de llistes per cada plantilla una llista de tots els paràmetres, el paràmetre 0 és el nom de la plantilla, són tots cadenes. Si un paràmetre té nom = valor això és el que retorna , si només té valor llavors el que retorna és el valor. getReferences : Retorna una llista d'objectes de tipus pàgina amb les pàgines que apunten a la pàgina en qüestió. També funciona amb pàgines que no existeixen si hi ha pàgines que hi apunten. userName : Cadena amb el nom de l'últim usuari que ha editat la pàgina
- Per saber quin tipus de pàgina és. Retornen una variable booleana veritat o fals.
exists : Retorna veritat si la pàgina existeix isEmpty : Retorna veritat si la pàgina té 4 caràcters o menys, no conta les interwikis i les categories isCategory : Retorna veritat si la pàgina és una categoria altrament retorna fals. isDisambig : Retorna veritat si la pàgina és una pàgina de desambiguació. isImage : Retorna veritat si és una imatge isRedirectPag : Retorna veritat si és una desambiguació isTalkPage : Retorna veritat si és una pàgina de discussió
- Per llegir versions antigues de la pàgina
latestRevision : Retorna l'identificador de la última revisió de la pàgina previousRevision : Retorna l'identificador de la verssió prèvia de la pàgina getOldVersion(id) : Llegeix el text de la vessió de la pàgina corresponent al identificador "id" com el get() però amb una vesió antiga. getVersionHistory : Retorna una llista de tuples. Cada tupla correspon a una edició i conté: identificador, data/hora, usuari i resum d'edició. L'odre per omissió és començant per l'edició més recent.
Altres mètodes de la classe site
[modifica]search(cadena) : La llista de pàgines que resulten de cercar la "cadena" allpages() : Una llista amb totes les pàgines newpages() : Llista amb les últimes pàgines creades newimages() : Llista amb les últimes imatges carregades deadendpages() : Llista de pàgines cul de sac lonelypages() : Llista de pàgines orfes recentchanges() : Llista dels últims canvis unwatchedpages() : Llista de pàgines no vigilades uncategorizedcategories(): Llista de categories sense categoria uncategorizedpages() : Llista de pàgines sense categoria uncategorizedimages() : Llista d'imatges sense categoria unusedcategories() : Llista de categories buides unusedfiles() : Llista d'imatges no utilitzades randompage : Pàgina aleatòria randomredirectpage : Pàgina de redirecció aleatòria withoutinterwiki : Llista de pàgines sense interwikis
Altres funcions del mòdul wikipedia.py
[modifica]El mòdul pywikipedia conté també altres funciona que són pràctiques a l'hora de manipular textos procedents de pàgines de Viquipèdia. Les pàgines de Viquipèdia fan servir caràcters unicode per tal de poder codificar les lletres de tots els alfabets del món, però moltes instruccions de Python donen problemes en manipular aquest tipus de cadenes per exemple la instrucció print
avorta en trobar-se un caràcter que no és ASCII.
Com que les funcions estan dins del mòdul wikipedia cal cridar-les escrivint wikipedia.nom_de_la_funcio</codi>.
Funcions de interacció amb l'operador del bot:
output(text): Fa el mateix que la instrucció print
de Python però sense problemes amb els caràcters unicode.
inputChoice(pregunta, respostes, tecles_de_resposta, omisio) : Presenta una llista d'alternatives i i retorna la que trii l'usuari.
Preginta ha de ser una cadena que es presentarà a la pantalla, respostes és una llista de cadenes, una per cada resposta possible,
tecles_de_resposta és una llista de cadenes d'una sola lletra que corresponen cada una a una a la tecla que cal prémer per donar la
resposta corresponent i omissió és la resposta que es dóna per omissió.
showDiff(text_antic, text_nou): Presenta les diferències entre els dos textos. Molt útil per bots semiautomàtics per presentar el que han fet abans
de decidir si es grava o no a la Viquipèdia.
Funcions per evitar manipular caràcters unicode. De vegades per poder emprar altres intruccions o funcions convé treballar amb cadenes sense caràcters unicode. Una manera de fer-ho és codificant-los en HTML llavors manipular la cadena i abans de tornar a graver text a la Viquipèdia tornar a transformar la codificació HTML a unicode, les següents funcions permeten fer-ho:
UnicodeToAsciiHtml: Transforma una cadena unicode en una cadena HTML.
html2unicode : Transforma una cadena HTML en una cadena unicode.
Un cop acabat el programa el mòdul wikipedia subministra una funció per aturar el bot i evitar que continuí ocupant recursos.
stopme(): Desconnecta el bot de la wiki
Escriviu el següent programa (modificat del d'abans) i proveu-lo:
import wikipedia.py
pagina_de_proves = wikipedia.Page(wikipedia.getSite("ca","wikipedia"), u"Viquipèdia:Pàgina de proves")
text_actual = pagina_de_proves.get()
text_nou = u"prova d'edició amb bot\n" + text_actual
wikipedia.showDiff(text_actual, text_nou)
decisio = wikipedia.inputChoice(u"voleu gravar la pàgina modificada?", ["si","no"], ["s","n"], "n")
if decisio == "S" :
pagina_de_proves.put(text_nou,u"Proves de programació d'un bot")
wikipedia.output(u"s'ha gravat la pàgina de proves modificada")
wikipedia.stopme()
catlib.py
[modifica]
El mòdul catlib permet treballar amb categories. Primer cal obtenir un objecte de tipus categoria. Això es fa amb la instrucció: categoria = catlib.Category(llocwiki, nom_de_la_categoria). Llavors es poden emprar els mètodes que subministra el mòdul:
articles(recursiu, començant_per): Torna una llista d'objectes pàgina amb totes les pàgines de la categoria. Els arguments són opcionals. Si es posa
_TRUE_ a l'argument "recursiu", llavors també torna les pàgines de les subcategories. "començant_per" és per
indicar per on es vol començar si no es diu res comença pel començament.
subcategories(recursiu, començant_per) : Torna totes les subcategories d'una categoria. Els arguments són opcionals. Si es posa _TRUE_ a l'argument
"recursiu", llavors també torna les subcategories de les subcategories. "començant_per" és per indicar
per on es vol començar si no es diu res comença pel començament.
supercategories() : Torna la llista de categories a les quals pertany la categoria.
userlib.py
[modifica]
Aquest mòdul proporciona mètodes per tractar amb usuaris. Primer cal crear un objecte de tipus usuari amb la funció User
. El següent programa il·lustra els principals mètodes que hi ha al mòdul:
import wikipedia, userlib
pagina_meva = userlib.User('ca', u"Poseu_aqui_el_vostre_nom_d'usuari")
x = pagina_meva.getUserPage()
wikipedia.output(x.get())
x = pagina_meva.contributions(5)
for contribucio in x :
pagina = contribucio[0]
id = contribucio[1]
data_i_hora = contribucio[2]
comentari = contribucio[3]
print "pagina: ", pagina, "id: ", id, "data i hora: ", data_i_hora, "comentari: ",comentari
x = pagina_meva.editedPages(5)
for pagina in x :
print "pagina: ", pagina
pagina_meva.sendMail("Resultat del programa", u"S'ha acabat d'executar el programa de prova del curs de programació de bots\n\nSalutacions.")
La primera instrucció carrega els mòduls "wikipedia" i "userlib". Llavors es crea un objecte usuari corresponent al vostre (recordeu de posar el vostre nom d'usuari).
Després es fa servir el mètode getUserPage
per obtenir un objecte pàgina que correspon a la vostra pàgina d'usuari, la següent instrucció llegeix la vostra pàgina d'usuari (amb el mètode get
del mòdul wikipedia) i presenta en pantalla el contingut.
Tot seguit s'obtenen les 5 últimes contribucions que heu fet amb el mètode contributions
. Les contribucions són una llista de llistes, cada element de la llista conté una llista amb quatre elements: la pàgina, l'identificador de l'edició (vegeu accés a edicions antigues del mòdul wikipedia), la data i hora i el comentari. Fixeu-vos que el que fa el bucla for és presentar-vos en pantalla el detall d'aquestes 5 contribucions.
Les següents instruccions fan el mateix però sense el detall de cada contribució, només obtenen les pàgines. Per axó es fa servir el mètode editedPages.
Finalment us envia un correu-e indicant-vos el rsultat d'acabar l'execució del programa emprant el mètode sendMail. Aquest mètode té 3 paràmetres (a l'exemple només fa servir els dos primers): 1)Concepte del correu-e (una cadena) 2)Contingut del correu-e (una cadena) 3)Si voleu que us faci copia a vosaltres del correu-e que ha enviat (un booleà _TRUE_ o _FALSE_).
pagegenerators.py
[modifica]
Aquest mòdul conté una sèrie de funcions que permeten crear objectes de tipus generador de pàgines. Un objecte generador de pàgines és un objecte iterable que dóna objectes de tipus pàgina.
Exemple:
import pagegenerators
x = pagegenerators.AllpagesPageGenerator("Joan", 3)
contador = 0
for usuari in x :
print usuari
contador += 1
if contador > 5 : break
La primera instrucció carrega el mòdul pagegenerators.
La segona instrucció crea un objecte de tipus generador de pàgines i l'emmagatzema a la variable "x". Aquest objecte genera totes les pàgines de l'espai de noms 3 (l'espai de pàgines de discussió d'usuari) començant per la pàgina "joan". Si no es posa el paràmetre espai de noms els agafa tots i si no es posa pàgina de començament comença per la primera.
Llavors s'itera aquest objecte amb la instrucció for
i s'escriuen per pantalla les 5 primeres pàgines generades.
Altres funcions per crear generadors de pàgines que hi ha disponibles en aquest mòdul són:
Elements creats recentment a la viquipèdia:
NewpagesPageGenerator(nombre) Pàgines noves. Si no es diu el nombre en dóna 100.
NewimagesPageGenerator(nombre) Imatges noves. Si no es diu el nombre en dóna 100.
RecentchangesPageGenerator(nombre) Pàgines modificades recentment. Si no es diu el nombre en dóna 100.
Pàgines amb "problemes":
UnusedFilesGenerator(nombre) Imatges no utilitzades enlloc. Si no es diu el nombre en dóna 100.
WithoutInterwikiPageGenerator(nombre) Pàgines sense interwikis. Id.
UnCategorizedPageGenerator(nombre) Pàgines sense categoria. Id.
LonelyPagesPageGenerator(nombre) Pàgines a les que no enllaça ningú. Id.
UnwatchedPagesPageGenerator(nombre) Pàgines que no vigila ningú. Id.
DeadendPagesPageGenerator(nombre) Pàgines sense cap enllaç intern. (culs de sac). Id.
Pàgines al atzar:
RandomPageGenerator(nombre) Pàgines aleatòries. Si no es diu el nombre en dóna 10.
Resultat d'una cerca:
SearchPageGenerator(text, nombre) Pàgines que resulten d'una cerca a viquipèdia. Text és una cadena amb el text de cerca. Si no es diu el nombre