API:Import/zh
![]() |
MediaWiki版本: | ≥ 1.15 |
POST请求以另一个维基(跨维基)或xml文件导入页面。
![]() | 以下文档是Special: |
action=import
- This module requires read rights.
- This module requires write rights.
- This module only accepts POST requests.
- Source: MediaWiki
- License: GPL-2.0-or-later
Import a page from another wiki, or from an XML file.
Note that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending a file for the xml parameter.
- summary
Log entry import summary.
- xml
Uploaded XML file.
- Must be posted as a file upload using multipart/form-data.
- interwikiprefix
For uploaded imports: interwiki prefix to apply to unknown usernames (and known users if assignknownusers is set).
- interwikisource
For interwiki imports: wiki to import from.
- One of the following values: meta, usability, w:en, wikitech
- interwikipage
For interwiki imports: page to import.
- fullhistory
For interwiki imports: import the full history, not just the current version.
- Type: boolean (details)
- templates
For interwiki imports: import all included templates as well.
- Type: boolean (details)
- namespace
Import to this namespace. Cannot be used together with rootpage.
- One of the following values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 90, 91, 92, 93, 100, 101, 102, 103, 104, 105, 106, 107, 710, 711, 828, 829, 1198, 1199, 2600, 5500, 5501
- assignknownusers
Assign edits to local users where the named user exists locally.
- Type: boolean (details)
- rootpage
Import as subpage of this page. Cannot be used together with namespace.
Change tags to apply to the entry in the import log and to the null revision on the imported pages.
- Values (separate with | or alternative): AWB, convenient-discussions
- token
A "csrf" token retrieved from action=query&meta=tokens
- This parameter is required.
- Import meta:Help:ParserFunctions to namespace 100 with full history.
- api.php?action=import&interwikisource=meta&interwikipage=Help:ParserFunctions&namespace=100&fullhistory=&token=123ABC [open in sandbox]
导入过程
导入页面是一个多步骤的过程:
- 使用 中描述的方法之一登录。
- 获取CSRF令牌 。 所有页面的巡查令牌是相同的,但是每次登录时巡查令牌会改变。
- 发送带有CSRF令牌的POST请求以导入页面。
下面的示例代码详细介绍了第3步。
示例1:从另一个维基导入页面
POST请求
响应
{
"import": [
{
"ns": 12,
"revisions": 639,
"title": "Help:ParserFunctions"
}
]
}
示例代码 1
Python
#!/usr/bin/python3
"""
import_interwiki.py
MediaWiki Action API Code Samples
Demo of `Import` module: Import a page from another wiki by
specifying its title
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",
'loginreturnurl': 'http://127.0.0.1:5000/',
"format":"json",
"logintoken":LOGIN_TOKEN
}
R = S.post(URL, data=PARAMS_2)
# 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: Post request to import page from another wiki
PARAMS_4 = {
"action": "import",
"format": "json",
"interwikisource": "meta",
"interwikipage": "Help:ParserFunctions",
"fullhistory":"true",
"namespace":"100",
"token": CSRF_TOKEN
}
R = S.post(url=URL, data=PARAMS_4)
DATA = R.json()
print(DATA)
PHP
<?php
/*
import_interwiki.php
MediaWiki API Demos
Demo of `Import` module: Import a page from another wiki by
specifying its title
MIT license
*/
$endPoint = "http://dev.wiki.local.wmftest.net:8080/w/api.php";
$login_Token = getLoginToken(); // Step 1
loginRequest( $login_Token ); // Step 2
$csrf_Token = getCSRFToken(); // Step 3
import( $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" => "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: POST request to import page from another wiki
function import( $csrftoken ) {
global $endPoint;
$params4 = [
"action" => "import",
"interwikisource" => "wikipedia:en",
"interwikipage" => "Pragyan (rover)",
"namespace" => "0",
"fullhistory" => "true",
"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
/*
import_interwiki.js
MediaWiki API Demos
Demo of `Import` module: Import a page from another wiki by
specifying its title
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: "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);
import_interwiki(data.query.tokens.csrftoken);
});
}
// Step 4: POST request to import page from another wiki
function import_interwiki(csrf_token) {
var params_3 = {
action: "import",
interwikisource: "wikipedia:en",
interwikipage: "Pragyan (rover)",
namespace: "0",
fullhistory: "true",
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
/*
import_interwiki.js
MediaWiki API Demos
Demo of `Import` module: Import a page from another wiki by
specifying its title
MIT License
*/
var params = {
action: 'import',
interwikisource: 'en:w',
interwikipage: 'Template:!-',
fullhistory: 'true',
namespace: '100',
format: 'json'
},
api = new mw.Api();
api.postWithToken( 'csrf', params ).done( function ( data ) {
console.log( data );
} );
示例2:通过上传页面的xml转储导入页面
POST请求
Import : by uploading its xml dump obtained from Special:Export.
上传文件时,您需要使用multipart/form-data
作为Content-Type或enctype,application/x-www-form-urlencoded
将不起作用。
xml
不是文件名,而是文件的实际内容。
响应
响应 |
---|
{
"import": [
{
"ns": 12,
"title": "Help:ParserFunctions",
"revisions": 639
}
]
}
|
示例代码 2
Python
#!/usr/bin/python3
"""
import_xml.py
MediaWiki Action API Code Samples
Demo of `Import` module: Import a page from another wiki
by uploading its xml dump
MIT license
"""
import requests
S = requests.Session()
URL = "https://test.wikipedia.org/w/api.php"
FILE_PATH = '/path/to/your/file.xml'
# 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.
# importupload 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",
'loginreturnurl': 'http://127.0.0.1:5000/',
"format":"json",
"logintoken":LOGIN_TOKEN
}
R = S.post(URL, data=PARAMS_2)
# 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: Post request to upload xml dump.
# xml dumps can be downloaded through Special:Export
# See https://www.mediawiki.org/wiki/Special:Export
PARAMS_4 = {
"action": "import",
"format": "json",
"token": CSRF_TOKEN,
"interwikiprefix": "meta"
}
FILE = {'xml':('file.xml', open(FILE_PATH))}
R = S.post(url=URL, files=FILE, data=PARAMS_4)
DATA = R.json()
print(DATA)
JavaScript
/*
import_xml.js
MediaWiki API Demos
Demo of `Import` module: Import a page from another wiki
by uploading its xml dump
MIT license
*/
var fs = require('fs'),
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: "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);
import_xml(data.query.tokens.csrftoken);
});
}
// Step 4: POST request to upload xml dump.
// xml dumps can be downloaded through Special:Export
// See https://www.mediawiki.org/wiki/Special:Export
function import_xml(csrf_token) {
var params_3 = {
action: "import",
interwikiprefix: "en",
token: csrf_token,
format: "json"
};
var file = {
xml: fs.createReadStream('a.xml')
};
var formData = Object.assign( {}, params_3, file );
request.post({ url: url, formData: formData }, function (error, res, body) {
if (error) {
return;
}
console.log(body);
});
}
// Start From Step 1
getLoginToken();
可能的错误
除了标准错误消息 :
Code | Info |
---|---|
notoken | token参数必须被设置。 |
cantimport | 您没有权限导入页面。 |
cantimport-upload | 您没有权限导入上传的页面。 |
nointerwikipage | interwikipage参数必须被设置。 |
nofile | You didn't upload a file |
filetoobig | The file you uploaded is bigger than the maximum upload size |
partialupload | The file was only partially uploaded |
notempdir | The temporary upload directory is missing 这通常意味着服务器损坏或配置错误 |
cantopenfile | Couldn't open the uploaded file 这通常意味着服务器损坏或配置错误 |
badinterwiki | Invalid interwiki title specified |
import-unknownerror | 导入时的未知错误:error。 |
参数历史
- v1.29: 启用
tags
- v1.20: 启用
rootpage
附加提醒
- 该模块不可用作生成器 。
importupload
rights are required in order to upload an xml file, whileimport
rights are required for interwiki imports.
- If you get a
Missing boundary in multipart/form-data POST data
error, it is because you sent it url-encoded but claimed it would be multipart/form-data.
MediaWiki is looking for a boundary in the header but cannot find it.
- Parameters marked with
upload
are only used when importing an uploaded XML file.
Similarly, parameters marked with interwiki
are only used when importing from another wiki (transwiki).
- The possible values for the
interwikisource
parameter differ per wiki, see Manual:$wgImportSources .
If the list of possible values for this parameter is empty, interwiki imports are disabled.
参见
- Special:Export - Export the text and editing history of a particular page or set of pages wrapped in some XML.
- 通过API导出页面 。
- API:上传 - 上传一个文件。