3 votos

¿Cómo agregar contenido a todas las páginas de un mediawiki?

TL;DR: ¿Cómo puedo añadir un texto (previo aviso) con el contenido (no un encabezado o plantilla global) de cada página?

(muy) largo cuestión de fondo: Estoy planeando migrar un MediaWiki a otra wiki. El contenido de la wiki que se ha migrado de una aún más antigua de la wiki antes (donde los errores sobre el formato se genera), que se cultiva a lo largo del tiempo y ahora está obsoleto en gran parte. Por eso queremos empezar con un espacio en blanco de la wiki y migrar el contenido de forma manual, los descartes y/o actualización anticuado páginas.

Para hacer esto más fácil, quiero añadir un bloque a la parte superior de cada página existente, específicamente una plantilla con un aviso de que esta página no ha sido migrado o se descarta, sin embargo, y una categoría donde todas estas páginas se recogen (por ejemplo, categoría:migration_pending). Cada usuario debería mirar a través de las páginas es el responsable de, copiar el contenido a la nueva wiki y cambiar la plantilla a otra, marcar la página como migrar (categoría:migration_done) o descartado (categoría:migration_discarded). De esta manera debe ser posible obtener una limpieza, hasta la fecha de la wiki sin olvidar nada importante.

41voto

Gerald Schneider Puntos 193

El Replace_Text extensión no tuvo éxito, así que he terminado de escribir mi propia secuencia de comandos que utiliza el MediaWiki API.

Empecé con la loginscript de aquí y escribió este guión:

#!/usr/bin/php
<?php

$settings['wikiroot'] = "https://server/mediawiki";
$settings['user'] =  "username";
$settings['pass'] =  "password";
// $settings['domain'] = 'Windows';
$settings['cookiefile'] = "cookies.tmp";

$prepend = "{{migration_pending}}\n\n";


function httpRequest($url, $post="") {
        global $settings;

        $ch = curl_init();
        //Change the user agent below suitably
        curl_setopt($ch, CURLOPT_USERAGENT, 'MediaWiki Migration Script 0.1');
        curl_setopt($ch, CURLOPT_URL, ($url));
        curl_setopt($ch, CURLOPT_ENCODING, "UTF-8" );
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $settings['cookiefile']);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $settings['cookiefile']);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        if (!empty($post)) curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
        //UNCOMMENT TO DEBUG TO output.tmp
        //curl_setopt($ch, CURLOPT_VERBOSE, true); // Display communication with server
        //$fp = fopen("output.tmp", "w");
        //curl_setopt($ch, CURLOPT_STDERR, $fp); // Display communication with server

        $xml = curl_exec($ch);

        if (!$xml) {
                throw new Exception("Error getting data from server ($url): " . curl_error($ch));
        }

        //var_dump($xml);

        curl_close($ch);

        return $xml;
}


function login ($user, $pass, $token='') {
        global $settings;

        $url = $settings['wikiroot'] . "/api.php?action=login&format=xml";

        $params = "action=login&lgname=$user&lgpassword=$pass";
        if (!empty($settings['domain'])) {
            $params .= "&lgdomain=" . $settings['domain'];
        }
        if (!empty($token)) {
                $params .= "&lgtoken=$token";
        }

        $data = httpRequest($url, $params);

        if (empty($data)) {
                throw new Exception("No data received from server. Check that API is enabled.");
        }

        $xml = simplexml_load_string($data);

        if (!empty($token)) {
                //Check for successful login
                $expr = "/api/login[@result='Success']";
                $result = $xml->xpath($expr);

                if(!count($result)) {
                        throw new Exception("Login failed");
                }
        } else {
                $expr = "/api/login[@token]";
                $result = $xml->xpath($expr);

                if(!count($result)) {
                        throw new Exception("Login token not found in XML");
                }
        }

        return $result[0]->attributes()->token;
}


