Hatena::ブログ(Diary)

shouhの日記

2015-01-18

Mediawikiでページ編集(特定セクションへのprepend)を行うAPIを試してみた

前提

  • API操作には python 2.7 + Requests ライブラリを使用
  • 使用する Mediawiki のバージョンは失念
    • 気が向いたら追記するよ
  • サンプルスクリプトの稚拙さ(特に英語?)や解説の少なさは許してちょ

本記事の内容について
以下の二つのパターンについて、ページ編集を行うサンプルスクリプトを載せる。

  • Mediawikiに認証がかかっている(ログインしないとページを見れない)場合
  • ついでにAPI経由での認証ステップも
  • 認証がかかっていない(ログインせずとも誰でもどのページを見れる)場合

認証がかかっている場合のサンプル

サンプルスクリプトの考え方

サンプルスクリプトでやりたいことは「指定したセクション(見出し)に、指定したテキストを prepend すること」です。

どう prepend されるかの仕組み

たとえば以下のようなページがあったとします。

	= section1 =
	= section2 =
	= section3 =

この時、セクション番号の対応は以下になります。

	= section1 = ← 番号1
	= section2 = ← 番号2 ここにテキストを prepend したいなら、section="3" を指定
	= section3 = ← 番号3

上記にも書きましたが、n番目のセクションに prepend したいなら、セクション番号には n+1 を指定しなければなりません。

サンプルスクリプト
#  MUST Parameters
url = 'http://HOGEHOGE/mediawiki/api.php'
username = ''
password = ''
target_pagename = ''
target_section_no = ''

# login
# 1. ログインしてトークンを取得する.
data = {
  "action" : "login",
  "lgname" : username,
  "lgpassword" : password,
  "format" : "json"
}
r = requests.post(url, data=data)
token = r.json()['login']['token']

# relogin with got token
# 2. 取得したトークンを lgtoken に与えて再ログイン.
#    その際, 前回ログイン時に入手した cookie を維持すること.
data["lgtoken"] = token.encode() # token is unicode string!
r = requests.post(url, data=data, cookies=r.cookies)
if r.json()['login']['result'] != 'Success':
  print "Login Failed..."
  sys.exit(0)

# get token for editting.
# 3. 認証完了したので, ようやく編集に入れる.
#    編集には編集トークンが必要なので、まずは取ってくる.
data = {
  'action' : 'tokens',
  'type' : 'edit',
  'format' : 'json'
}
r = requests.get(url, params=data, cookies = r.cookies)
edittoken = r.json()["tokens"]["edittoken"]

# edit
# 4. 編集トークンを与えて編集実行.
tweet_body = 'testTESTテスト'
prependtext = '==%s: %s==\n\n' % (update_datetime, tweet_body)
data = {
  'action' : 'edit',
  'title' : target_pagename,
  'section' : target_section_no,
  'prependtext' : prependtext,
  'token' : edittoken
}
r = requests.post(url, data=data, cookies=r.cookies)

print "=== result header of editting request === "
print r.headers

認証がかかっていない場合のサンプル

はじめに

編集トークンは "+\" なので、わざわざ取得せずとも、ハードコーディングでもいいかも。

サンプルスクリプト

Twitterみたいなつぶやきの投稿を実現するような関数を書いてみた。

def prepend_to_mediawiki(update_datetime, tweet_body):
    #  MUST Parameters
    url = 'http://HOGEHOGE/mediawiki/api.php'
    target_pagename = ''
    target_section_no = ''

    # edit
    prependtext = '==%s: %s==\n\n' % (update_datetime, tweet_body)
    data = {
        'action' : 'edit',
        'title' : target_pagename,
        'section' : target_section_no,
        'prependtext' : prependtext,
        'token' : '+\\'
    }
    r = requests.post(url, data=data)

    print "=== result header of editting request === "
    print r.headers

なお、これを実現するためには、以下の様なページ(以下の例だとセクション番号は "2" を指定すれば、つぶやき一覧部分に prepend できる)をあらかじめ作っておく必要がある。

= ここは? =
Twitterのようにつぶやきをストックしてみるページです。

= つぶやき一覧 =

= dummy section =
この見出しはダミーです。上記の見出しに prepend するために必要なものなので削除しないでください。