Páginas

Aviso

Este blog lleva inactivo desde el año 2011. Para ver mi actual web personal, entra en emilio.org.es.

viernes, 29 de febrero de 2008

Los profes se apuntan a esto de Wikipedia

Santiago J., profesor de la UPV y responsable de las asignaturas Comunicaciones Móviles y Comunicaciones Digitales ha incluido en el programa docente la posibilidad de que los alumnos incrementen en 1 punto su nota final si colaboran con Wikipedia.

Es especialmente cuidadoso advirtiendo que todas las colaboraciones deberán cumplir las políticas de Wikipedia, algo que veníamos clamando hace mucho. Últimamente algunos profesores habían tomado esta iniciativa pero habían soltado a sus alumnos en medio de la enciclopedia sin darles la mas mínima noción ni consejo, lo que ha llevado a algunos malentendidos y follones.

¿Y si todos los profesores tomaran nota y premiaran el colaborar con la cultura libre? ¿A dónde llegaríamos?

Curso de bots (II)

Hoy haremos nuestro primer bot desde cero. La vez anterior utilizamos un script para poner interwikis que ya estaba hecho. Nuestro bot no tendrá utilidad alguna más allá de enseñarnos las funciones básicas para el control de páginas de Wikipedia: capturar el contenido, hacer alguna operación con él, y subir el contenido nuevo al servidor.

Hay que tener en cuenta que cualquier script que programemos deberá almacenarse en el directorio donde tengamos descomprimido pywikipediabot, en la primera entrega dijimos c:\bots.

Si abres el archivo wikipedia.py con el Notapad++ verás que en la parte de arriba contiene una serie de instrucciones. El primer bloque son funciones que pueden aplicarse a objetos "page" (página). El segundo bloque contiene funciones para los objetos "site" (sitio). Ambos objetos dependen uno de otro, toda página (o artículo) está en un sitio (proyecto de Wikimedia).

Si queremos trabajar con el artículo "Isaac Newton" debemos crear un objeto "page" pasándole el proyecto (Wikipedia en español) y el nombre del artículo (Isaac Newton). Esto se hace de la siguiente forma:
mipagina = wikipedia.Page(wikipedia.Site("es", "wikipedia"), u"Isaac Newton")
Asignamos a la variable mipagina el objeto creado con las características que ya hemos descrito. Ahora, supuestamente podemos hacer cualquier cosa con mipagina, desde bajarnos el contenido del artículo al que apunta, hasta trasladarlo.

Para que funcione la línea que he puesto antes, deberás incluir al principio de nuestro script lo siguiente:
import wikipedia
Lo que hace es importar la libreria wikipedia.py, ya que es donde se encuentrar las funciones Page y Site que hemos usado.

Esto de momento no hará nada, si lo ejecutas desde una ventana o shell lo podrás comprobar. El script se inicia, genera el objeto mipagina y acaba. No muestra nada. Completémoslo un poco.

Añade la línea wikipedia.output(mipagina.get()) al final de tu script y vuelve a ejecutarlo (sino recuerdas como ejecutar los scripts, lee la primera parte de este tutorial).
import wikipedia
mipagina = wikipedia.Page(wikipedia.Site("es", "wikipedia"), u"Isaac Newton")
wikipedia.output(mipagina.get())

¿Intuyes que va a hacer este programa? Mostrará el contenido del objeto mipagina en tu pantalla, esto es el contenido del artículo "Isaac Newton", con sus enlaces [[ ]] sin procesar, etc. Si el artículo es largo, como posiblemente así sea, veras un montón de líneas pasando muy rápido.

Hemos conseguido bajarnos el texto del artículo con la función get(). ¿Y si quisieramos modificar el artículo? Usaríamos la función put(). Como veis todo esto consiste en tener las funciones necesarias a mano y aplicarlas sobre el objeto mipagina.

Si quisieramos poner "Isaac Newton es el mejor científico de la historia" nuestro código se mostraría así:
import wikipedia
mipagina = wikipedia.Page(wikipedia.Site("es", "wikipedia"), u"Isaac Newton")
mipagina.put(u"Isaac Newton es el mejor científico de la historia", u"Estoy modificando el artículo de Newton")

La función put() recibe dos parámetros del tipo string o cadena. El primero de ellos es el contenido que subiremos al artículo, el segundo es el resúmen de edición.

Por favor, no ejecutes este script, es para que veais como se hace, no quiero que el historial de "Isaac Newton" se llene de ediciones de prueba. Para eso está la Zona de pruebas. Modifica tu script para que apunte a la Zona de pruebas, y entonces ejecútalo. ¿Cómo se hace esto? Cambiando el nombre de la página:
import wikipedia
mipagina = wikipedia.Page(wikipedia.Site("es", "wikipedia"), u"Wikipedia:Zona de pruebas")
mipagina.put(u"Estoy modificando la Zona de pruebas", u"Esto es una prueba")

