使用華夏公益教科書/指令碼和 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
}
雖然不太可能,但執行這些指令碼時可能會遇到速率限制問題。在這種情況下,如果你還沒有成為審閱者,最好的選擇是成為審閱者。