API:Bearbeiten

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.
MediaWiki Version:
1.13

POST-Abfrage um eine Seite zu bearbeiten.

API-Dokumentation


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 (ignored for bot users) or do not change watch.

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

Watchlist expiry timestamp. Omit this parameter entirely to leave the current expiry unchanged.

Type: expiry (details)
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, application/octet-stream, application/unknown, application/x-binary, text/css, text/javascript, text/plain, text/unknown, text/x-wiki, unknown/unknown
contentmodel

Content model of the new content.

One of the following values: GadgetDefinition, Json.JsonConfig, JsonSchema, Map.JsonConfig, MassMessageListContent, NewsletterContent, Scribunto, SecurePoll, Tabular.JsonConfig, css, flow-board, javascript, json, sanitized-css, text, translate-messagebundle, unknown, 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

Beispiel

Der Beispielcode in diesem Beispiel ist in Python. Siehe API:Edit/Editing with Ajax für Beispiele und Antworten in Ajax .

POST-Anfrage

Bearbeitungen vorzunehmen ist wie jede POST-Abfrage ein mehrstufiger Prozess.

1. Anmelden über eine der auf API:Login beschriebenen Methoden. Beachte, dass es zwar wichtig ist, die Bearbeitung dem Autor richtig zuzuordnen, viele Wikis jedoch Benutzern erlauben, ohne Registrierung oder Anmeldung mit einem Konto zu editieren.
2. Ein CSRF-Token erhalten:


3. Sende eine POST-Abfrage mit dem CSRF-Token, um eine Aktion auf einer Seite vorzunehmen:


Der Antwort-Abschnitt unten ist für die finale POST-Abfrage, um die Aktion auf der Seite auszuführen. Siehe die Seiten auf API:Login und API:Tokens für die JSON-Antworten früherer Schritte.

Beachte auch, dass die Tokens in den Abfragen auf dieser Seite Beispielwerte sind. Tatsächlich sind Tokens für jede Anmeldung und seitenübergreifende Abfrage einzigartig. Sie sind hier nur angegeben, um zu zeigen, welches Format eine korrekte Abfrage hat.

Antwort

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

Beispielcode

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 );
} );

Benutzerfälle

Bearbeitungskonflikte

Das Python-Beispiel ist eine grundlegende Implementation einer Bearbeitungs-Abfrage eines angemeldeten Benutzers. In der Realität sollte darauf geachtet werden, Bearbeitungskonflikte zu verhindern. Diese treten ein, wenn zwei oder mehr Benutzer gleichzeitig versuchen, die gleiche Seite zu bearbeiten.

Konflikte können verhindert werden, indem bei der Abfrage eines CSRF-Tokens der Zeitstempel der letzten Version abgerufen wird. Durch das Hinzufügen von prop=info|revisions zur Abfrage des CSRF-Tokens in Schritt 3 können wir den Zeitstempel für die letzte Version erhalten. Dieser Zeitstempel wird als basetimestamp genutzt, wenn wir die Bearbeitungs-Abfrage stellen.

Wir benötigen auch die genaue Zeit, zu der wir unsere Bearbeitung beginnen. Diese kann durch Hinzufügen von curtimestamp zur CSRF-Abfrage ebenfalls erhalten werden. Dieser Wert dient als unser starttimestamp.

Schließlich setzen wir in der Bearbeitungs-Abfrage die Parameter basetimestamp und starttimestamp so:



Große Änderungen

POST-Abfragen, die eine große Menge an Text enthalten (8000+ Zeichen), sollten mit Content-Type: multipart/form-data im Header gesendet werden. Da multipart/form-data keine HTML-Auslassungszeichen für Leerzeichen und Satzzeichen hinzufügen muss (d.h. Prozent-Codierung), wird der Umfang von Daten wesentlich kleiner sein als beim Äquivalent der Prozent-Codierung.