try {
        global $settings;
        $token = login($settings['user'], $settings['pass']);
        login($settings['user'], $settings['pass'], $token);

        $star = "*";
        $dash1 = "-1";

        // get edit token
        $result = httpRequest($settings['wikiroot'] . "/api.php?action=query&format=json&prop=info|revisions&intoken=edit&titles=Main%20Page");
        $result = json_decode($result);
        $editToken = $result->query->pages->$dash1->edittoken;

        // only from namespace: apnamespace=100
        $result = httpRequest($settings['wikiroot'] . "/api.php?action=query&list=allpages&format=json&aplimit=5000&apnamespace=100");
        $result = json_decode($result);
        $allpages = $result->query->allpages;

        foreach ($allpages as $page) {
            echo "Fetching '{$page->title}' ({$page->pageid})...\n";
            $revisions = httpRequest(sprintf($settings['wikiroot'] . "/api.php?action=query&prop=revisions&rvlimit=1&format=json&rvprop=content&titles=%s", urlencode($page->title)));
            $revisions = json_decode($revisions);
            if (isset($revisions->error)) {
                echo "ERROR: " . $revisions->error->info . "\n";
                continue;
            }
            $content = $revisions->query->pages->{$page->pageid}->revisions[0]->$star;
            if (preg_match("/\{\{migration_/", $content)) {
                echo "Already marked ... skipping.\n";
                continue;
            }
            echo "Updating...";
            // add text to content and edit page
            $content = $prepend . $content;
            $post = sprintf("title=%s&text=%s&token=%s", urlencode($page->title), urlencode($content), urlencode($editToken));
            $result = httpRequest($settings['wikiroot'] . "/api.php?action=edit&format=json", $post);
            echo "done\n";
        }
        echo ("Finished (".sizeof($allpages)." pages).\n");
} catch (Exception $e) {
        die("FAILED: " . $e->getMessage());
}

?>

Lo que hace el script básicamente hace es:

  • Inicio de sesión con una cuenta existente
  • obtener un token que le permite hacer las operaciones de edición
  • recuperar una lista de todas las páginas dentro de un determinado espacio de nombres
  • para cada página:
    • obtener el contenido de la última revisión
    • añadir un texto predefinido para el contenido
    • guardar la página con el nuevo contenido

Algunas notas adicionales:

  • Asegúrese de que el usuario desee utilizar existe y que tiene acceso de escritura a todos los espacios de nombres necesarios.
  • Agregar el usuario a la "Bot" de grupo. Esto elimina algunas restricciones, por ejemplo, un robot que se puede hacer operaciones masivas en los grupos de 5000 en lugar de 500, como un usuario normal. No se si es necesario para este script, pero no puede hacer daño.
  • Cuando una extensión de autenticación como LdapAuthentication es en el uso de la domain parámetro tiene que ser establecido. Y que tiene que estar configurado en el nombre del LDAP de la fuente de cómo está configurado en LocalSettings.php, no el nombre real del dominio.
  • Desactivar las notificaciones de correo electrónico antes de ejecutar la secuencia de comandos. De lo contrario, todo el que mira las páginas en el wiki recibir las notificaciones de cada página ha cambiado él mira. Para mí esto fue $wgEnableEmail = false; y $wgEnotifWatchlist = false; en LocalSettings.php.
  • Corrí el script desde la línea de comandos, no es rápido y tarda un par de minutos para más de 1000 páginas. Definitivamente ejecutar en un tiempo de espera si lo corrió sobre el servidor web.

Por último, pero no menos importante, la plantilla migration_pending he añadido a MediaWiki:

{|class=warningbox
 | [[Image:Emblem-important.png]]
 | This page hasn't been audited yet, the information on it could be outdated. If you are responsible for this page, please check it's content. If it is still current, add it to the new wiki and change this template to <nowiki>{{Migration_done}}</nowiki>. If the information on this page is not needed anymore change the template to <nowiki>{{Migration_discarded}}</nowiki>
 |}

[[Category:MigrationPending]]

Este utiliza una clase CSS para las tablas que había estado utilizando antes y añade la página a una categoría específica. He añadido plantillas similares como migration_done y migration_discarded con las categorías correspondientes.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: