API:Stashedit

From MediaWiki.org
Jump to navigation Jump to search
This page is a translated version of the page API:Stashedit and the translation is 100% complete.
Other languages:
Deutsch • ‎English • ‎Türkçe • ‎dansk • ‎español • ‎français • ‎polski • ‎русский • ‎ไทย • ‎中文 • ‎日本語

Solicitud POST para preparar una edición en caché compartida.

Versión de MediaWiki: 1.23

API Documentación


action=stashedit

(main | stashedit)
  • This module is internal or unstable. Its operation may change without notice.
  • This module requires read rights.
  • This module requires write rights.
  • This module only accepts POST requests.
  • Source: MediaWiki
  • License: GPL-2.0-or-later

Prepare an edit in shared cache.

This is intended to be used via AJAX from the edit form to improve the performance of the page save.

Parameters:
title

Title of the page being edited.

This parameter is required.
section

Section number. 0 for the top section, new for a new section.

sectiontitle

The title for a new section.

text

Page content.

stashedtexthash

Page content hash from a prior stash to use instead.

summary

Change summary.

Default: (empty)
contentmodel

Content model of the new content.

This parameter is required.
One of the following values: GadgetDefinition, JsonSchema, MassMessageListContent, NewsletterContent, Scribunto, SecurePoll, css, flow-board, javascript, json, sanitized-css, text, wikitext
contentformat

Content serialization format used for the input text.

This parameter is required.
One of the following values: application/json, text/css, text/javascript, text/plain, text/x-wiki
baserevid

Revision ID of the base revision.

This parameter is required.
Type: integer
token

A "csrf" token retrieved from action=query&meta=tokens

This parameter is required.

Ejemplo

Hacer cualquier solicitud POST es un proceso de varios pasos:

  1. Inicia sesión, a través de uno de los métodos descritos en API:Login .
  2. CONSIGUE un edit/CSRF token como se muestra aquí API:Tokens
  3. Envía una solicitud POST, con el token CSRF, para preparar una edición en caché compartida.

Los códigos de muestra, abajo, cubren estos pasos.

Solicitud POST

Preparar una edición en caché compartida.

Respuesta

{
    "stashedit": {
        "status": "stashed",
        "texthash": "dc724af18fbdd4e59189f5fe768a5f8311527050"
    }
}

Código de muestra

Python

#!/usr/bin/python3

"""
    stashedit.py

    MediaWiki API Demos
    Demo of `stashedit` module: prepare an edit in shared cache

    MIT license
"""
import requests

S = requests.Session()

URL = "https://test.wikipedia.org/w/api.php"

# Step 1: Retrieve a login token
PARAMS_1 = {
    "action": "query",
    "meta": "tokens",
    "type": "login",
    "format": "json"
}

R = S.get(url=URL, params=PARAMS_1)
DATA = R.json()

LOGIN_TOKEN = DATA['query']['tokens']['logintoken']

# Step 2: Send a POST request to log in. For this login
# method, obtain credentials by first visiting
# https://www.test.wikipedia.org/wiki/Manual:Bot_passwords
# See https://www.mediawiki.org/wiki/API:Login for more
# information on log in methods.
PARAMS_2 = {
    "action": "login",
    "lgname": "user_name",
    "lgpassword": "password",
    "format": "json",
    "lgtoken": LOGIN_TOKEN
}

R = S.post(URL, data=PARAMS_2)
DATA = R.json()

# Step 3: While logged in, retrieve a CSRF token
PARAMS_3 = {
    "action": "query",
    "meta": "tokens",
    "format": "json"
}

R = S.get(url=URL, params=PARAMS_3)
DATA = R.json()

CSRF_TOKEN = DATA["query"]["tokens"]["csrftoken"]

# Step 4: Send a POST request to prepare an edit in shared cache

PARAMS_4 = {
    "token":CSRF_TOKEN,
    "action":"stashedit",
    "title":"Sandbox",
    "section":"new",
    "sectiontitle":"testing stashedit",
    "text":"testing stashedit API",
    "contentmodel":"wikitext",
    "contentformat":"text/x-wiki",
    "baserevid":"",
    "format":"json"
    }

R = S.post(URL, data=PARAMS_4)
DATA = R.text

print(DATA)

PHP

<?php

/*
    stashedit.php

    MediaWiki API Demos
    Demo of `stashedit` module: prepare an edit in shared cache

    MIT license
*/
$endPoint = "https://test.wikipedia.org/w/api.php";

$login_Token = getLoginToken(); // Step 1
loginRequest( $login_Token ); // Step 2
$csrf_Token = getCSRFToken(); // Step 3
stashEdit( $csrf_Token ); // Step 4

