Engánchese a información Wikipedia usando PHP y la API MediaWiki

Use PHP para buscar, recuperar y modificar entradas Wikipedia mediante la API MediaWiki

Wikipedia es la máxima enciclopedia en línea y contiene millones de entradas sobre diferentes aspectos del conocimiento humano. Los desarrolladores de aplicaciones Web pueden accesar y buscar estas contribuciones mediante la API Wikipedia. Este artículo presenta la API Wikipedia y la demuestra en el contexto de una aplicación PHP, explicando cómo buscar y recuperar diferentes elementos de contenido Wikipedia con PHP.

Vikram Vaswani, Founder, Melonfire

Photo of Vikram VaswaniVikram Vaswani es fundador y CEO de Melonfire, una firma de servicios de consultoría con experiencia y conocimientos en herramientas y tecnologías de fuente abierta. También es el autor de los libros Zend Framework: A Beginners Guide y PHP: A Beginners Guide.



29-07-2011

Introducción

Acrónimos de uso frecuente

  • API: Application program interface
  • CSRF: Cross-site request forgery
  • HTML: Hypertext Markup Language
  • HTTP: Hypertext Transfer Protocol
  • IP: Internet Protocol
  • JSON: JavaScript Object Notation
  • OOP: Object-oriented programming
  • PEAR: PHP Extension and Application Repository
  • REST: REpresentational State Transfer
  • WDDX: Web Distributed Data eXchange
  • XHTML: Extensible Hypertext Markup Language
  • XML: Extensible Markup Language
  • YAML: YAML Ain't Markup Language

La mayoría de las personas han oído sobre Wikipedia: Es el máximo repositorio de conocimiento alimentado por público, cubriendo casi cada tema en el que se pueda pensar y disponible para cualquiera con un navegador Web. Sin importar la información que usted busque, podrá encontrarla en Wikipedia, y a menudo, exhaustivamente detallada. Y como se puede editar públicamente, siempre contiene información relevante y actualizada.

Pero la mayoría de las personas no sabe una cosa sobre Wikipedia. Escondida detrás de escena hay una sólida API de servicio web que permite a los desarrolladores accesar, buscar e integrar contenido Wikipedia a aplicaciones Web personalizadas. Esta API, que funciona sobre HTTP y que regresa datos en una variedad de formatos diferentes incluyendo XML, está disponible gratuitamente para el público programador y hace posible crear todo tipo de aplicaciones Web personalizadas potenciadas por la inmensa base de datos de contenido de Wikipedia.

En este artículo presento una breve introducción a esta API, mostrándole cómo integrarla y utilizarla con mi lenguaje de programación preferido PHP. Este artículo explica lo básico sobre cómo funciona la API y luego le da una guía práctica paso a paso de categorías de listados, buscando entradas por categoría o palabra clave, recuperando y mostrando entradas y agregando contenido editado de forma remota.


Entendiendo la API

Antes de pasar al código PHP, hay algunas palabras que decir sobre la API Wikipedia. Primero, aunque la llamo "API Wikipedia" en este artículo, es importante señalar que la API no es única para Wikipedia. En realidad es parte de la aplicación base MediaWiki sobre la cual se ejecuta Wikipedia y por ello las técnicas y métodos API descritos en este artículo también se pueden usar en otros wiki basados en MediaWiki. Usted puede encontrar enlaces hacia MediaWiki y hacia el manual de referencia completo de la API MediaWiki en Recursos .

Así como con todos los servicios basados en HTTP, la API funciona aceptando solicitudes HTTP que contengan uno o más argumentos de entrada y que retornen respuestas que el cliente solicitante pueda analizar y utilizar. Con mayor frecuencia de lo esperado, la respuesta está en formato XML, dado que casi cualquier lenguaje de programación actual puede analizar XML; no obstante, también es posible solicitar respuestas en otros formatos como JSON, WDDX, YAML o PHP serializado.

