Diferencia entre revisiones de «ED Plantillas»

De FSF
Sin resumen de edición
 
Línea 15: Línea 15:
$edApi  = "http://localhost/00_ED/api.php";
$edApi  = "http://localhost/00_ED/api.php";


$user = "TU_USUARIO_ED";
$user = "Ed1@Zero";
$pass = "TU_PASSWORD_ED";
$pass = "pa0n691978pqpmd3dcapqsmuj9044v8o";
 
$cookie = __DIR__ . "/cookie.txt";


// =========================
// =========================
// REQUEST BASE (con cookies)
// REQUEST
// =========================
// =========================


Línea 41: Línea 43:


// =========================
// =========================
// LOGIN
// LOGIN CORRECTO
// =========================
// =========================


function login($api, $user, $pass, $cookie) {
function login($api, $user, $pass, $cookie) {


     $token = request($api, [
    echo "Obteniendo login token...\n";
 
     $tokenRes = request($api, [
         "action" => "query",
         "action" => "query",
         "meta" => "tokens",
         "meta" => "tokens",
Línea 53: Línea 57:
     ], $cookie);
     ], $cookie);


     $loginToken = $token["query"]["tokens"]["logintoken"];
     $loginToken = $tokenRes["query"]["tokens"]["logintoken"] ?? null;
 
    if (!$loginToken) {
        die("ERROR TOKEN\n");
    }


     request($api, [
     echo "Logeando...\n";
 
    $res = request($api, [
         "action" => "login",
         "action" => "login",
         "lgname" => $user,
         "lgname" => $user,
Línea 62: Línea 72:
         "format" => "json"
         "format" => "json"
     ], $cookie);
     ], $cookie);
    if (!isset($res["login"]["result"]) || $res["login"]["result"] !== "Success") {
        die("ERROR LOGIN: " . json_encode($res) . "\n");
    }
    echo "Login OK\n";
}
}


// =========================
// =========================
// TOKEN CSRF
// CSRF
// =========================
// =========================


Línea 75: Línea 91:
     ], $cookie);
     ], $cookie);


     return $res["query"]["tokens"]["csrftoken"];
     return $res["query"]["tokens"]["csrftoken"] ?? null;
}
}


// =========================
// =========================
// TODAS LAS PLANTILLAS FSF
// PLANTILLAS
// =========================
// =========================


