Jump to content

API:Protect

From mediawiki.org
This page is a translated version of the page API:Protect and the translation is 97% complete.
Версия MediaWiki:
1.12

POST-запрос для изменения уровня защиты страницы.

Документация по API

action=protect

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

Change the protection level of a page.

Specific parameters:
Other general parameters are available.
title

Title of the page to (un)protect. Cannot be used together with pageid.

pageid

ID of the page to (un)protect. Cannot be used together with title.

Type: integer
protections

List of protection levels, formatted action=level (e.g. edit=sysop). A level of all means everyone is allowed to take the action, i.e. no restriction.

Note: Any actions not listed will have restrictions removed.

This parameter is required.
Separate values with | or alternative.
Maximum number of values is 50 (500 for clients that are allowed higher limits).
expiry

Expiry timestamps. If only one timestamp is set, it'll be used for all protections. Use infinite, indefinite, infinity, or never, for a never-expiring protection.

Separate values with | or alternative.
Maximum number of values is 50 (500 for clients that are allowed higher limits).
Default: infinite
reason

Reason for (un)protecting.

Default: (empty)
tags

Change tags to apply to the entry in the protection log.

Values (separate with | or alternative): AWB, convenient-discussions
cascade

Enable cascading protection (i.e. protect transcluded templates and images used in this page). Ignored if none of the given protection levels support cascading.

Type: boolean (details)
watch
Deprecated.

If set, add the page being (un)protected to 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)
token

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

This parameter is required.


Пример

Защита страницы является многоэтапным процессом:

  1. Войдите, используя один из методов, описанных в API:Вход .
  2. Получите CSRF токен . Этот токен един для всех страниц, но изменяется при каждом входе в систему.
  3. Отправьте POST-запрос с токеном CSRF, чтобы защитить страницу.

Пример кода ниже подробно описывает третий шаг.

POST-запрос

Защитить Main Page на бесконечное время (бессрочно), чтобы редактировать её могли только автоматически подтвержденные участники, а переименовывать только сисопы.

Ответ

{
    "protect": {
        "title": "Main Page",
        "reason": "",
        "protections": [
            {
                "edit": "autoconfirmed",
                "expiry": "infinite"
            },
            {
                "move": "sysop",
                "expiry": "infinite"
            }
        ]
    }
}

Пример кода

Python

#!/usr/bin/python3

"""
    protect.py

    MediaWiki API Demos
    Demo of `Protect` module: Demo to change the edit protection
    level of a given page.

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

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

# Step 3: While logged in, retrieve a CSRF token
PARAMS_3 = {
    "action": "query",
    "meta": "tokens",
    "type": "csrf",
    "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 change edit protection level of a page
PARAMS_4 = {
    "title": "User:SSethi (WMF)/common.js",
    "protections": "edit=autoconfirmed|move=sysop",
    "expiry": "infinite",
    "token": CSRF_TOKEN,
    "action": "protect"
}

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

PHP

<?php

/*
    protect.php

    MediaWiki API Demos
    Demo of `Protect` module: Demo to change the edit protection
	level of a given 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
protect( $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 change edit protection level of a page
function protect( $csrftoken ) {
	global $endPoint;

	$params4 = [
		"action" => "protect",
		"title" => "Sandbox",
		"protections" => "edit=autoconfirmed|move=sysop",
		"expiry" => "infinite",
		"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

/*  
    protect.js
 
    MediaWiki API Demos
    Demo of `Protect` module: Demo to change the edit protection
	level of a given page.

    MIT license
*/

var request = require('request').defaults({jar: true}),
    url = "http://dev.wiki.local.wmftest.net:8080/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);
        protect(data.query.tokens.csrftoken);
    });
}

// Step 4: POST request to change edit protection level of a page
function protect(csrf_token) {
    var params_3 = {
        action: "protect",
        title: "Sandbox",
        protections: "edit=autoconfirmed|move=sysop",
        expiry: "infinite",
        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

/*
	protect.js

	MediaWiki API Demos
	Demo of `Protect` module: Demo to change the edit protection
    level of a given page.

	MIT License
*/

var params = {
		action: 'protect',
		title: 'Sandbo2',
		protections: 'edit=autoconfirmed|move=sysop',
		expiry: 'infinite',
		format: 'json'
	},
	api = new mw.Api();

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

Возможные ошибки

В дополнение к стандартным сообщениям об ошибках:

Код Информация
notitle Параметр title должен быть задан.
notoken Параметр token должен быть задан.
noprotections Параметр protections должен быть задан.
invalidexpiry Некорректное время истечения «expiry».
Означает, что временная метка истечения срока защиты отсутствует или имеет недопустимый формат (например «November 31» или «24:05»). This error will also be thrown when a valid date is before 1970.
pastexpiry Время окончания «expiry» находится в прошлом.
toofewexpiries Задано number временных меток истечения, необходимо number2.
Эта ошибка неудачно названа: она также вызывается, если вы указали слишком много сроков истечения защиты
cantedit Вы не можете защитить эту страницу, так как вы не можете её редактировать
create-titleexists Существующие названия не могут быть защищены с помощью create.
missingtitle-createonly Несуществующие названия страниц могут быть защищены только с помощью create.
protect-invalidaction Недопустимый тип защиты «type».
protect-invalidlevel Недопустимый уровень защиты «level».

История параметров

  • v1.27: Введены tags
  • v1.20: Введены pageid
  • v1.17: Введены watchlist. Устарели watch
  • v1.15: Введены watch

Дополнительная информация

  • Этот модуль требует protect прав.
  • Для MediaWiki версии 1.19 и более ранних, вы можете получить токен защиты через API:Info .
  • Для MediaWiki 1.20-1.23 вы можете получить токен защиты через API:Tokens (действие) .

См. также

  • API:Protectedtitles - Получить список заголовков, защищённых от создания.