API:Edita

From MediaWiki.org
Jump to navigation Jump to search
This page is a translated version of the page API:Edit and the translation is 100% complete.
Other languages:
Deutsch • ‎English • ‎Tiếng Việt • ‎dansk • ‎español • ‎français • ‎polski • ‎português do Brasil • ‎русский • ‎тоҷикӣ • ‎中文 • ‎日本語
Versión de MediaWiki: 1.13

Solicitud POST para editar una página.

Documentación de API


action=edit

(main | edit)
  • This module requires read rights.
  • This module requires write rights.
  • This module only accepts POST requests.
  • Source: MediaWiki
  • License: GPL-2.0-or-later

Create and edit pages.

Parameters:
title

Title of the page to edit. Cannot be used together with pageid.

pageid

Page ID of the page to edit. Cannot be used together with title.

Type: integer
section

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

sectiontitle

The title for a new section.

text

Page content.

summary

Edit summary. Also section title when section=new and sectiontitle is not set.

tags

Change tags to apply to the revision.

Values (separate with | or alternative): possible vandalism, repeating characters
minor

Mark this edit as a minor edit.

Type: boolean (details)
notminor

Do not mark this edit as a minor edit even if the "Mark all edits minor by default" user preference is set.

Type: boolean (details)
bot

Mark this edit as a bot edit.

Type: boolean (details)
baserevid

ID of the base revision, used to detect edit conflicts. May be obtained through action=query&prop=revisions. Self-conflicts cause the edit to fail unless basetimestamp is set.

Type: integer
basetimestamp

Timestamp of the base revision, used to detect edit conflicts. May be obtained through action=query&prop=revisions&rvprop=timestamp. Self-conflicts are ignored.

Type: timestamp (allowed formats)
starttimestamp

Timestamp when the editing process began, used to detect edit conflicts. An appropriate value may be obtained using curtimestamp when beginning the edit process (e.g. when loading the page content to edit).

Type: timestamp (allowed formats)
recreate

Override any errors about the page having been deleted in the meantime.

Type: boolean (details)
createonly

Don't edit the page if it exists already.

Type: boolean (details)
nocreate

Throw an error if the page doesn't exist.

Type: boolean (details)
watch
Deprecated.

Add the page to the current user's watchlist.

Type: boolean (details)
unwatch
Deprecated.

Remove the page from the current user's watchlist.

Type: boolean (details)
watchlist

Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.

One of the following values: nochange, preferences, unwatch, watch
Default: preferences
md5

The MD5 hash of the text parameter, or the prependtext and appendtext parameters concatenated. If set, the edit won't be done unless the hash is correct.

prependtext

Add this text to the beginning of the page. Overrides text.

appendtext

Add this text to the end of the page. Overrides text.

Use section=new to append a new section, rather than this parameter.

undo

Undo this revision. Overrides text, prependtext and appendtext.

Type: integer
The value must be no less than 0.
undoafter

Undo all revisions from undo to this one. If not set, just undo one revision.

Type: integer
The value must be no less than 0.
redirect

Automatically resolve redirects.

Type: boolean (details)
contentformat

Content serialization format used for the input text.

One of the following values: application/json, text/css, text/javascript, text/plain, text/x-wiki
contentmodel

Content model of the new content.

One of the following values: GadgetDefinition, JsonSchema, MassMessageListContent, NewsletterContent, Scribunto, SecurePoll, css, flow-board, javascript, json, sanitized-css, text, wikitext
token

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

The token should always be sent as the last parameter, or at least after the text parameter.

This parameter is required.
captchaword

Answer to the CAPTCHA

captchaid

CAPTCHA ID from previous request

Ejemplo

El código de muestra en este ejemplo es en Pitón. Mira API:Edit/Editing with Ajax para ejemplos y respuestas en Ajax .

Solicitud POST

Hacer ediciones y, de hecho, 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 . Tenga en cuenta que si bien esto es necesario para atribuir correctamente la edición a su autor, muchas wikis permiten a los usuarios editar sin registrarse o iniciar sesión en una cuenta.
2. GET un CSRF token .
3. Envía una solicitud POST, con el token CSRF, para tomar medidas en una página.

La sección de Respuesta a continuación es para la solicitud POST final, para tomar medidas en la página. Consulta las páginas en API:Login y API:Tokens para ver las respuestas intermedias de JSON a los pasos anteriores.

