API:Mergehistory/zh
![]() |
使用POST请求来合併頁面歷史。
MediaWiki版本: | ≥ 1.27 |
![]() | 以下文档是Special: |
action=mergehistory
- This module requires read rights.
- This module requires write rights.
- This module only accepts POST requests.
- Source: MediaWiki
- License: GPL-2.0-or-later
Merge page histories.
- from
Title of the page from which history will be merged. Cannot be used together with fromid.
- fromid
Page ID of the page from which history will be merged. Cannot be used together with from.
- Type: integer
- to
Title of the page to which history will be merged. Cannot be used together with toid.
- toid
Page ID of the page to which history will be merged. Cannot be used together with to.
- Type: integer
- timestamp
Timestamp up to which revisions will be moved from the source page's history to the destination page's history. If omitted, the entire page history of the source page will be merged into the destination page.
- Type: timestamp (allowed formats)
- reason
Reason for the history merge.
- Default: (empty)
- token
A "csrf" token retrieved from action=query&meta=tokens
- This parameter is required.
- Merge the entire history of Oldpage into Newpage.
- api.php?action=mergehistory&from=Oldpage&to=Newpage&token=123ABC&reason=Reason [open in sandbox]
- Merge the page revisions of Oldpage dating up to 2015-12-31T04:37:41Z into Newpage.
- api.php?action=mergehistory&from=Oldpage&to=Newpage&token=123ABC&reason=Reason×tamp=2015-12-31T04%3A37%3A41Z [open in sandbox]
发出任何POST请求都是一个多步骤的过程:
下面的示例代碼涵蓋了這些步驟。
POST请求
回應
{
"api": {
"mergehistory": {
"_from": "Oldpage",
"_to": "Newpage",
"_timestamp": "2015-12-31T04:37:41Z",
"_reason": "Reason"
}
}
}
Python
#!/usr/bin/python3
"""
mergehistory.py
MediaWiki API Demos
Demo of `mergehistory` module: Merge the page revisions of Oldpage
dating up to 2015-12-31T04:37:41Z into Newpage
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 using the clientlogin method.
# import rights can't be granted using Special:BotPasswords
# hence using bot passwords may not work.
# See https://www.mediawiki.org/wiki/API:Login for more
# information on log in methods.
PARAMS_2 = {
"action": "clientlogin",
"username": "username",
"password": "password",
"format": "json",
"loginreturnurl": "http://127.0.0.1:5000/",
"logintoken": 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 merge the page revisions
# of Oldpage dating up to 2015-12-31T04:37:41Z into Newpage
PARAMS_4 = {
"action":"mergehistory",
"from":"Oldpage",
"to":"Newpage",
"format":"json",
"timestamp":"2015-12-31T04:37:41Z",
"reason":"Reason",
"token" : CSRF_TOKEN
}
R = S.post(URL, data=PARAMS_4)
DATA = R.text
print(DATA)
# To merge entire history of Oldpage to Newpage,
# remove the "timestamp" parameter in step 4
PHP
<?php
/*
mergehistory.php
MediaWiki API Demos
Demo of `mergehistory` module: Merge the page revisions of Oldpage
dating up to 2015-12-31T04:37:41Z into Newpage
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
mergehistory( $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: Send a post request to log in using the clientlogin method.
// import rights can't be granted using Special:BotPasswords
// hence using bot passwords may not work.
// See https://www.mediawiki.org/wiki/API:Login for more
// information on log in methods.
function loginRequest( $logintoken ) {
global $endPoint;
$params2 = [
"action" => "clientlogin",
"username" => "username",
"password" => "password",
'loginreturnurl' => 'http://127.0.0.1:5000/',
"logintoken" => $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 merge the page revisions of Oldpage dating up to 2015-12-31T04:37:41Z into Newpage
function mergeHistory( $csrftoken ) {
global $endPoint;
$params4 = [
"action"=>"mergehistory",
"from"=>"Oldpage",
"to"=>"Newpage",
"format"=>"json",
"timestamp"=>"2015-12-31T04:37:41Z",
"reason"=>"Reason",
"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);
}
/*
To merge entire history of Oldpage to Newpage,
remove the "timestamp" parameter in step 4
*/
JavaScript
/*
mergehistory.js
MediaWiki API Demos
Demo of `mergehistory` module: Merge the page revisions of Oldpage
dating up to 2015-12-31T04:37:41Z into Newpage
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: Send a post request to log in using the clientlogin method.
// import rights can't be granted using Special:BotPasswords
// hence using bot passwords may not work.
// See https://www.mediawiki.org/wiki/API:Login for more
// information on log in methods.
function loginRequest(login_token) {
var params_1 = {
action: "clientlogin",
username: "username",
password: "password",
loginreturnurl: "http://127.0.0.1:5000/",
logintoken: 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);
mergeHistory(data.query.tokens.csrftoken);
});
}
// Step 4: Send a POST request to merge the page revisions
// of Oldpage dating up to 2015-12-31T04:37:41Z into Newpage
function mergeHistory(csrf_token) {
var params_3 = {
action: "mergehistory",
from: "Oldpage",
to: "Newpage",
reason: "Reason",
format: "json",
timestamp: "2015-12-31T04:37:41Z",
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();
/*
To merge entire history of Oldpage to Newpage,
remove the "timestamp" parameter in step 4
*/
可能的错误
badtoken | 无效的CSRF令牌。 |
apierror-invalidtitle | 错误标题“from”。 错误标题“to”。 |
apierror-nosuchpageid | 没有ID为fromid的页面。 没有ID为toid的页面。 |
补充资料
- Special:MergeHistory - 可以自動合併兩個頁面歷史的特殊頁面。 然而,此功能僅限有
mergehistory
用戶權限的用戶存取。
參見
- Help:合并历史 - 包含有用的連結和合併頁面歷史的資訊