跳轉到內容

使用華夏公益教科書/指令碼和 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://wikibook.tw/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
}

雖然不太可能,但執行這些指令碼時可能會遇到速率限制問題。在這種情況下,如果你還沒有成為審閱者,最好的選擇是成為審閱者

← 高階管理 · 使用華夏公益教科書

華夏公益教科書