Ahora sí, ejecútalo y ve al historial de la ZP y allí verás la edición de tu bot.

¿Y si resulta que queremos añadir texto al final de la página, sin destruir lo que ya hay escrito? Es muy fácil, tan solo hay que combinar ambas funciones put() y get():
import wikipedia
mipagina = wikipedia.Page(wikipedia.Site("es", "wikipedia"), u"Wikipedia:Zona de pruebas")
mipagina.put(u"%s\nEstoy modificando la Zona de pruebas" % mipagina.get(), u"Esto es una prueba")

¿Estás hecho un lío? Sólo hemos insertado un parámetro de formato en la cadena entre comillas, esto es %s y sirve para insertar en esa posición otra cadena. Como bien habrás adivinado, esta cadena es el contenido de la Zona de pruebas que le pasamos con mipagina.get(). Haciendo esto no borraremos el contenido de la Zona de pruebas, sino que estaremos añadiendo la frase "Estoy modificando la Zona de pruebas" al final de la página. El símbolo "\n" se utiliza para insertar una newline (nueva línea).

Ahora como recomendación, es posible que queramos modificar varias páginas, luego necesitaremos llamar varias veces a la función wikipedia.Page() para crear un objeto por cada página. Podemos simplificar el código insertando una línea al comienzo de nuestro script, tras la zona de importaciones.
import wikipedia
misitio = wikipedia.Site("es", "wikipedia")

mipagina = wikipedia.Page(misitio, u"Isaac Newton")
mipagina.put(u"%s\nLa línea sale al final" % mipagina.get(), u"Esto es una prueba")

mipagina = wikipedia.Page(misitio, u"Albert Einstein")
mipagina.put(u"Esta línea sale al principio\n%s" % mipagina.get(), u"Esto es una prueba")

Creando el objeto misitio nos ahorramos reescribir el tedioso texto wikipedia.Site("es", "wikipedia") una y otra vez y evitamos errores. Supongo que habrás intuido que cambiando "es" por "fr" o "en", estaremos editando Wikipedia en francés y en inglés respectivamente. Aunque tu bot necesitará estar registrado en ellas.

Como final, decir que leas la documentación de el fichero wikipedia.py, algunas muy interesantes son las siguientes:
isRedirectPage (*) : True if the page is a redirect, false otherwise
isEmpty (*) : True if the page has 4 characters or less content, not
counting interwiki and category links
interwiki (*) : The interwiki links from the page (list of Pages)
categories (*) : The categories the page is in (list of Pages)
linkedPages (*) : The normal pages linked from the page (list of Pages)
imagelinks (*) : The pictures on the page (list of ImagePages)
isDisambig (*) : True if the page is a disambiguation page

Y recuerda, todas las pruebas en la Zona de pruebas.

martes, 19 de febrero de 2008

Curso de bots (I)

Wikipedia es muy grande, y hacer mantenimiento es una tarea tediosa y aburrida. Por fortuna, disponemos de unas bibliotecas que nos permiten automatizar estas tareas, para que un robot las haga mientras nosotros estamos tumbados en la cama leyendo un libro. O pensando más bots.

El lenguaje que utilizaremos en este curso es Python, además de un paquete llamado pywikipediabot (su nombre es descriptivo). Así que antes de nada deberías bajar el intérprete de Python, bajar pywikipediabot, y buscar algún manual de Python, ya que a pesar de que explicaré algunas cosas, la misión de este tutorial no es enseñar Python, sino enseñar a crear bots. El matiz es pequeño, pero importante. Por cierto, para programar los scripts puedes usar Notepad++, sino eres de la Iglesia de Emacs.

Se me olvidaba comentar algunos requisitos que debes tener para entender la mayor parte de este curso. Deberías saber lo básico de programación: asignaciones, sentencias condicionales (if-else), bucles (for, while), y hacer funciones. Esto cambia ligeramente de un lenguaje a otro, pero la esencia es la misma. Si no, igualmente podrás leer este curso aunque te costará más.

En este punto supongo que ya tienes instalado el intérprete de Python, que has extraido pywikipediabot en un directorio y que tienes una consola abierta (consola de MS-DOS en Windows, o shell en GNU/Linux). La consola puede abrirse en Windows desde "Inicio/Ejecutar" ejecutando "cmd.exe".

Utiliza el comando "cd" para llegar hasta el directorio donde está pywikipediabot. Ejecutamos "interwiki.py -start:! -autonomous". Todo lo pongo entre comillas pero tú no debes incluirlas.