Durch multipart/form-data wird jedoch noch eine Überschrift hinzugefügt -- etwa 160 Bytes je Parameter. Für kurze Nachrichten müssen kaum Leerzeichen hinzugefügt werden, weshalb der Umfang an Überschriften ineffizient sein kann und Prozent-Codierung bevorzugt wird.[1]

Beachte, dass in unserem Python-Beispielcode die Abfrage standardmäßig Prozent-codiert wird.

Siehe die MDN-Web-Dokumente für eine technischere Diskussion von content-type und POST-Abfragen. Siehe die Python-Abfrage-Dokumentation dazu, wie multipart/form-data mit einer Syntax übergeben wird, die der in unserem Python-Beispielcode ähnelt.

CAPTCHAs

Wenn dein Ziel-Wikk CAPTCHAs nutzt, kann deine Abfrage einen Fehler zurückgeben, der eine ID-Nummer und einen einfachen Test, wie eine Frage, ein mathematisches Problem oder eine URL zu einem Bild, enthält. Um deine Bearbeitung zu beenden, musst du den Test beenden und dann deine Abfrage erneut mit der ID und der/den korrekten Antwort(en) angehängt an die ursprüngliche Abfrage-Zeichenkette ausführen, etwa so: captchaid=sampleId&captchaword=answer

Andere CAPTCHA-Systeme und Erweiterungen können unterschiedliche Parameter für ähnliche Zwecke nutzen. Nutze allgemein die Feldnamen für die ID und Testfragen als Parameter in deiner zweiten Abfrage.

Mögliche Fehler

Code Information
notitle The title parameter must be set.
missingparam At least one of the parameters text, appendtext und undo is required.
notoken The token parameter must be set.
invalidsection Der Parameter section muss eine gültige Abschnittskennung oder new sein.
protectedpage Diese Seite wurde geschützt, um Bearbeitungen sowie andere Aktionen zu verhindern.
cantcreate Du hast nicht die erforderliche Berechtigung, um neue Seiten erstellen zu können.
cantcreate-anon Unangemeldete Benutzer können keine neuen Seiten erstellen
articleexists The article you tried to create has been created already.
noimageredirect-anon Anonymous users can't create image redirects.
noimageredirect You don't have permission to create image redirects.
spamdetected Your edit was refused because it contained a spam fragment: Wikitext.
abusefilter-warning Diese Aktion wurde automatisch als schädlich erkannt.
abusefilter-disallowed Diese Aktion wurde automatisch als schädlich erkannt und ist daher verboten.
contenttoobig Der gelieferte Inhalt überschreitet die Artikelgrößenbegrenzung von bytes Kibibyte.
Where bytes is the value of $wgMaxArticleSize.
noedit-anon Anonymous users can't edit pages.
noedit You don't have permission to edit pages.
pagedeleted The page has been deleted since you fetched its timestamp.
emptypage Das Erstellen neuer leerer Seiten ist nicht erlaubt.
emptynewsection Creating empty new sections is not possible.
editconflict Bearbeitungskonflikt.
revwrongpage Die Version revid ist keine Version von pagename.
Wird ausgegeben, wenn eine ungültige Versions-ID für undo oder undoafter angegeben wird
undofailure Die Änderung konnte nicht rückgängig gemacht werden, da der betroffene Abschnitt zwischenzeitlich verändert wurde.
missingtitle The page you specified doesn't exist.
(siehe oben Parameter nocreate)
mustbeposted The edit module requires a POST request.
readapidenied You need read permission to use this module.
writeapidenied You're not allowed to edit this wiki through the API.
noapiwrite Das Bearbeiten dieses Wikis über die API ist deaktiviert.
badtoken Invalid CSRF token.
missingparam The title, pageid parameter must be set.
invalidparammix The parameters title, pageid can not be used together.
invalidtitle Ungültiger Titel „title“.
invalid-content-data Ungültige Inhaltsdaten
occurs when trying to edit a JSON page with non-conforming data, or while trying to edit a MassMessageListContent page
nosuchpageid Es gibt keine Seite mit der ID pageid.
pagecannotexist Namespace doesn't allow actual pages.
nosuchrevid There is no revision with ID undo.
nosuchrevid There is no revision with ID undoafter.
badmd5 Die angegebene MD5-Prüfsumme war falsch.
hookaborted Der Versuch, die Änderung durchzuführen, wurde von einer Parsererweiterung abgebrochen.
parseerror Content serialization failed: parseerror
summaryrequired ⧼apierror-summaryrequired⧽
blocked You have been blocked from editing.
ratelimited You've exceeded your rate limit. Please wait some time and try again.
unknownerror Unbekannter Fehler: „retval“.
nosuchsection Es gibt keinen Abschnitt $1.
sectionsnotsupported Sections are not supported for content model $1.
editnotsupported Bearbeitungen dieses Seitentyps werden nicht von der textbasierten Bearbeitungs-API unterstützt.
appendnotsupported Can't append to pages using content model $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 The requested format $1 is not supported for content model $2 used by $3.
customcssprotected Du hast nicht die Berechtigung, diese CSS enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.
customjsprotected Du hast nicht die Berechtigung, diese JavaScript enthaltende Seite zu bearbeiten, da es sich hierbei um die persönlichen Einstellungen eines anderen Benutzers handelt.
taggingnotallowed Du hast keine Berechtigung, um Markierungen zu setzen
badtags Die Markierung „Tag“ darf nicht manuell angewendet werden.
Die folgenden Markierungen dürfen nicht manuell angewendet werden: Tag1, Tag2
tpt-target-page Diese Seite kann nicht manuell aktualisiert werden.

