MediaWiki version:
1.12

POST request to move a page.

API documentation


Special:ApiHelp/move

Example

Making any POST request is a multi-step process:

  1. Log in, via one of the methods described on API:Login.
  2. GET a {{ll|Manual:Edit token|CSRF token}}.
  3. Send a POST request, with the CSRF token, to take action on a page.

The sample code below covers the final step in detail.

POST request

Move "CurrentTitle" and its talk page to "Page with new title", without creating a redirect.

Response

{
    "move": {
        "from": "CurrentTitle",
        "to": "Page with new title",
        "reason": "wrong title",
        "talkfrom": "Talk:CurrentTitle",
        "talkto": "Talk:Page with new title"
    }
}

Sample code

Python

#!/usr/bin/python3

"""
    move.py

    MediaWiki API Demos
    Demo of `Move` module: Move a page with its
    talk page, without a redirect.
    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 move the page
PARAMS_4 = {
    "action": "move",
    "format": "json",
    "from": "Current title",
    "to": "Page with new title",
    "reason": "Typo",
    "movetalk": "1",
    "noredirect": "1",
    "token": CSRF_TOKEN
}

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

print(DATA)

PHP

<?php

/*
    move.php

    MediaWiki API Demos
    Demo of `Move` module: Move a page with its
	talk page, without a redirect.
	
    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
move( $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 move the page
function move( $csrftoken ) {
	global $endPoint;

	$params4 = [
		"action" => "move",
		"from" => "Current title",
		"to" => "Page with new title",
		"reason" => "API Testing",
		"movetalk" => "1",
		"noredirect" => "1",
		"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

/*  
    move.js
 
    MediaWiki API Demos
    Demo of `Move` module: Move a page with its
	talk page, without a redirect.
    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);
        move(data.query.tokens.csrftoken);
    });
}

// Step 4: POST request to move the page
function move(csrf_token) {
    var params_3 = {
        action: "move",
        from: "Current title",
        to: "Page with new title",
        reason: "API Testing",
        movetalk: "1",
        noredirect: "1",
        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

/*
	move.js

	MediaWiki API Demos
	Demo of `Move` module: Move a page with its talk page,
	without a redirect.

	MIT License
*/

var params = {
		action: 'move',
		from: 'Current title',
		to: 'Page with new title',
		reason: 'API Test',
		movetalk: '1',
		noredirect: '1',
		format: 'json'
	},
	api = new mw.Api();

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

Possible errors

Code Info
nofromThe from parameter must be set.
notoThe to parameter must be set.
notokenThe token parameter must be set.
cantmove-anonAnonymous users can't move pages
cantmoveYou don't have permission to move this page.
cantmovefileYou don't have permission to move this file.
If file moving is disabled altogether, you'll get an immobilenamespace error instead
selfmoveCan't move a page to itself
immobilenamespaceYou tried to move pages from or to a namespace that is protected from moving
articleexistsThe destination article already exists and is not a redirect to the source article
protectedpageYou don't have permission to perform this move
protectedtitleThe destination article has been protected from creation
nonfilenamespaceCannot move file to non-file namespace.
filetypemismatchThe new file extension does not match its type.
mustbepostedThe move module requires a POST request.

Parameter history

  • v1.29: Introduced tags
  • v1.17: Deprecated watch, unwatch
  • v1.17: Introduced watchlist

Additional notes

  • Successful use of the noredirect parameter requires the suppressredirect right, which is granted to bots and sysops, not ordinary users.
  • Creating a redirect is the API's default behavior. If you do not have the suppressredirect right, the API will not return an error; it will simply create a redirect.
  • The Move API uses two additional error handling methods when the page move succeeded, but the talk page or subpage move failed:
    • Talk page - The relevant error will be returned in the talkmove-error-code and talkmove-error-info fields.
    • Subpage - The relevant error will be returned as a standard code/info structure under the subpages key.

See also

  • API:Import - interwiki imports allow for an alternate way to move pages around a wiki.
This article is issued from Mediawiki. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.