Cada solicitud HTTP a la API debe contener un parámetro "action" obligatorio, el cual especifica la acción requerida. Este parámetro puede ser una consulta, una operación de edición o de eliminación, una solicitud de autenticación o cualquier otra de las acciones soportadas. Además de este parámetro obligatorio y dependiendo de la operación seleccionada, se deben pasar argumentos adicionales—por ejemplo, una palabra clave de búsqueda para consultas, un título de página para operaciones de edición o eliminación, o un nombre de usuario y contraseña para autenticación.

Para ver la API en acción, intente acceder al siguiente URL desde su navegador Web favorito. (Nota:Este URL es en realidad una cadena individual de caracteres. Únicamente para propósitos de formato, el URL aparece en dos líneas).

http://en.wikipedia.org/w/api.php?action=query&list=allcategories&acprop=size
          &acprefix=hollywood&format=xml

Este método retorna una lista de las primeras 10 categorías de Wikipedia que comienzan con el prefijo "hollywood". El Listado 1 ilustra la respuesta XML primaria a esta solicitud.

Listado 1. Un feed de API de ejemplo
<?xml version="1.0"?>
<api>
  <query>
    <allcategories>
      <c size="31" pages="28" files="0" subcats="3" 
        xml:space="preserve">Hollywood</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood's Rock Walk inductees</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood, California</c>
      <c size="1" pages="1" files="0" subcats="0" 
        xml:space="preserve">Hollywood, Florida</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood, Los Angeles, California</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood.com/celebrity/Wanda Shelley</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood Actors</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood Actress</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood Blacklist</c>
      <c size="2" pages="2" files="0" subcats="0" 
        xml:space="preserve">Hollywood Boulevard</c>
    </allcategories>
  </query>
  <query-continue>
    <allcategories acfrom="Hollywood Cemetery (Richmond)" />
  </query-continue>
</api>

Listando categorías y páginas

Ahora que usted entiende cómo funciona la API, vamos a ver algo de código. A lo largo de este artículo asumo que usted está familiarizado(a) con HTML y ML y que cuenta con un entorno de desarrollo Apache/PHP con la última versión del Zend Framework instalada. Supongo también que usted conoce los fundamentos del trabajo con clases y objetos en PHP, dado que los componentes PHP usados en este artículo están escritos en cumplimiento con los principios OOP.

Para interactuar con la API usted necesita un cliente HTTP que sea capaz de transmitir solicitudes GET y POST y de manejar respuestas. Una buena herramienta para esto es el componente Zend_Rest_Client del Zend Framework, que está diseñado específicamente para que desarrolladores intentando integrar aplicaciones PHP con servicios web. Este cliente se puede utilizar para efectuar respuestas GET, POST, PUT y DELETE hacia un punto final de servicio. Las respuestas XML se retornan como instancias de objetos Zend_Rest_Client_Response, facilitando el acceso a propiedades de respuesta individual.

El Listado 2 ilustra el proceso de recuperar y mostrar las categorías del Listado 1, usando Zend_Rest_Client en el contexto de un script PHP.

Listado 2. Listando categorías Wikipedia
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define category prefix
$prefix = 'hollywood';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->list('allcategories');
  $wikipedia->acprefix($prefix);
  $wikipedia->format('xml');

  // perform request
  // iterate over XML result set
  $result = $wikipedia->get();
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head></head>
  <body>
    <h2>Search results for categories starting with 
      '<?php echo $prefix; ?>'</h2>
    <ol>
    <?php foreach ($result->query->allcategories->c as $c): ?>
      <li><a href="http://www.wikipedia.org/wiki/Category:
        <?php echo $c; ?>"><?php echo $c; ?></a></li>
    <?php endforeach; ?>
    </ol>
  </body>
</html>

