ED Plantillas

De FSF
Revisión del 16:23 21 mar 2026 de Ely (discusión | contribs.) (Instala y sincroniza plantiallas)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)

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";