Usuario:Bigsus-bot/Variables.py

Este script programado en python se utiliza para actualizar los datos estadísticos de varias wikipedias en Plantilla:Variables.

# -*- coding: utf-8  -*-
# Código GPL, autor: BigSus
# http://es.wikipedia.org/wiki/Usuario:Bigsus-bot/Variables.py

import wikipedia, time, re
from urllib import urlopen
from operator import itemgetter

# modo = None actualizará los listados de todos los wikis
modo = 'es'

parametros = {
    'ca': {
        'pagina':    u'Plantilla:Variables/dades',
        'resumen':   u'Bot: Actualitzant plantilla',
        'principio': u'<!-- Para añadir un nuevo idioma, pídelo en la discusión, no lo añadas directamente. -->',
        'final':     u''
    },
    'en': {
        'pagina':    u'Template:NUMBEROF/data',
        'resumen':   u'Bot: Automatic update of variables',
        'principio': u'<!-- If you want to add a new language, ask for it in the talk pages, not here directly. -->',
        'final':     u''
    },
    'es': {
        'pagina':    u'Plantilla:Variables/datos',
        'resumen':   u'Bot: Actualización automática de variables',
        'principio': u'<!-- Para añadir un nuevo idioma, pídelo en la discusión, no lo añadas directamente. -->',
        'final':     u'\n\n[[Categoría:Wikipedia:Plantillas de apoyo]]'
    },
    'tr': {
        'pagina':    u'Şablon:Viki istatistikleri/veri',
        'resumen':   u'Bot: Automatic update of variables',
        'principio': u'<!-- If you want to add a new language, ask for it in the talk pages, not here directly. -->',
        'final':     u'\n\n[[Kategori:Vikipedi şablonları]]'
    }
}

       
def generar_datos():
    """
    Recorrer todos los wikis en busca de los datos que necesitamos.
    Se devuelve un array con todos los datos para procesarlos después.
    """
    modo2 = modo
    if modo2==None:
        modo2 = 'todos'

    # Idiomas para revisar (listado automática)
    lista_idiomas = wikipedia.Site.languages(wikipedia.Site('es', 'wikipedia'))
    
    wikipedia.output('Iniciando variables.py...\nFecha y hora al comenzar el análisis: \03{lightred}%s\03{default}. Idioma: \03{lightred}%s\03{default}' % (time.strftime("%d-%m-%Y %H:%M:%S", time.localtime()), modo2))
    wikipedia.output('Se han encontrado %s idiomas para revisar.\n' % len(lista_idiomas))
    wikipedia.output('\t+---------+------------+-----------+\n\t|idioma ··|·· total  ··|·· arts. ··|\n\t+---------+------------+-----------+')

    # Variables comunes
    parserData = r"total=(?P<total>.*);good=(?P<good>.*);views=(?P<views>.*);edits=(?P<edits>.*);users=(?P<users>.*);activeusers=(?P<activeusers>.*);admins=(?P<admins>.*);images=(?P<images>.*);jobs=(?P<jobs>.*)"
    partesPage = r""

    articulosT = 0
    ficherosT = 0
    paginasT = 0
    usuariosT = 0
    usuariosactivosT = 0
    adminsT = 0
    editsT = 0

    datos = []
    i = 0

    for idioma in lista_idiomas:
        texto = urlopen('http://%s.wikipedia.org/wiki/Special:Statistics?action=raw' % (idioma)).read()
        param = re.search(parserData, texto)
        wikipedia.output(' %s	\03{lightpurple}%s\03{default}	... %s	... %s' % (i+1, idioma, param.group('total'), param.group('good')))

        datos.append([idioma, int(param.group('good')), int(param.group('images')), int(param.group('total')), int(param.group('users')), int(param.group('activeusers')), int(param.group('admins')), int(param.group('edits'))])

        # Calcular totales
        articulosT += datos[i][1]
        ficherosT += datos[i][2]
        paginasT += datos[i][3]
        usuariosT += datos[i][4]
        usuariosactivosT += datos[i][5]
        adminsT += datos[i][6]
        editsT += datos[i][7]

        i += 1

    # Ordenar por número de artículos
    datos.sort(key=itemgetter(1), reverse=True)

    # Añadir el total al final de la lista
    datos.append(['total', articulosT, ficherosT, paginasT, usuariosT, usuariosactivosT, adminsT, editsT])

    return datos

def generar_texto(datos, idioma):
    """
    Genera el texto correspondiente para cada idioma.
    """
    new = parametros[idioma]['principio'] + u'<onlyinclude>{{#switch:{{{1}}}\n'
    
    for elem in datos:
        new += u"| " + elem[0] + u' = {{#switch:{{{2}}}'
        
        if elem[0]==idioma and idioma<>None:
            new += u"\n\t| NUMBEROFARTICLES | ARTICLES = {{NUMBEROFARTICLES:R}}"
            new += u"\n\t| NUMBEROFFILES | FILES = {{NUMBEROFFILES:R}}"
            new += u"\n\t| NUMBEROFPAGES |PAGES = {{NUMBEROFPAGES:R}}"
            new += u"\n\t| NUMBEROFUSERS | USERS = {{NUMBEROFUSERS:R}}"
            new += u"\n\t| NUMBEROFACTIVEUSERS | ACTIVEUSERS = {{NUMBEROFACTIVEUSERS:R}}"
            new += u"\n\t| NUMBEROFADMINS | ADMINS = {{NUMBEROFADMINS:R}}"
            new += u"\n\t| NUMBEROFEDITS | EDITS = {{NUMBEROFEDITS:R}}"
        else:
            new += u"\n\t| NUMBEROFARTICLES | ARTICLES = " + str(elem[1])
            new += u"\n\t| NUMBEROFFILES | FILES = " + str(elem[2])
            new += u"\n\t| NUMBEROFPAGES | PAGES = " + str(elem[3])
            new += u"\n\t| NUMBEROFUSERS | USERS = " + str(elem[4])
            new += u"\n\t| NUMBEROFACTIVEUSERS | ACTIVEUSERS = " + str(elem[5])
            new += u"\n\t| NUMBEROFADMINS | ADMINS = " + str(elem[6])
            new += u"\n\t| NUMBEROFEDITS | EDITS = " + str(elem[7])

        new += u"\n\t| 0 }}\n"

    new += u"| 0 }}</onlyinclude>" + parametros[idioma]['final']

    return new

def guardar(datos, idioma):
    """
    Guarda el texto generado para el idioma seleccionado.
    """
    page = wikipedia.Page(idioma, parametros[idioma]['pagina'])
    new = generar_texto(datos, idioma)
    page.put(new, parametros[idioma]['resumen'])

datos = generar_datos()
wikipedia.output('\n')

if modo not in parametros:
    for i in parametros:
        guardar(datos, i)
else:
    guardar(datos, modo)