El Listado 2 primero inicializa el auto-cargador Zend Framework y luego carga el componente Zend_Rest_Client. Una instancia de un objeto Zend_Rest_Client se crea y se inicializa con el punto final de servicio de API Wikipedia como argumento compilador. Luego se definen y se agregan los parámetros de solicitud y la solicitud se transmite a la API usando el métodoget() del objeto del cliente. La respuesta XML del servidor es recibida y convertida automáticamente por Zend_Rest_Client en un conjunto de objetos SimpleXML, a los que usted puede accesar usando notación estándar de propiedad de objeto.

La Figura 1 ilustra cómo se ve el resultado del Listado 2 .

Figura 1. Una página Web listando categorías Wikipedia
Una página Web listando categorías Wikipedia

Note la forma en que los parámetros de solicitud se pasan al servidor usando el Zend_Rest_Client. Cada parámetro se especifica llamando a un método de cliente con el mismo nombre y pasando el valor al método como primer argumento. Por ejemplo, para añadir el parámetro action=query a la solicitud, el script invoca $client->action('query'). Usted puede leer más sobre esto en la documentación Zend_Rest_Client (vea Recursos donde encontrará un enlace).

Usted también puede recuperar un listado de páginas dentro de una categoría, alterando la consulta para que retorne un listado de miembros de categoría en lugar de categorías. Obviamente, usted necesitará pasar el nombre de categoría a la API como entrada. Considere el Listado 3, que hace justamente esta tarea.

Listado 3. Listando páginas dentro de una categoría
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define category
$cat = 'Greek_legendary_creatures';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->list('categorymembers');
  $wikipedia->cmtitle('Category:'.$cat);
  $wikipedia->cmlimit('30');
  $wikipedia->format('xml');

  // perform request
  // iterate over XML result set
  $result = $wikipedia->get();
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head></head>
  <body>
    <h2>Search results for pages in category 
      '<?php echo $cat; ?>'</h2>
    <ol>
    <?php foreach ($result->query->categorymembers->cm as $c): ?>
      <li><a href="http://www.wikipedia.org/wiki/
        <?php echo $c['title']; ?>">
        <?php echo $c['title']; ?></a></li>
    <?php endforeach; ?>
    </ol>
  </body>
</html>

El Listado 3 especifica el nombre de la categoría y pasa el nombre a la API usando el parámetro cmtitle . Note también el parámetrocmlimit que especifica el número de resultados a retornar. Como antes, Zend_Rest_Client transmite la solicitud y convierte la respuesta XML en objetos SimpleXML, facilitando analizar y mostrar los resultados de la consulta.

La Figura 2 muestra el resultado del Listado 3.

Figura 2. Una página Web listando páginas Wikipedia en la categoría seleccionada
Una página Web listando páginas Wikipedia en la categoría seleccionada

Realizando búsquedas de texto completo

Ahora, ¿qué tal buscar páginas que concuerden con una palabra clave específica? Esta tarea se logra fácilmente con la misma consulta de las páginas anteriores, excepto que en este caso usted desea listar resultados de búsqueda en lugar de miembros de categoría. Considere el Listado 4, que ilustra el proceso.

Listado 4. Listando resultados de búsqueda de texto completo
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define search query
$query = 'michelangelo';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->list('search');
  $wikipedia->srwhat('text');
  $wikipedia->format('xml');
  $wikipedia->srsearch($query);

  // perform request
  // iterate over XML result set
  $result = $wikipedia->get();
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head></head>
  <body>
    <h2>Search results for '<?php echo $query; ?>'</h2>
    <ol>
    <?php foreach ($result->query->search->p as $r): ?>
      <li><a href="http://www.wikipedia.org/wiki/
        <?php echo $r['title']; ?>">
        <?php echo $r['title']; ?></a> <br/>
      <small><?php echo $r['snippet']; ?></small></li>
    <?php endforeach; ?>
    </ol>
  </body>
</html>