Bien, desglosemos la línea de instrucciones que hemos escrito:

  • interwiki.py Es el script en python que queremos ejecutar (pone interwikis en artículos).
  • -start:! Es un parámetro de entrada al script. Nos sirve para decirle a partir de que artículo va a empezar a analizar. Poniendo ! nos aseguramos de que comienza al principio de todo. Si pusieramos -start:A nos estaríamos dejando sin analizar los artículos de años, por ejemplo, ya que son numéricos.
  • -autonomous Le indica al script que no nos pregunte una y otra vez sobre si poner interwikis aquí o allí, sino que funcione de manera autónoma.

Un momento, ¿a alguien le ha funcionado esto? Seguramente no, a menos que ya tuvieras los datos de tu bot escritos en un fichero llamado user-config.py. Debe haberte salido un error como el siguiente:

    Please create a file user-config.py, and put in there:

One line saying "mylang='language'"
One line saying "usernames['wikipedia']['language']='yy'"

...filling in your username and the language code of the wiki you want to work
on.

For other possible configuration variables check config.py.

Esto quiere decir que debes abrir tu editor, crear un nuevo fichero de texto, y escribir estos datos:

    family = 'wikipedia'
mylang = 'es'
usernames['wikipedia']['es'] = 'Mibot'

Cosas importantes a tener en cuenta. Yo que tú no le ponía un nick con tildes. Es posible ponérselas pero deberías incluir una u delante del nick, así u'Mibot'. Las tildes suelen dar errores, así que mejor evitarlas en los nombres de usuario. Otra cosa, supongo que te habrás dado cuenta de que necesitas registrar una cuenta de usuario para tu bot, antes de crear el user-config.py. Sino, corre a hacerle una. Yo tengo dos en Wikipedia en español: BOTijo y AVBOT. Como ves, la gente suele hacer juegos de palabras con BOT.

Bien, una vez que has escrito y guardado el user-config.py y has creado una cuenta para tu bot, todo debería ir como la seda. Posibles errores: no has elegido la codificación UTF-8, has escrito mal alguna de las palabras, la cuenta no existe, tecleaste mal la contraseña...

Hagamos la prueba de fuego. Escribe login.py y espera a que te pida el password. Si da error, revisa los pasos anteriores, si te sigue sin funcionar deja un comentario. Si te pide la contraseña, introdúcela, pero hazlo despacio y bien, que si te equivocas saltará el captcha en el servidor, y deberás hacer login tú mismo con la cuenta de tu bot mediante un navegador, escribir el captcha, y luego desloguearte. Esto es para resetear la protección del captcha.

Te has logueado, ahora puedes volver a escribir interwiki.py -start:! -autonomous y debería funcionar. Sino funciona, repasa los pasos, y si todavía no sale, ponte en contacto conmigo. Es posible que el bot no encuentre ningún interwiki que agregar, ya que los primeros artículos están muy revisados, casi todo el mundo empieza por el !. Empieza por la J o la M o la Z. Por cierto, vigila los cambios que hace tu bot y comprueba que están bien.

Yo que tú no utilizaría mucho el bot de interwikis, ya que es aburrido. A mi me gusta crear bots con funcionalidades nuevas y genuinas. De todas formas, asegúrate de pedir flag de bot antes de correr un bot masivamente. Si estás haciendo pruebas, menos de 25 ediciones al día o así, no suele resultar molesto. Pero aun así, si piensas seguir adelante con esto de los bots, hazte con un flag lo antes posible. Claro que para pedir flag debes decir que utilidad le darás al bot –y para darle utilidad antes debe hacer el script, saber cómo manejarlo y haber hecho pruebas– luego es un bucle que hay que romper por algún sitio. La gente, normalmente, lo rompe haciendo pruebas sin molestar e intermitentemente.

Bueno, has instalado todo lo necesario para programar bots, has metido los datos de la cuenta de tu bot y has ejecutado el script de interwikis. No es poco para ser la primera parte.

  • Nota: A veces es necesario poner la palabra python delante de cada línea de instrucciones en la consola, para invocar al intérprete de Python. Esto me pasa en Linux, pero no es necesario en Windows.

lunes, 18 de febrero de 2008

Películas a la vieja usanza

No me esperaba que aun quedasen artículos de películas con el formato antiguo. Desconozco cuantos habrá, pero deben ser muy pocos. Este modelo se usaba hace años, cuando las infoboxes era algo nuevo. Lo dicho, una reliquia.

martes, 5 de febrero de 2008

Con Rajoy es posible

Por cosas como esta no hay que votar a Rajoy

Licencia

Unless stated otherwise, the text of the blog posts is published under this Creative Commons license.
A menos que se indique otra cosa, el texto de las entradas del blog se publica bajo esta licencia Creative Commons.
Licencia de Creative Commons