跳转到内容

使用维基教科书/脚本和 MediaWiki API

来自维基教科书,为开放世界提供开放书籍

虽然本节对管理员最有帮助,但任何用户都可以使用 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
}

虽然不太可能,但运行这些脚本时可能会遇到速率限制问题。在这种情况下,如果你还没有成为审阅者,最好的选择是成为审阅者

← 高级管理 · 使用维基教科书

华夏公益教科书