El Listado 4 utiliza la misma acción query vista anteriormente, pero los parámetros son ligeramente diferentes en este caso. El parámetro list especifica que esta es una operación de búsqueda de texto completo, mientras que el parámetro srsearch especifica la palabra clave de búsqueda (en este caso, "michelangelo"). También es importante especificar el parámetro srwhat , que indica si la búsqueda debe ser efectuada en títulos de página o en texto de página.

Cada entrada de resultado de búsqueda contiene el título de página, tamaño, conteo de palabras, espacio de nombre (más sobre esto más adelante) y un fragmento del contenido de la página. Luego usted puede dar formato y presentar estos datos como una página Web HTML, como en la Figura 3.

Figura 3. Una página Web listando resultados de búsqueda Wikipedia
Una página Web listando resultados de búsqueda Wikipedia

Ejemplo de aplicación: búsqueda Wikipedia

En el mundo real, las palabras de búsqueda no están codificadas de antemano dentro del script sino que el usuario las ingresa. El Listado 5 mejora el Listado 4 para hacerlo más interactivo, permitiendo al usuario ingresar un término de búsqueda en la aplicación y ver las páginas Wikipedia que coinciden con ese términos de búsqueda.

Listado 5. Una herramienta de búsqueda Wikipedia interactiva
<html>
  <head></head>
  <body>
    <h2>Search</h2>
    <form method="post">
      Search: <input type="text" name="q" />
    </form>

    <?php
    // if form submitted
    if (isset($_POST['q'])) {
      // load Zend classes
      require_once 'Zend/Loader.php';
      Zend_Loader::loadClass('Zend_Rest_Client');

      try {
        // initialize REST client
        $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

        // set query parameters
        $wikipedia->action('query');
        $wikipedia->list('search');
        $wikipedia->srwhat('text');
        $wikipedia->format('xml');
        $wikipedia->srsearch($_POST['q']);

        // perform request
        // iterate over XML result set
        $result = $wikipedia->get();
      } catch (Exception $e) {
          die('ERROR: ' . $e->getMessage());
      }
    ?>
    <h2>Search results for '<?php echo $_POST['q']; ?>'</h2>
    <ol>
    <?php foreach ($result->query->search->p as $r): ?>
      <li><a href="http://www.wikipedia.org/wiki/
      <?php echo $r['title']; ?>">
      <?php echo $r['title']; ?></a> <br/>
      <small><?php echo $r['snippet']; ?></small></li>
    <?php endforeach; ?>
    </ol>
    <?php 
    }
    ?>

  </body>
</html>

No hay nada demasiado complejo en el Listado 5: Simplemente efectúa una verificación adicional de la entrada del usuario y pasa esa entrada al parámetro srsearch . La Figura 4 ilustra el formulario Web inicial y los resultados de la búsqueda.

Figura 4. Un formulario Web para Wikipedia busca y muestra los resultados
Un formulario Web para Wikipedia busca y muestra los resultados

Recuperando contenido de página

La API MediaWiki también le permite accesar a versiones actuales o anteriores del contenido de página al anexar el parámetro prop=revisions a la acción de consulta. En este caso, es necesario especificar el título de la página a ser retornada. Considere el Listado 6, que muestra cómo funciona esto.

Listado 6. Recuperando contenido de página
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define page title
$query = 'The A Team';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->prop('revisions');
  $wikipedia->rvprop('content');
  $wikipedia->format('xml');
  $wikipedia->redirects('1');
  $wikipedia->titles($query);

  // perform request
  // get page content as XML
  $result = $wikipedia->get();
  $content = $result->query->pages->page->revisions->rev;
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head>
  </head>
  <body>
    <h2>Page result for '<?php echo $query; ?>'</h2>
    <div>
      <?php echo $content; ?>
      </script>
    </div>
  </body>
</html>

La consulta en el Listado 6 es ligeramente diferente de los que ya hemos visto hasta el momento porque utiliza una propiedad en lugar de una lista. Las propiedades se utilizan para especificar qué piezas de información recuperar para un conjunto de páginas. Hay numerosas propiedades diferentes disponibles incluyendo metadatos de página, revisiones, enlaces, imágenes, plantillas, categorías y demás.