También tenga en cuenta que los tokens en las consultas en esta página son valores de muestra. Los tokens reales son únicos para cada inicio de sesión y solicitud entre sitios. Se incluyen solo para demostrar cómo formatear correctamente las consultas.

Respuesta

{
    "edit": {
        "result": "Success",
        "pageid": 94542,
        "title": "Wikipedia:Sandbox",
        "contentmodel": "wikitext",
        "oldrevid": 371705,
        "newrevid": 371707,
        "newtimestamp": "2018-12-18T16:59:42Z"
    }
}

Código de muestra

Python

#!/usr/bin/python3

"""
    edit.py

    MediaWiki API Demos
    Demo of `Edit` module: POST request to edit a page
    MIT license
"""

import requests

S = requests.Session()

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

# Step 1: GET request to fetch login token
PARAMS_0 = {
    "action": "query",
    "meta": "tokens",
    "type": "login",
    "format": "json"
}

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

LOGIN_TOKEN = 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
PARAMS_1 = {
    "action": "login",
    "lgname": "bot_user_name",
    "lgpassword": "bot_password",
    "lgtoken": LOGIN_TOKEN,
    "format": "json"
}

R = S.post(URL, data=PARAMS_1)

# Step 3: GET request to fetch CSRF token
PARAMS_2 = {
    "action": "query",
    "meta": "tokens",
    "format": "json"
}

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

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

# Step 4: POST request to edit a page
PARAMS_3 = {
    "action": "edit",
    "title": "Project:Sandbox",
    "token": CSRF_TOKEN,
    "format": "json",
    "appendtext": "Hello"
}

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

print(DATA)

PHP

<?php

/*
    edit.php

    MediaWiki API Demos
    Demo of `Edit` module: POST request to edit a page
    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
editRequest($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: POST request to edit a page
function editRequest( $csrftoken ) {
	global $endPoint;

	$params4 = [
		"action" => "edit",
		"title" => "Project:Sandbox",
		"appendtext" => "Hello",
		"token" => $csrftoken,
		"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( $params4 ) );
	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 );

	echo ( $output );
}

JavaScript

/*  
    edit.js
 
    MediaWiki API Demos
    Demo of `Edit` module: POST request to edit a page

    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);
        editRequest(data.query.tokens.csrftoken);
    });
}

// Step 4: POST request to edit a page
function editRequest(csrf_token) {
    var params_3 = {
        action: "edit",
        title: "Project:Sandbox",
        appendtext: "test edit",
        token: csrf_token,
        format: "json"
    };

    request.post({ url: url, form: params_3 }, function (error, res, body) {
        if (error) {
            return;
        }
        console.log(body);
    });
}

// Start From Step 1
getLoginToken();

MediaWiki JS

/*
	edit.js

	MediaWiki API Demos
	Demo of `Edit` module: POST request to edit a page

	MIT License
*/

var params = {
		action: 'edit',
		title: 'Project:Sandbox',
		appendtext: 'Hello',
		format: 'json'
	},
	api = new mw.Api();

api.postWithToken( 'csrf', params ).done( function ( data ) {
	console.log( data );
} );

Casos de usuario

Conflictos de edición

La muestra de Python es una implementación básica, de una solicitud de edición realizada por un usuario registrado. En escenarios del mundo real, se debe tener cuidado para evitar conflictos de edición. Esto ocurre cuando dos o más usuarios intentan editar la misma página al mismo tiempo.

Los conflictos se pueden prevenir recuperando la última marca de tiempo revision cuando solicitemos un token CSRF. Agregar prop=info|revisions a la solicitud de token CSRF en el Paso 3, nos permite acceder a la marca de tiempo para la última revisión. Esta marca de tiempo se usará como basetimestamp cuando hagamos nuestra solicitud de edición.

También necesitamos la hora exacta cuando comenzamos nuestra edición. Esto se puede recuperar agregando curtimestamp a la solicitud CSRF también. Este valor servirá como nuestro starttimestamp.

Finalmente, en la solicitud de edición real, establece los parámetros basetimestamp y starttimestamp, así:

Grandes ediciones

Las solicitudes POST que contengan grandes cantidades de contenido de texto (más de 8000 caracteres) deben enviarse con Content-Type: multipart/form-data indicado en el header. Porque multipart/form-data no necesita agregar caracteres de escape HTML (es decir, percent-encoding) para espacios y puntuación, la cantidad de datos pasados ​​será mucho más pequeña que el equivalente codificado en porcentaje.

