使用维基教科书/脚本和 MediaWiki API
虽然本节对管理员最有帮助,但任何用户都可以使用 MediaWiki API,因此本节应该对任何维基教科书用户都有益。
MediaWiki 提供了一个强大的 API 工具,它可以让你执行几乎所有你可以在维基上使用 API 调用完成的任务。考虑以下示例
https://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Pet_door&rvslots=*&rvprop=content&formatversion=2
在你的网络浏览器上试试。你将看到一个类似于此的页面
MediaWiki API 结果
这是 JSON 格式的 HTML 表示形式。HTML 非常适合调试,但它不适合应用程序使用。
指定 format 参数来更改输出格式。要查看 JSON 格式的非 HTML 表示形式,请设置 format=json。
查看完整的文档或 API 帮助以了解更多信息。
以及一大堆 JSON 文本,其中包含标题“宠物门”的内容。
这有什么用呢?好吧,如果你想获得 100 篇文章的详细信息,你就不必手动访问它们了!只需使用一个简单的 bash 脚本,它可以为你完成这项工作。
现在,这如何应用于维基教科书管理员?假设你正在处理一个大型删除请求。如果有 500 个页面,手动删除每个页面可能需要几个小时,还会让你感到沮丧!相反,使用一个 Python 3 脚本!MediaWiki.org 上的MediaWiki API 页面包含所有此类 API 调用的列表,并包含来自本页代码的帮助示例代码。
首先,是脚本。它就在这里。注释解释了正在发生的事情。
import requests # import the necessary modules
S = requests.Session()
URL = "https://wikibooks.cn/w/api.php" # the API location for Wikibooks
file_object = open("pages_to_delete.txt", "r", encoding="utf-8") # open the file in utf-8 encoding (otherwise files with accents and non-Latin characters may not work)
f1 = file_object.readlines()
# 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.
# Obtain credentials for BOT_USERNAME & BOT_PASSWORDS via Special:BotPasswords
# (https://www.mediawiki.org/wiki/Special:BotPasswords)
# You will need to make sure that the bot username has the necessary rights to perform the requested task
PARAMS_2 = {
"action": "login",
"lgname": "BOT_USERNAME",
"lgpassword": "BOT_PASSWORD",
"lgtoken": LOGIN_TOKEN,
"format": "json"
}
R = S.post(URL, data=PARAMS_2)
# Step 3: While logged in, get an 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 delete each page
for x in f1:
# depends on what you're doing - you may need to tweak the script a bit
if ("Pinyin" not in x):
continue
# remove possible trailing spaces
if (x.isalnum() == False):
xx = x.rstrip(x[-1])
else:
xx = x
print(xx)
# tell Wikibooks to delete!
PARAMS_4 = {
'action':"delete",
'title':xx,
'token':CSRF_TOKEN,
'format':"json"
}
R = S.post(URL, data=PARAMS_4)
DATA = R.json()
print(DATA)
print("done")
那么如何使用它呢?把它放在一个 Python 文件中,把所有要删除的页面放在 pages_to_delete.txt
中,然后运行它。观察输出 - 如果出现错误,MediaWiki 会通知你。常见问题包括
- 找不到请求模块 - 使用
pip
安装它 - 没有修改脚本。例如,如果你要执行撤销删除操作,你可能需要将新页面放在与旧页面不同的位置。确保它们按预期工作!你可能想先进行测试运行。
如果你在任何时候卡住了,只需在WB:RR 上提问。
现在,这可以轻松地进行调整。假设你不删除,而是要撤销删除这些页面。那么只需要将 PARAMS_4
替换为
PARAMS_4 = {
"action": "undelete",
"format": "json",
"token": CSRF_TOKEN,
"title": xx,
"reason": "per [[WB:RFU]]"
}
即使是非管理员也可以从使用脚本中获益。假设你试图批量移动页面。在这种情况下,PARAMS_4
可以改为
PARAMS_4 = {
"action": "move",
"format": "json",
"from": "Current title",
"to": "Page with new title",
"reason": "Typo",
"movetalk": "1", # move the corresponding talk page
"noredirect": "1", # suppress redirects when moving (only available to reviewers and higher)
"token": CSRF_TOKEN
}
虽然不太可能,但运行这些脚本时可能会遇到速率限制问题。在这种情况下,如果你还没有成为审阅者,最好的选择是成为审阅者。