La consulta del Listado 6 especifica la propiedad revisions y además usa el parámetro rvprop para especificar cuáles propiedades obtener para cada revisión—en este caso, sólo el contenido de la revisión. También hay un parámetro rvlimit que usted puede utilizar para obtener múltiples revisiones previas; sin embargo, por el momento, sólo nos interesa la última revisión (actual) y por eso la consulta no especifica este parámetro.

La Figura 5 muestra el resultado del Listado 6.

Figura 5. Una página Web mostrando contenido en Wikitext
Una página Web mostrando contenido en Wikitext

Como usted puede ver en la Figura 5, el resultado del Listado 6 es el contenido de la página especificada en marcación wiki (Wikitext). Sin embargo, para usar estos datos en una aplicación Web usted necesita convertirlos de marcación wiki a marcación XHTML. Hay numerosos convertidores listos para usar disponibles para esta tarea, pero uno de los mejores es el paquete PEAR Text_Wiki, que puede convertir hacia y desde Wikitext a una variedad de formatos diferentes.

Para instalarlo, simplemente emita el siguiente comando en su línea de comando shell:

shell> pear install Text_Wiki
shell> pear install Text_Wiki_Mediawiki

El instalador PEAR se conecta ahora al servidor del paquete PEAR, descarga los paquetes y los instala en la ubicación apropiada en su sistema. Si prefiere instalarlo manualmente, puede encontrar enlaces para descarga en Recursos .

Después de instalar los paquetes, revise el Listado 6 para usar el Text_Wiki, como se muestra en el Listado 7.

Listado 7. Recuperando contenido de página y convirtiéndolo a XHTML
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// load wikitext converter
require_once 'Text/Wiki.php';

// instantiate a Text_Wiki object from the given class
// and set it to use the Mediawiki adapter
$wiki = & Text_Wiki::factory('Mediawiki');

// set some rendering rules  
$wiki->setRenderConf('xhtml', 'wikilink', 'view_url', 
  'http://en.wikipedia.org/wiki/');
$wiki->setRenderConf('xhtml', 'wikilink', 'pages', false);
  
// define page title
$query = 'The A Team';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->prop('revisions');
  $wikipedia->rvprop('content');
  $wikipedia->format('xml');
  $wikipedia->redirects('1');
  $wikipedia->titles($query);

  // perform request
  // get page content as XML
  $result = $wikipedia->get();
  $content = $result->query->pages->page->revisions->rev;
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head>
  </head>
  <body>
    <h2>Page result for '<?php echo $query; ?>'</h2>
    <div>
      <?php echo $wiki->transform($content, 'Xhtml'); ?>
      </script>
    </div>
  </body>
</html>

El Listado 7 inicializa un objeto Text_Wiki y lo configura para que utilice el adaptador Mediawiki. También especifica algunos parámetros para utilizar para conversión XHTML, incluyendo el prefijo URL predeterminado a usar para enlaces wiki internos. El Listado 7 luego recupera el contenido de página especificado usando la API y lo pasa por el método transform() del objeto Text-wiki para convertirlo en XHTML. La Figura 6 muestra el resultado revisado.

Figura 6. Una página Web mostrando contenido wiki después de conversión XHTML
Una página Web mostrando contenido wiki después de conversión XHTML

Como muestra la Figura 6 el paquete Text_Wiki hace un trabajo razonablemente bueno convirtiendo Wikitext en XHTML estándar. De todas formas, no es perfecto y no cuenta para todos los aspectos de marcación Wikitext (por ejemplo, no puede manejar infoboxes). Si encuentra que no hace todo lo que usted necesita, considere reemplazarlo con el analizador Wikitext de Steve Blinch (vea Recursos ), que ofrece un enfoque alternativo para análisis y conversión de Wikitext.


