MediaWikiのAPI経由で新規ページ作成

この記事には広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

MediaWikiはURLにページタイトルを入力すれば新規ページを作成することが可能です。

しかしこの方法だと大量にページを作りたい時に時間がかかります。

たとえば100記事以上の新規ページをあらかじめ作りたい時などです。

こうゆうときはプログラムで一気にページを作成したいですね。

MediaWikiでは初期インストール時点でAPIが使えるようになっています。

このAPIを使ってページを操作できるようになれば、プログラムでページ作成ができるはずです。

公式サイトは英語でわかりずらいですが、読み解いていきページをプログラムで作成することができました。

その方法を紹介します。

前提条件
  • MediaWiki1.38.2が構築済み
  • pythonがインストールまたは実行できる

BOTアカウントの作成

API経由でMediaWikiを編集するためにはbotアカウントが必要なので作成します。

管理者権限でログインして「特別ページ→ボット用パスワード」を開きます。

管理者のパスワードを求められるので入力するとボット名を入力する画面に遷移します。

作成される botのフルネームは、”管理者のアカウント名@ここで入力したBot名”となります。

次のページでbotに付与する権限を決めます。

権限を決めて次のページに進むとボットのパスワードが表示されますのでそれを控えておきます。

パスワードはAPI実行に必要となります。

API経由でMediaWikiにログインする

APIで編集をするにはAPIでログインをする必要があるのでログインを試していきます。

ログインに必要なのは2ステップです。

  1. ログインのパラメータに渡すためのトークンをAPIで取得する
  2. 取得したログイントークンを使ってログインAPIを実行する

次章で説明していきます。

ログイントークンの取得

ログインをするにはログイントークンという文字列をAPIに渡す必要があります。

そのため、ログイントークンを取得するAPIを最初に実行します。

このAPIはGET形式なので、ブラウザでURL直打ちすれば実行することもできます。

「https://あなたのWiki/api.php?action=query&format=json&meta=tokens&type=login」

JSONが返却されると思います。

実際はブラウザで取得したトークンを使うことはないですが、APIが使えるのか否かを確認するためにやってみてください。

ログインAPIの実行

ログインのAPIはPOST形式なのでpythonでAPIを実行していきます。

前章で作成したボットアカウントとパスワード、ログイントークンをAPIのパラメータに使います。

ではログインを試すPythonプログラムを作りコマンドプロンプトで実行します。

login.py
#!/usr/bin/python3

"""
    login.py

    自分のMediaWikiにログインをする
"""

import requests

# セッションを取得しAPI呼び出しに利用する
S = requests.Session()

# あなたのWikiページのAPIエントリポイント
URL = "https://あなたのMediaWikiパス/api.php"

# ログインするためのトークンを取得する
LOGIN_TOKEN_PARAMS = {
    'action':"query",
    'meta':"tokens",
    'type':"login",
    'format':"json"
}

R = S.get(url=URL, params=LOGIN_TOKEN_PARAMS)
DATA = R.json()

# 取得したログイントークンを変数に格納
LOGIN_TOKEN = DATA['query']['tokens']['logintoken']

print(LOGIN_TOKEN)

# ログインのパラメータを作成する BOTユーザが指定できます。通常のアカウントは指定できない
LOGIN_PARAMS = {
    'action':"login",
    'lgname':"あなたのボットアカウント名",
    'lgpassword':"ボットのパスワード",
    'lgtoken':LOGIN_TOKEN,
    'format':"json"
}

# ログインのAPIを実行する
R = S.post(URL, data=LOGIN_PARAMS)
DATA = R.json()

print(DATA)
成功したときの返却値

57fe5686be281ee40ea252665e07d43e631c396e+\
{‘login’: {‘result’: ‘Success’, ‘lguserid’: 1, ‘lgusername’: ‘あなたのボットのアカウント名’}}

実行時に「No module named ‘requests’」のエラーが出た場合

Pythonの実行環境にrequestsのライブラリがインストールされていないエラーです。

コマンドプロンプトで「pip install requests」を打ち込んでインストールしてください。

権限エラーになった場合

MediaWikiの「LocalSettings.php」の設定で

$wgGroupPermissions[‘*’][‘writeapi’] = false;になっていませんか?

$wgGroupPermissions[‘*’][‘writeapi’] = true;に変更してください。

API経由でMediaWikiのページ作成と編集

前章でAPI経由でのログインに成功しました。

ページ操作のAPIを使うにはログイン後に編集用のトークンの取得して、編集APIにパラメータで渡す必要があります。

ログインの時と似ていますね。

ログイン処理とページ編集処理とログアウトを一度に実施するPythonコードです。

実行するとMediaWikiに新規ページを作ることができます。

PageCreate.py
#!/usr/bin/python3

"""
    MediaWiki_PageCreate.py

    自分のMediaWikiにログインしてページを作成する
"""

import requests

# セッションを取得しAPI呼び出しに利用する
S = requests.Session()

# あなたのWikiページのAPIエントリポイント
URL = "https://あなたのMediaWikiパス/api.php"

# ログインするためのトークンを取得する
LOGIN_TOKEN_PARAMS = {
    'action':"query",
    'meta':"tokens",
    'type':"login",
    'format':"json"
}

R = S.get(url=URL, params=LOGIN_TOKEN_PARAMS)
DATA = R.json()

# 取得したログイントークンを変数に格納
LOGIN_TOKEN = DATA['query']['tokens']['logintoken']

print(LOGIN_TOKEN)

# ログインのパラメータを作成する BOTユーザが指定できます。通常のアカウントは指定できない
LOGIN_PARAMS = {
    'action':"login",
    'lgname':"BOTアカウント名",
    'lgpassword':"BOTアカウントのパスワード",
    'lgtoken':LOGIN_TOKEN,
    'format':"json"
}

# ログインのAPIを実行する
R = S.post(URL, data=LOGIN_PARAMS)
DATA = R.json()

print(DATA)

# CSRFトークンを取得
CSRF_PARAMS = {
    "action":"query",
    "meta":"tokens",
    "format":"json"
}

R = S.get(url=URL, params=CSRF_PARAMS)
DATA = R.json()

CSRF_TOKEN = DATA['query']['tokens']['csrftoken']

# ページの編集APIのパラメータ作成
PAGE_EDIT_PARAMS = {
    "action": "edit",
    "title": "Project:Sandbox",
    "token": CSRF_TOKEN,
    "format": "json",
    "appendtext": "Hello"
}

R = S.post(URL, data=PAGE_EDIT_PARAMS)
DATA = R.json()

print(DATA)

# ログアウトのパラメータ作成
LOGOUT_PARAMS = {
    "action": "logout",
    "token": CSRF_TOKEN,
    "format": "json"
}

R = S.post(URL, data=LOGOUT_PARAMS)
DATA = R.json()

print(DATA)

実行後に「https://あなたのMediaWikiパス/Project:Sandbox」へアクセスしてみてください。

Helloという文字しかないページが作成されたはずです。

まとめ

MediaWikiのAPIを使った操作の基本ができるようになりました。

あとは、やりたいことに合わせてプログラムを作ればよいです。

私は大量の新規ページを自分のWikiに作成したいので、繰り返し処理でページを作成していくことに挑戦しようと思います。