// Step 1: GET request to fetch login token
function getLoginToken() {
	global $endPoint;

	$params1 = [
		"action" => "query",
		"meta" => "tokens",
		"type" => "login",
		"format" => "json"
	];

	$url = $endPoint . "?" . http_build_query( $params1 );

	$ch = curl_init( $url );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
	curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
	curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );

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

	$result = json_decode( $output, true );
	return $result["query"]["tokens"]["logintoken"];
}

// Step 2: POST request to log in. Use of main account for login is not
// supported. Obtain credentials via Special:BotPasswords
// (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
function loginRequest( $logintoken ) {
	global $endPoint;

	$params2 = [
		"action" => "login",
		"lgname" => "bot_user_name",
		"lgpassword" => "bot_password",
		"lgtoken" => $logintoken,
		"format" => "json"
	];

	$ch = curl_init();

	curl_setopt( $ch, CURLOPT_URL, $endPoint );
	curl_setopt( $ch, CURLOPT_POST, true );
	curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params2 ) );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
	curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
	curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );

	$output = curl_exec( $ch );
	curl_close( $ch );
}

// Step 3: GET request to fetch CSRF token
function getCSRFToken() {
	global $endPoint;

	$params3 = [
		"action" => "query",
		"meta" => "tokens",
		"format" => "json"
	];

	$url = $endPoint . "?" . http_build_query( $params3 );

	$ch = curl_init( $url );

	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
	curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
	curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );

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

	$result = json_decode( $output, true );
	return $result["query"]["tokens"]["csrftoken"];
}

# Step 4: Send a POST request  to prepare an edit in shared cache
function stashEdit( $csrftoken ) {
	global $endPoint;
	
	$params4 = [
		"action" => "stashedit",
		"title" => "Sandbox",
		"section" => "new",
		"sectiontitle" => "testing stashedit",
		"text" => "testing stashedit API",
		"contentmodel" => "wikitext",
		"contentformat" => "text/x-wiki",
		"baserevid" => "",
		"format" => "json",
		"token" => $csrftoken
	];
  
	$ch = curl_init();

	curl_setopt( $ch, CURLOPT_URL, $endPoint );
	curl_setopt( $ch, CURLOPT_POST, true );
	curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params4 ) );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
	curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
	curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );

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

	echo ($response);
}

JavaScript

/*
    stashedit.js

    MediaWiki API Demos
    Demo of `stashedit` module: prepare an edit in shared cache

    MIT license
*/
var request = require("request").defaults({jar: true}),
url = "https://test.wikipedia.org/w/api.php";

// Step 1: GET request to fetch login token
function getLoginToken() {
    var params_0 = {
        action: "query",
        meta: "tokens",
        type: "login",
        format: "json"
    };
    request.get({ url: url, qs: params_0 }, function (error, res, body) {
        if (error) {
            return;
        }
        var data = JSON.parse(body);
        loginRequest(data.query.tokens.logintoken);
    });
}

// Step 2: POST request to log in. 
// Use of main account for login is not
// supported. Obtain credentials via Special:BotPasswords
// (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
function loginRequest(login_token) {
    var params_1 = {
        action: "login",
        lgname: "bot_username",
        lgpassword: "bot_password",
        lgtoken: login_token,
        format: "json"
    };
    
    request.post({ url: url, form: params_1 }, function (error, res, body) {
        if (error) {
            return;
        }
        getCsrfToken();
    });
}

// Step 3: GET request to fetch CSRF token
function getCsrfToken() {
    var params_2 = {
        action: "query",
        meta: "tokens",
        format: "json"
    };
    request.get({ url: url, qs: params_2 }, function(error, res, body) {
        if (error) {
            return;
        }
        var data = JSON.parse(body);
        stashEdit(data.query.tokens.csrftoken);
    });
}

// Step 4: Send a POST request  to prepare an edit in shared cache
function stashEdit(csrf_token) {
    var params_3 = {
        action: "stashedit",
        title: "Sandbox",
        section: "new",
        sectiontitle: "testing stashedit",
        text: "testing stashedit API",
        contentmodel: "wikitext",
        contentformat: "text/x-wiki",
        baserevid: "",
        format: "json",
        token: csrf_token
    };
    request.post({ url: url, form: params_3 }, function(error, res, body) {
        if (error) {
            return;
        }
        console.log(body);
    });
}

// Start From Step 1
getLoginToken();

Errores posibles

Código Info
badtoken Invalid CSRF token
internal_api_error_MWException Exception caught: Incompatible content model for section

Notas adicionales

  • Esto está destinado a ser utilizado a través de AJAX desde el formulario de edición para mejorar el rendimiento de la página guardada.

Véase también