Línea 97: Línea 113:
         if ($cont) $params["apcontinue"] = $cont;
         if ($cont) $params["apcontinue"] = $cont;


         $res = file_get_contents($api . "?" . http_build_query($params));
         $raw = file_get_contents($api . "?" . http_build_query($params));
         $res = json_decode($res, true);
         $res = json_decode($raw, true);
 
        if (!isset($res["query"]["allpages"])) continue;


         foreach ($res["query"]["allpages"] as $p) {
         foreach ($res["query"]["allpages"] as $p) {
Línea 112: Línea 130:


// =========================
// =========================
// CONTENIDO (FSF o ED)
// CONTENIDO
// =========================
// =========================


function getContent($api, $title) {
function getContent($api, $title) {
     $res = file_get_contents($api . "?" . http_build_query([
 
     $raw = file_get_contents($api . "?" . http_build_query([
         "action" => "query",
         "action" => "query",
         "prop" => "revisions",
         "prop" => "revisions",
Línea 124: Línea 143:
     ]));
     ]));


     $res = json_decode($res, true);
     $res = json_decode($raw, true);
 
    if (!isset($res["query"]["pages"])) return null;


     foreach ($res["query"]["pages"] as $p) {
     foreach ($res["query"]["pages"] as $p) {
Línea 136: Línea 157:


// =========================
// =========================
// GUARDAR EN ED
// GUARDAR
// =========================
// =========================


function save($api, $title, $content, $token, $cookie) {
function save($api, $title, $content, $token, $cookie) {


     request($api, [
     $res = request($api, [
         "action" => "edit",
         "action" => "edit",
         "title" => $title,
         "title" => $title,
Línea 148: Línea 169:
         "format" => "json"
         "format" => "json"
     ], $cookie);
     ], $cookie);
    if (isset($res["error"])) {
        echo "ERROR SAVE\n";
        return false;
    }
    return true;
}
}


Línea 154: Línea 182:
// =========================
// =========================


$cookie = __DIR__ . "/cookie.txt";
echo "Login...\n";
login($edApi, $user, $pass, $cookie);
login($edApi, $user, $pass, $cookie);


$csrf = getCsrf($edApi, $cookie);
$csrf = getCsrf($edApi, $cookie);


echo "Obteniendo plantillas...\n";
if (!$csrf) die("ERROR CSRF\n");
 
echo "CSRF OK\n";
 
$templates = getTemplates($fsfApi);
$templates = getTemplates($fsfApi);


Línea 170: Línea 198:
     echo "Sync $tpl ... ";
     echo "Sync $tpl ... ";


     $fsfContent = getContent($fsfApi, $tpl);
     $fsf = getContent($fsfApi, $tpl);
     $edContent = getContent($edApi, $tpl);
     $ed = getContent($edApi, $tpl);


     if (!$fsfContent) {
     if ($fsf === null) {
         echo "ERROR (FSF vacío)\n";
         echo "ERROR API\n";
         continue;
         continue;
     }
     }


     if ($fsfContent !== $edContent) {
     if ($fsf !== $ed) {
         save($edApi, $tpl, $fsfContent, $csrf, $cookie);
         save($edApi, $tpl, $fsf, $csrf, $cookie);
         echo "ACTUALIZADO\n";
         echo "GUARDADO\n";
     } else {
     } else {
         echo "SIN CAMBIOS\n";
         echo "SIN CAMBIOS\n";
Línea 186: Línea 214:
}
}


echo "\n✔ SINCRONIZACIÓN COMPLETA\n";
echo "\n✔ FIN\n";
</pre>
</pre>
</small></small>
</small></small>

Revisión actual - 16:23 21 mar 2026

Instala y sincroniza plantiallas

Ejecuta así

cd /d C:\xampp\htdocs\scripts && C:\xampp\php\php.exe sync_templates.php

<?php

if (php_sapi_name() !== 'cli') {
    die("Solo CLI\n");
}

$fsfApi = "http://localhost/00_FSF/api.php";
$edApi  = "http://localhost/00_ED/api.php";

$user = "Ed1@Zero";
$pass = "pa0n691978pqpmd3dcapqsmuj9044v8o";

$cookie = __DIR__ . "/cookie.txt";

// =========================
// REQUEST
// =========================

function request($url, $params, $cookie = null) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if ($cookie) {
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
    }

    $res = curl_exec($ch);
    curl_close($ch);

    return json_decode($res, true);
}

// =========================
// LOGIN CORRECTO
// =========================

function login($api, $user, $pass, $cookie) {

    echo "Obteniendo login token...\n";

    $tokenRes = request($api, [
        "action" => "query",
        "meta" => "tokens",
        "type" => "login",
        "format" => "json"
    ], $cookie);

    $loginToken = $tokenRes["query"]["tokens"]["logintoken"] ?? null;

    if (!$loginToken) {
        die("ERROR TOKEN\n");
    }

    echo "Logeando...\n";

    $res = request($api, [
        "action" => "login",
        "lgname" => $user,
        "lgpassword" => $pass,
        "lgtoken" => $loginToken,
        "format" => "json"
    ], $cookie);

    if (!isset($res["login"]["result"]) || $res["login"]["result"] !== "Success") {
        die("ERROR LOGIN: " . json_encode($res) . "\n");
    }

    echo "Login OK\n";
}

// =========================
// CSRF
// =========================

function getCsrf($api, $cookie) {
    $res = request($api, [
        "action" => "query",
        "meta" => "tokens",
        "format" => "json"
    ], $cookie);

    return $res["query"]["tokens"]["csrftoken"] ?? null;
}

// =========================
// PLANTILLAS
// =========================

function getTemplates($api) {
    $list = [];
    $cont = null;

    do {
        $params = [
            "action" => "query",
            "list" => "allpages",
            "apnamespace" => 10,
            "aplimit" => "max",
            "format" => "json"
        ];

        if ($cont) $params["apcontinue"] = $cont;

        $raw = file_get_contents($api . "?" . http_build_query($params));
        $res = json_decode($raw, true);

        if (!isset($res["query"]["allpages"])) continue;

        foreach ($res["query"]["allpages"] as $p) {
            $list[] = $p["title"];
        }

        $cont = $res["continue"]["apcontinue"] ?? null;

    } while ($cont);

    return $list;
}

// =========================
// CONTENIDO
// =========================

function getContent($api, $title) {

    $raw = file_get_contents($api . "?" . http_build_query([
        "action" => "query",
        "prop" => "revisions",
        "rvprop" => "content",
        "format" => "json",
        "titles" => $title
    ]));

    $res = json_decode($raw, true);

    if (!isset($res["query"]["pages"])) return null;

    foreach ($res["query"]["pages"] as $p) {
        if (isset($p["revisions"][0]["*"])) {
            return $p["revisions"][0]["*"];
        }
    }

    return null;
}

// =========================
// GUARDAR
// =========================

function save($api, $title, $content, $token, $cookie) {

    $res = request($api, [
        "action" => "edit",
        "title" => $title,
        "text" => $content,
        "token" => $token,
        "format" => "json"
    ], $cookie);

    if (isset($res["error"])) {
        echo "ERROR SAVE\n";
        return false;
    }

    return true;
}

// =========================
// EJECUCIÓN
// =========================

login($edApi, $user, $pass, $cookie);

$csrf = getCsrf($edApi, $cookie);

if (!$csrf) die("ERROR CSRF\n");

echo "CSRF OK\n";

$templates = getTemplates($fsfApi);

echo "Total: " . count($templates) . "\n\n";

foreach ($templates as $tpl) {

    echo "Sync $tpl ... ";

    $fsf = getContent($fsfApi, $tpl);
    $ed  = getContent($edApi, $tpl);

    if ($fsf === null) {
        echo "ERROR API\n";
        continue;
    }

    if ($fsf !== $ed) {
        save($edApi, $tpl, $fsf, $csrf, $cookie);
        echo "GUARDADO\n";
    } else {
        echo "SIN CAMBIOS\n";
    }
}

echo "\n✔ FIN\n";