Efectuando búsquedas de referencia URL

Un aspecto interesante de la API de consulta Wikipedia es que le permite buscar páginas que referencian URLs particulares. Esta capacidad es bastante útil si, digamos, usted desea ver qué tan a menudo aparece su sitio Web en entradas de Wikipedia.

Para efectuar esta consulta, usted necesita ajustarla para que utilice la lista URL externa y para que pase el URL específico que usted está verificando. Considere el Listado 8, que muestra cómo puede usted hacer esto.

Listado 8. Listando páginas que referencia un URL
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define category prefix
$url = 'httpd.apache.org';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->list('exturlusage');
  $wikipedia->euquery($url);
  $wikipedia->eulimit('30');
  $wikipedia->eunamespace('0');
  $wikipedia->format('xml');

  // perform request
  // iterate over XML result set
  $result = $wikipedia->get();
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head></head>
  <body>
    <h2>Search results for pages referencing URL 
      '<?php echo $url; ?>'</h2>
    <ol>
    <?php foreach ($result->query->exturlusage->eu as $r): ?>
      <li><a href="http://www.wikipedia.org/wiki/
      <?php echo $r['title']; ?>"><?php echo $r['title']; ?>
      </a></li>
    <?php endforeach; ?>
    </ol>
  </body>
</html>

Además de los parámetros action y list estándar, el Listado 8 también añade el parámetro euquery , que especifica el URL a verificar (en este caso, el sitio Web de Apache), y el parámetroeunamespace , que especifica el espacio de nombre wiki en el cual buscar. Note que el URL debe especificarse sin el prefijo de protocolo "http://". Los resultados se analizan y procesan de la forma usual, produciendo un resultado que se ve como lo que muestra la Figura 7.

Figura 7. Una página Web mostrando páginas que referencian un URL específico
Una página Web mostrando páginas que referencian un URL específico

El aspecto espacio de nombre del Listado 8 amerita ser explicado brevemente. La API MediaWiki define un número de diferentes espacios de nombre para los diferentes tipos de contenido de un wiki. Cada espacio de nombre se identifica mediante un prefijo anexado al título de la página. Por ejemplo, una página de usuario siempre tiene un prefijo de espacio de nombre "User:", mientras que una página de categoría tiene el prefijo de espacio de nombre "Category:".

Cada espacio de nombre está asociado además con un entero, que se puede usar para filtrar consultas de búsqueda. Usted puede encontrar una lista completa de enteros y prefijos de espacio de nombre en la documentación MediaWiki (vea Recursos donde encontrará un enlace), pero estos son los que usted utilizará con mayor frecuencia:

  • 0: El espacio de nombre predeterminado para páginas de contenido
  • 1: El espacio de nombre para páginas de conversación
  • 2: El espacio de nombre para páginas de usuario
  • 6: El espacio de nombre para archivos
  • 14: El espacio de nombre para páginas de categoría

Del anterior listado debe ser claro que el Listado 8 está restringiendo la consulta sólo a las páginas de contenido del eunamespace . Remover esta limitación retorna un mayor número de resultados, incluyendo páginas de usuario y páginas de conversación que contienen el URL especificado.


Agregando y editando páginas

Todos los listados previos de este artículo se enfocaron en la acción query de la API, ilustrando cómo usted puede utilizarla para recuperar diferentes tipos de datos del repositorio de contenido. Sin embargo, la API también soporta otros métodos diferentes, incluyendo la capacidad de crear nuevas páginas u de editar las existentes. Para lograr estas tareas, llame la acción edit de la API y pásele el título de la página a ser editada o creada, junto con el contenido de la página o sección.

Cada operación edit debe estar acompañada por una señal que asegure la validez de la solicitud de usuario y que la proteja de ataques CSRF. Las señales normalmente consisten de cadenas de caracteres alfanuméricas, terminando con una secuencia +\ especial. Para usuarios anónimos, las señales consisten únicamente en la secuencia +\.