Diese Seite ist eine Übersetzung der Seite $1 und die Übersetzung kann mithilfe des [$2 Übersetzungswerkzeuges] aktualisiert werden.
Bei der Nutzung von Erweiterung:Übersetzen ist die Bearbeitung einer übersetzten Unterseite nicht erlaubt.

Parametergeschichte

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

Zusätzliche Anmerkungen

  • Die Anmeldung wird von der API nicht unbedingt gefordert, ist jedoch nötig, um die Bearbeitung korrekt ihrem Autor zuzuordnen. Eine erfolgreiche Bearbeitung eines unangemeldeten Benutzers wird der IP-Adresse zugeordnet.
  • Bots, die nicht angemeldet sind, können Bearbeitungs- und anderen Schreibeinschränkungen unterliegen; siehe Manual:Creating a bot#Logging in für weitere Details.
  • Benutzer, die nicht angemeldet sind, erhalten immer ein leeres CSRF-Token, +\.
  • Der Prozess für die Abfrage eines Tokens hat sich über die Versionen hinweg mehrfach geändert. Weitere Informationen findest du unter API:Tokens .
  • ResourceLoader bietet einen Weg, um auf Bearbeitungs-Tokens zurückgreifen, während Code auf einer Wiki-Seite ausgeführt wird.
  • Du kannst das gleiche CSRF-Token für alle Bearbeitungsaktionen im gleichen Wiki während einer Sitzung verwenden.
  • Es ist gute Praxis, alle Tokens einer Abfrage am Ende der Abfrage-Zeichenkette oder zumindest nach dem Text-Parameter anzugeben. Auf diesem Weg wird der Token nicht übergeben, wenn die Verbindung unterbrochen wird und die Bearbeitung schlägt fehlt. Wenn du das mw.Api -Objekt nutzt, um Abfragen zu stellen, geschieht dies automatisch.
  • Obwohl captchaid und captchaword technisch gesehen seit v1.18 aus API:Edit entfernt wurden, hat Extension:ConfirmEdit API:Edit erweitert, um mit CAPTCHAs zu funktionieren. Wenn ConfirmedEdit installiert ist, sind diese Parameter weiterhin verfügbar. ConfirmEdit ist im Paket der MediaWiki-Software v1.18+ enthalten.

Siehe auch

Einzelnachweise