Sin embargo, todavía hay una sobrecarga agregada por multipart/form-data -- aproximadamente, 160 bytes por parámetro. Para mensajes cortos que no requieren agregar muchos caracteres de escape, esta cantidad de sobrecarga puede ser ineficiente, y se prefiere la codificación porcentual [1].

Ten en cuenta que en nuestro código de muestra Python, la solicitud está codificada en porcentaje por defecto.

Consulta HTTP/Headers/Content-Type the MDN web docs para mantener una discusión más técnica sobre el tipo de contenido y las solicitudes POST. Consulta quickstart/#more-complicated-post-requests the Python Requests documentation para saber cómo pasar multipart/form-data usando una sintaxis similar a nuestro código de muestra de Python.

CAPTCHAs

Si el wiki al que te diriges utiliza CAPTCHAs , tu solicitud puede devolver un error que contenga un número de identificación y una prueba simple, como una pregunta, un problema matemático o una URL a una imagen. Para completar tu edición, debes completar la prueba, luego vuelve a intentar tu solicitud con la identificación y las respuestas correctas agregadas a la cadena de consulta original, de la siguiente manera: captchaid=sampleId&captchaword=answer

Otros sistemas y extensiones CAPTCHA pueden usar diferentes parámetros para un uso similar. En general, usa los nombres de campo para la identificación y las preguntas de prueba como parámetros en tu segunda solicitud.

Errores posibles

Código Información
notitle Se debe establecer el parámetro title.
notext Debe ser establecido uno de los parámetros text, appendtext, prependtext y undo
notoken Se debe establecer el parámetro token.
invalidsection El parámetro section debe ser un identificador de sección válido, o bien new.
protectedtitle Este título ha sido protegido desde creación
cantcreate No tienes permiso para crear páginas nuevas
cantcreate-anon Los usuarios anónimos no pueden crear páginas nuevas
articleexists El artículo que intentaste crear ya estaba creado.
noimageredirect-anon Los usuarios anónimos no pueden crear redirecciones de imágenes.
noimageredirect No tienes permiso para crear redirecciones de imágenes.
spamdetected Tu edición fue rechazada por contener un fragmento de spam: Wikitext.
filtered La función de devolución de llamada del filtro rechazó tu edición
contenttoobig El contenido que has suministrado supera el tamaño máximo de archivo de bytes kilobytes.
Where bytes is the value of $wgMaxArticleSize.
noedit-anon Los usuarios anónimos no pueden editar páginas.
noedit No tienes permiso para editar páginas.
pagedeleted En algún momento desde que se obtuvo el cronomarcador, se ha borrado la página.
emptypage Crear páginas vacías no está permitido.
emptynewsection Crear secciones vacías no es posible.
editconflict Editar conflicto detectado
revwrongpage rrevid no es una revisión de pagename.
Lanzado si se da un revid inválido por undo o undoafter
undofailure Error al deshacer debido a ediciones intermedias conflictivas
missingtitle El título especificado no existe.
(Ver arriba nocreate parameter)
mustbeposted El módulo edit requiere una petición POST.
readapidenied Necesitas permiso de lectura para utilizar este módulo.
writeapidenied No tienes permiso para editar este wiki a través de la API.
noapiwrite La edición de este wiki a través de la API está deshabilitada. Asegúrate de que la declaración $wgEnableWriteAPI=true; está incluida en el archivo LocalSettings.php del wiki.
badtoken La ficha CSRF no es válida.
missingparam Se debe establecer el parámetro title, pageid.
invalidparammix Los parámetros title, pageid no se pueden utilizar juntos.
invalidtitle Título incorrecto "title".
invalid-content-data Datos de contenido incorrectos
occurs when trying to edit a JSON page with non-conforming data, or while trying to edit a MassMessageListContent page
nosuchpageid No hay ninguna página con identificador pageid.
pagecannotexist En este espacio de nombres no se permiten páginas reales.
nosuchrevid No hay ninguna revisión con identificador undo.
nosuchrevid No hay ninguna revisión con identificador undoafter.
undofailure Error al deshacer debido a ediciones intermedias conflictivas
badmd5 El hash MD5 suministrado es incorrecto.
hookaborted Una extensión ha impedido la modificación que intentaste realizar.
parseerror Error al analizar el texto dado.
summaryrequired Resumen requerido
blocked Se te ha bloqueado de editar.
ratelimited Has excedido tu límite de frecuencia. Aguarda unos minutos y vuelve a intentarlo.
unknownerror Error desconocido: «retval»
nosuchsection No hay ninguna sección $1.
sectionsnotsupported Las secciones no son compatibles con el modelo de contenido $1.
editnotsupported La edición de este tipo de página no es compatible con la API de edición basada en texto.
appendnotsupported No se puede añadir a las páginas que utilizan el modelo de contenido $1.
redirect-appendonly You have attempted to edit using the redirect-following mode, which must be used in conjunction with section=new, prependtext, or appendtext.
edit-invalidredirect Cannot edit $1 while following redirects, as target $2 is not valid.
badformat El formato solicitado $1 no es compatible con el modelo de contenido $2 utilizado por $3.
customcssprotected No tienes permiso para editar esta página CSS porque contiene configuraciones personales de otro usuario.
customjsprotected No tienes permiso para editar esta página JavaScript porque contiene configuraciones personales de otro usuario.
taggingnotallowed No tiene permiso para establecer etiquetas de cambio
tpt-target-page No se puede actualizar esta página manualmente.