La señal debe ir anexa a la solicitud de edición, como en el Listado 9.

Listado 9. Editando páginas
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('edit');
  $wikipedia->title('Wikipedia:Sandbox');
  $wikipedia->section('new');
  $wikipedia->summary('My Section');
  $wikipedia->text('Some text');
  $wikipedia->token('+\\');
  
  // POST page data 
  $wikipedia->post();
} catch (Exception $e) {
}
?>

El Listado 9 presenta numerosos argumentos de solicitud nuevos.

  • El argumento title especifica la página a ser editada. En este caso, la edición está siendo realiza da en la página especial de recinto de seguridad Wikipedia que se creó específicamente para experimentación y pruebas y que se limpia automáticamente a intervalos regulares.
  • El argumento section especifica el número de sección a ser editado. Usar la palabra clave especial "new" agrega una nueva sección. Omitir este argumento reemplaza toda la página.
  • El argumento summary especifica el título de la sección, cuando se crea una nueva sección.
  • El argumento text contiene el contenido de la sección o página.
  • El argumento token especifica la señal para la operación de edición.

Note también que a diferencia de los listados anteriores, una solicitud de edición se debe transmitir usando POST y no GET. Por esto es que el Listado 9 usa específicamente el método post() del Zend_Rest_Client para transmitir la solicitud. Como la API Wikipedia no retorna una respuesta XML a un POST, Zend_Rest_Client genera una excepción SimpleXML cuando lee la respuesta. Por esto es que el listado está escrito para capturar la excepción pero en realidad no hace nada con ella. Un enfoque alternativo aquí podría ser utilizar Zend_Http_Client y crear manualmente un paquete POST.

Después de que se completa la solicitud, usted puede ver sus cambios en la página objetivo y su dirección IP de sistema (para usuarios anónimos) o su nombre de usuario (para usuarios autenticados) aparecerá en el historial de revisión de la página. Una entrada de historial de revisión incluye una marca de fecha-hora, dirección IP o nombre de usuario, tipo de indicador de edición y tamaño en bytes. La Figura 8 muestra un ejemplo.

Figura 8. El historial de revisión de una página Wikipedia, mostrando las ediciones efectuadas a través de la API
El historial de revisión de una página Wikipedia, mostrando las ediciones efectuadas a través de la API

Conclusión

En las últimas páginas, este artículo le brindó un curso intensivo sobre cómo utilizar la API MediaWiki para recuperar e integrar información de Wikipedia con su aplicación PHP. También examinó brevemente algunos de los aspectos únicos de esta API, como espacios de nombre, propiedades y listas, y demostró cómo usted puede utilizar esta API no sólo para leer datos del wiki sino también para ingresar datos en él.

La información presentada en este artículo es sólo la punta del iceberg. El módulo de consulta tratado en las últimas páginas es extremadamente poderoso y le permite accesar a muchas otras facetas del contenido wiki, incluyendo imágenes, archivos, datos de usuario y datos de revisión de página. Y mientras el módulo de consulta es indudablemente el que usted utilizará con mayor frecuencia, módulos existentes adicionales le permitirán calcular estadísticas como clics de usuario, ediciones de usuario y registros de usuario; ingresar retroalimentación de artículo; regresar información de perfil de usuario; reversar ediciones de página; cargar archivos; manipular listas de supervisión de usuario, y mucho más.

Como ilustran los ejemplos en este artículo, la API MediaWiki ofrece una herramienta flexible para desarrolladores que estén buscando construir nuevas y creativas aplicaciones en torno al contenido de Wikipedia o de cualquier otro wiki basado en MediaWiki. Juegue con ella en algún momento y vea qué sucede.

Recursos

Aprender

Obtener los productos y tecnologías

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=WebSphere
ArticleID=678760
ArticleTitle=Engánchese a información Wikipedia usando PHP y la API MediaWiki
publish-date=07292011