¡Vikidia te necesita!
Actualmente tenemos 6500 artículos. ¡Anímate! a crear los artículos solicitados |
Usuario:UnroBot/imágenes.py
Ir a la navegación
Ir a la búsqueda
Este código examina todos los artículos de Vikidia. Si un artículo no tiene imágenes, lo añade en Categoría:Artículos para ilustrar. Asimismo, si el artículo está en dicha categoría tiene una imagen, borra la categoría del artículo. Para ejecutar ese código es necesario disponer de Python 2 y la librería de Python "pywikibot".
- Posible error
Si una página no tiene imágenes pero contiene una plantilla con un icono (ej. {{metaplantilla}}
) y además contiene una extensión de imagen dentro del texto (.jpg
, .png
...) el bot tratará la página como si tuviera una imagen.
# -*- coding: utf-8 -*-
import pywikibot as pwb
from pywikibot import pagegenerators as pg
import urllib, urllib2
import json
def detectar(page):
print(page)
quoted = urllib.quote(page.encode('utf8'))
link = 'https://es.vikidia.org/w/api.php?action=query&prop=images&titles=%s&format=json' % quoted
raw = urllib2.urlopen(link).read() ## Leer el contenido del url, con datos json no procesados (no será necesario procesarlos)
#print raw
if "#REDIREC" in raw:
return
if "\"images\":" in raw:
print u"Contiene imágenes"
return True
else:
print u"No contiene imágenes"
return False
def comprobarcat(page, imagenes):
if imagenes == "si": ## Si la página tiene imágenes...
formatos = ['.jpg', '.png', '.svg', '.JPG', '.PNG', '.jpeg', '.JPEG', '.gif', '.GIF']
for formato in formatos:
if formato in page.text: # En caso de que haya un sufijo de imagen (para evitar falsos positivos)
print u"Contiene imágenes"
siimg(page)
elif imagenes == "no": ## Si la página no tiene imágenes...
noimg(page)
def noimg(page): ## Hacer lo siguiente si no hay imágenes:
text = page.text
if not u'[[Categoría:Artículos para ilustrar]]' in text: ## En caso de que no haya la categoría...
page.text = text + u'\n[[Categoría:Artículos para ilustrar]]' ## Añadir la categoría al final del artículo.
page.save(u"Bot: añadiendo [[Categoría:Artículos para ilustrar]]") ## Guardar la página
print u"Categoría añadida"
else: ## En caso de que el artículo esté categorizado como tal, ya no hacemos nada
print u"Ya está categorizado."
def siimg(page): ## Hacer lo siguiente si hay imágenes:
text = page.text
if u'[[Categoría:Artículos para ilustrar]]' in text: ## En caso de que haya la categoría...
page.text = text.replace(u'[[Categoría:Artículos para ilustrar]]', '') ## Reemplazar la categoría por nada (es decir, borrarla)
page.save(u"Bot: quitando [[Categoría:Artículos para ilustrar]]") ## Guardar la página
print u"Categoría borrada"
else: ## En caso de que no haya la categoría, saltar la página
print u"No tiene la categoría."
def adderror(errpage, page, reason): ## Función auxiliar para reportar errores en Usuario:UnroBot/errores en caso de conflicto de edición o página protegida
text = errpage.text
if page in text:
print("Already in text")
return
noutext = text + '\n* %s. Motivo: %s\n' % (page.replace('es:', ''), reason)
errpage.text = noutext
errpage.save(u"Bot: Añadiendo informe de error.")
if __name__ == '__main__':
site = pwb.Site('es', 'vikidia')
#page = pwb.Page(site, 'Usuario:UnroBot/pruebas')
for page in list(pg.AllpagesPageGenerator(site=site)):
try:
nombre = str(page).decode('utf8').replace('[[es:', '').replace(']]', '')
resultado = detectar(nombre)
if resultado == True:
comprobarcat(page, "si")
elif resultado == False:
comprobarcat(page, "no")
else:
pass
except pwb.exceptions.LockedPage:
adderror(pwb.Page(site, 'Usuario:UnroBot/errores'), str(page).encode('utf8'), u'Página protegida')
except pwb.exceptions.EditConflict:
adderror(pwb.Page(site, 'Usuario:UnroBot/errores'), str(page).encode('utf8'), u'Conflicto de edición')
except urllib2.HTTPError:
adderror(pwb.Page(site, 'Usuario:UnroBot/errores'), str(page).encode('utf8'), u"Error al consultar la ''API'' de MediaWiki: <code>urllib2.HTTPError: HTTP Error 400: Bad Request</code>")
except UnicodeDecodeError:
print("ERROR UNICODE") # No podemos añadir el error a la página de errores porque también daría error