Esta página es una traducción de la página $1 y puedes actualizar la traducción mediante [$2 la herramienta correspondiente].
Cuando se usa Extensión:Translate , no se permite editar una subpágina traducida

Historial de parámetros

  • v1.25: Introducido tags
  • v1.21: Introducido contentformat, contentmodel
  • v1.20: Introducido pageid
  • v1.19: Introducido sectiontitle
  • v1.18: Obsoleto captchaid, captchaword
  • v1.17: Introducido redirect
  • v1.16: Deprecated watch, unwatch
  • v1.16: Introducido watchlist
  • v1.15: Introducido undo, undoafter
  • v1.14: Introducido starttimestamp

Notas adicionales

  • La API no requiere estrictamente el inicio de sesión, pero es necesario para atribuir correctamente la edición a su autor. Una edición exitosa de un usuario que no ha iniciado sesión se atribuirá a su dirección IP.
  • Los bots que no están registrados pueden enfrentar restricciones en la edición y otras peticiones de escritura; consulte Manual:Creación de un bot#Iniciar sesión para obtener más detalles.
  • Los usuarios que no hayan iniciado sesión siempre recibirán el token CSRF vacío, +\.
  • El proceso para solicitar un token ha cambiado varias veces a lo largo de las versiones. Ver API:Tokens para más detalles.
  • ResourceLoader proporciona una forma de acceder a los tokens de edición cuando se ejecuta código dentro de una página wiki.
  • Puedes usar el mismo token de inicio de sesión para todas las operaciones de edición en la misma wiki, durante una sola sesión registrada.
  • Es una buena práctica pasar cualquier token en tu solicitud al final de la cadena de consulta, o al menos después del parámetro de texto. De esa manera, si se interrumpe la conexión, el token no se pasará y la edición fallará. Si está utilizando el objeto mw.Api para realizar solicitudes, esto se hace automáticamente.
  • Aunque captchaid y captchaword, técnicamente, se han eliminado de API:Edit since v1.18, Extension:ConfirmEdit extiende API:Edit para que funcione con CAPTCHAs. Por lo tanto, con ConfirmEdit instalado, estos parámetros aún están disponibles. ConfirmEdit viene empaquetado con el software MediaWiki, v1.18+.

Véase también

  • Help:Editar - Contiene enlaces útiles sobre edición de artículos.
  • Manual:Bot passwords - describe cómo iniciar sesión usando una interfaz simplificada al acceder a wikis a través de un script o aplicación, en lugar de la GUI.
  • Manual:Creating a bot - más detalles sobre el uso de un bot para editar páginas automáticamente.
  • Resource Loader - proporciona una forma de acceder a los tokens de edición cuando se ejecuta JavaScript dentro de una página de MediaWiki.
  • API:Tokens - tiene más detalles sobre el uso de tokens para iniciar sesión o realizar solicitudes POST.
  • API:Tokens (Acción) - Una API obsoleta, distinta de API:Tokens , para solicitar tokens en versiones anteriores de MediaWiki.
  • API:Compara - Te permite diferenciar entre ediciones en una página.
  • API:Gestionar etiquetas - Altera etiquetas en una página.
  • API:Rollback - revierte una serie de ediciones.
  • API:Filerevert - Revertir archivos a un estado anterior
  • API:Revisiondelete - Elimina y restaura revisiones a una página.

Referencias