MediaWiki APIを使ってWikipediaの情報を取得

# はじめに

## 内容

MediaWiki APIを使うとWikipediaの情報をAPIを使って取得できる。
例えば次のようなことが可能。

* 記事の内容を取得
* 記事からのリンクや記事へのリンクの一覧を取得
* 記事を含むカテゴリを取得
* 記事で使われているテンプレートを取得
* Wikipediaへのログイン・ログアウト
* 記事の編集

フォーマットはXML, JSON, YAMLなどに対応している。

今回は主に記事に関する情報を取得する方法を紹介する。
より詳しい内容は[公式ドキュメント](http://www.mediawiki.org/wiki/API:Main_page "API:Main page - MediaWiki")を参照。

2014-12-19 追記: ~~[こちら](https://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:API%E3%82%B5%E3%83%B3%E3%83%89%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9 "APIサンドボックス - Wikipedia")~~でAPIサンドボックスが使えるようです。 @yukichi さん、ありがとうございます。
2018-07-14 追記: [APIサンドボックス](https://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:ApiSandbox)のURLが変更されたようです。 @mizoe@github さん、ありがとうございます。


## 注意

Wikipediaの提供するMediaWiki APIにはリクエスト数／時間などの制限はないが、大量のリクエストを送ってサーバに負担をかけてはいけない。
例えば次のことに気をつける。

* レスポンスを受け取ってから次のリクエストを送る
* 繰り返し操作はなるべく1つのリクエストにまとめる
* User-Agent偽装はしない

詳しくは[こちら](http://www.mediawiki.org/wiki/API:Etiquette "API:Etiquette - MediaWiki")を参照。

# API仕様

## URLフォーマット

Wikipedia日本語版の場合、URLは次のようになる。

```
http://ja.wikipedia.org/w/api.php?パラメータ1=値1&パラメータ2=値2&...&パラメータn=値n
```

## パラメータの種類

パラメータには全てのAPIリクエストで使用できる汎用パラメータと、指定したactionごとに固有のパラメータがある。

### 汎用パラメータ

フォーマットやアクションを指定する。

| パラメータ | 意味 | 値 |
|:---|:---|:---|
| format | 出力フォーマット | json, xml, yaml, ... |
| action | 操作 | query, login, logout, edit, ... |

### アクション固有パラメータ

汎用パラメータに`action=query`を指定した場合、取得したい情報の種類に応じて次のようなパラメータを指定する。

| パラメータ | 意味 | 値 |
|:---|:---|:---|
| prop | 記事の各構成要素を取得 | info, revisions, categories, links, templates, images, ... |
| list | 記事などのリストを取得 | backlinks, random, search,  ... |

## 記事の指定方法

`prop=記事の構成要素`を用いる場合、次のいずれかのパラメータを用いて記事を指定する。

| パラメータ | 意味 | 値 |
|:---|:---|:---|
| titles | 記事タイトル | （URLエンコードされた文字列） |
| pageids | 記事ID | （整数） |

# 使用例

以下では目的ごとにAPIの使用法を説明する。
汎用パラメータは`format=xml`と`action=query`を指定している。

## 記事の基本情報を取得

### パラメータ

`prop=info`を用いる。

### 例

記事「エマ・ワトソン」の基本情報を取得

<http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=info&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<api>
  <query>
    <pages>
      <page pageid="128948" ns="0" title="エマ・ワトソン" contentmodel="wikitext" pagelanguage="ja" touched="2014-04-22T16:31:02Z" lastrevid="50754976" counter="" length="35154" />
    </pages>
  </query>
</api>
```

## 記事本文を取得

### パラメータ

`prop=revisions`を用いる。
この操作は本来記事のリビジョンを取得するためのものなので、本文を取得したい場合はさらに`rvprop=content`を指定する。

デフォルトではMediaWiki記法で書かれた本文が返る。
本文をHTML形式で取得したければ`rvparse`オプションを指定する。
タグなどがエスケープされた形式で返るので、元に戻す処理が必要。

| パラメータ | 意味 | 値 |
|:---|:---|:---|
| rvprop | 取得する要素 | ids, timestamp, content, ... |
| rvparse | 本文をHTML形式で取得 | （なし） |

### 例

記事「エマ・ワトソン」の本文を取得

<http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=revisions&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3&rvprop=content>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<api>
  <query>
    <pages>
      <page pageid="128948" ns="0" title="エマ・ワトソン">
        <revisions>
          <rev contentformat="text/x-wiki" contentmodel="wikitext" xml:space="preserve">{{ActorActress
| 芸名 = Emma Watson
| ふりがな = エマ・ワトソン
...
{{Link FA|zh}}</rev>
        </revisions>
      </page>
    </pages>
  </query>
</api>
```

### 例（HTML）

記事「エマ・ワトソン」の本文を（エスケープされた）HTML形式で取得

<http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=revisions&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3&rvprop=content&rvparse>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<api>
  <query>
    <pages>
      <page pageid="128948" ns="0" title="エマ・ワトソン">
        <revisions>
          <rev xml:space="preserve">&lt;table class="infobox" style="width:20em; text-align:left; font-size:90%"&gt;
&lt;tr&gt;
&lt;td colspan="2" style="text-align:center; padding-top:0.1em; background-color:#ed8; color:#000"&gt; &lt;small&gt;エマ・ワトソン&lt;/small&gt;&lt;br/&gt;&lt;big&gt;&lt;b&gt;Emma Watson&lt;/b&gt;&lt;/big&gt;
...
&lt;/p&gt;</rev>
        </revisions>
      </page>
    </pages>
  </query>
</api>
```

## 記事からリンクしている記事の一覧を取得

### パラメータ

`prop=links`を用いる。

結果が多くて一度に表示できない場合、レスポンスに含まれるplcontinueの属性値をリクエストURLの`plcontinue`パラメータに与えることで、次のページを取得できる。

| パラメータ | 意味 | 値 |
|:---|:---|:---|
| plnamespace | 記事の名前空間 | 0（通常の記事）, 1（ノート）, ... |
| pllimit | 結果数の上限 | （整数） |
| plcontinue | リクエストの継続情報 | （レスポンスに含まれる属性値） |

### 例

記事「エマ・ワトソン」からのリンクの一覧を取得

<http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=links&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<api>
  <query-continue>
    <links plcontinue="128948|0|MTVムービー・アワード" />
  </query-continue>
  <query>
    <pages>
      <page pageid="128948" ns="0" title="エマ・ワトソン">
        <links>
          <pl ns="0" title="1990年" />
          <pl ns="0" title="2001年" />
          ...
          <pl ns="0" title="IMDB" />
        </links>
      </page>
    </pages>
  </query>
</api>
```

### 例（次のページ）

<http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=links&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3&plcontinue=128948|0|MTV%E3%83%A0%E3%83%BC%E3%83%93%E3%83%BC%E3%83%BB%E3%82%A2%E3%83%AF%E3%83%BC%E3%83%89>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<api>
  <query-continue>
    <links plcontinue="128948|0|ウォールフラワー_(映画)" />
  </query-continue>
  <query>
    <pages>
      <page pageid="128948" ns="0" title="エマ・ワトソン">
        <links>
          <pl ns="0" title="MTVムービー・アワード" />
          <pl ns="0" title="Noah" />
          ...
          <pl ns="0" title="インターネット・ムービー・データベース" />
        </links>
      </page>
    </pages>
  </query>
</api>
```

## 記事が属するカテゴリの一覧を取得

### パラメータ

`prop=categories`を用いる。詳細は`prop=links`と同様。

| パラメータ | 意味 | 値 |
|:---|:---|:---|
| cllimit | 結果数の上限 | （整数） |
| clcontinue | リクエストの継続情報 | （レスポンスに含まれる属性値） |

### 例

記事「エマ・ワトソン」が属するカテゴリの一覧を取得

<http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=categories&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<api>
  <query>
    <pages>
      <page pageid="128948" ns="0" title="エマ・ワトソン">
        <categories>
          <cl ns="14" title="Category:1990年生" />
          <cl ns="14" title="Category:イングランドの俳優" />
          ...
          <cl ns="14" title="Category:存命人物" />
        </categories>
      </page>
    </pages>
  </query>
</api>
```

## 記事で使用されているテンプレートの一覧を取得

### パラメータ

`prop=templates`を用いる。詳細は`prop=links`と同様。

| パラメータ | 意味 | 値 |
|:---|:---|:---|
| tllimit | 結果数の上限 | （整数） |
| tlcontinue | リクエストの継続情報 | （レスポンスに含まれる属性値） |

### 例

記事「エマ・ワトソン」で使用されているテンプレートの一覧を取得

<http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=templates&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<api>
  <query-continue>
    <templates tlcontinue="128948|10|Cite_press_release" />
  </query-continue>
  <query>
    <pages>
      <page pageid="128948" ns="0" title="エマ・ワトソン">
        <templates>
          <tl ns="10" title="Template:!" />
          <tl ns="10" title="Template:Accessdate" />
          ...
          <tl ns="10" title="Template:Cite news" />
        </templates>
      </page>
    </pages>
  </query>
</api>
```

## 記事に含まれる画像の一覧を取得

### パラメータ

`prop=images`を用いる。詳細は`prop=links`と同様。

| パラメータ | 意味 | 値 |
|:---|:---|:---|
| imlimit | 結果数の上限 | （整数） |

### 例

記事「エマ・ワトソン」に含まれる画像の一覧を取得

<http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=images&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<api>
  <query>
    <pages>
      <page pageid="128948" ns="0" title="エマ・ワトソン">
        <images>
          <im ns="6" title="ファイル:Commons-logo.svg" />
          <im ns="6" title="ファイル:Emma Watson 2012.jpg" />
          ...
          <im ns="6" title="ファイル:Wikiquote-logo.svg" />
        </images>
      </page>
    </pages>
  </query>
</api>
```

## 記事へリンクしている記事の一覧を取得

### パラメータ

`list=backlinks`を用いる。

| パラメータ | 意味 | 値 |
|:---|:---|:---|
| bltitle | 記事タイトル | （URLエンコードされた文字列） |
| blnamespace | 記事の名前空間 | 0（通常の記事）, 1（ノート）, ... |
| blfilterredir | リダイレクト記事の扱い | all（全ての記事を取得）, redirects（リダイレクト記事のみ取得）, nonredirects（リダイレクト記事以外のみ取得） |
| bllimit | 取得するリンク数の上限 | （整数） |
| blredirect | リダイレクト経由でリンクしている記事を含める | （なし） |
| blcontinue | リクエストの継続情報 | （レスポンスに含まれる属性値） |

### 例

記事「エマ・ワトソン」へリンクしている記事の一覧を取得

<https://ja.wikipedia.org/w/api.php?format=xml&action=query&list=backlinks&bltitle=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<api>
  <query-continue>
    <backlinks blcontinue="0|エマ・ワトソン|128963" />
  </query-continue>
  <query>
    <backlinks>
      <bl pageid="4870" ns="0" title="4月15日" />
      <bl pageid="5694" ns="0" title="ハリー・ポッターシリーズ" />
      ...
      <bl pageid="106220" ns="0" title="エマ" />
    </backlinks>
  </query>
</api>
```

## 単語を含む記事を検索

### パラメータ

`list=search`を用いる。

| パラメータ | 意味 | 値 |
|:---|:---|:---|
| srsearch | 検索語 | （URLエンコードされた文字列） |
| srlimit | 結果数の上限 | （整数） |
| srnamespace | 記事の名前空間 | 0（通常の記事）, 1（ノート）, ... |
| sroffset | 結果のオフセット | （整数） |
| srprop | 結果に含める情報 | size（記事サイズ）, wordcount（記事の単語数）, timestamp（記事の最終更新日時）, score（検索エンジンのスコア）, snippet（記事中の検索語を含む部分）, ... |
| srredirects | リダイレクト記事を含める | （なし） |

### 例

単語「エマ・ワトソン」を含む記事を検索

<http://ja.wikipedia.org/w/api.php?format=xml&action=query&list=search&srsearch=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<api>
  <query-continue>
    <search sroffset="10" />
  </query-continue>
  <query>
    <searchinfo totalhits="62" />
    <search>
      <p ns="0" title="エマ・ワトソン" snippet="| ふりがな = &lt;span class='searchmatch'&gt;エマ・ワトソン&lt;/span&gt;&#xA;...ンズ・チャイニーズ・シアター]]でサインを求められる&lt;span class='searchmatch'&gt;エマ・ワトソン&lt;/span&gt; ([[2007年]])]]&#xA;" size="35154" wordcount="1742" timestamp="2014-02-19T10:14:16Z" />
      <p ns="0" title="ハリー・ポッターと死の秘宝" snippet="...[[ダニエル・ラドクリフ]]&amp;lt;br&amp;gt;[[ルパート・グリント]]&amp;lt;br&amp;gt;[[&lt;span class='searchmatch'&gt;エマ・ワトソン&lt;/span&gt;]]&amp;lt;br&amp;gt;[[レイフ・ファインズ]]&amp;lt;br&amp;gt;[[アラン・リックマン]]&amp;lt;br&amp;gt;&#xA;...ニエル・ラドクリフ]]&amp;lt;br /&amp;gt;[[ルパート・グリント]]&amp;lt;br /&amp;gt;[[&lt;span class='searchmatch'&gt;エマ・ワトソン&lt;/span&gt;]]&amp;lt;br /&amp;gt;[[ヘレナ・ボナム＝カーター]]&amp;lt;br /&amp;gt;[[ロビー・コル�&#xA;" size="75627" wordcount="2711" timestamp="2014-01-31T09:28:04Z" />
      ...
      <p ns="0" title="ハリー・ポッターと秘密の部屋" snippet="...ニエル・ラドクリフ]]&amp;lt;br /&amp;gt;[[ルパート・グリント]]&amp;lt;br /&amp;gt;[[&lt;span class='searchmatch'&gt;エマ・ワトソン&lt;/span&gt;]]&amp;lt;br /&amp;gt;[[ケネス・ブラナー]]&amp;lt;br /&amp;gt;[[ジョン・クリーズ]]&amp;lt;br/&amp;gt;[&#xA;| colspan=&amp;quot;2&amp;quot; | [[ハーマイオニー・グレンジャー]] || [[&lt;span class='searchmatch'&gt;エマ・ワトソン&lt;/span&gt;]] || [[須藤祐実]]&#xA;" size="31224" wordcount="488" timestamp="2014-04-02T09:56:07Z" />
    </search>
  </query>
</api>
```

## 記事をランダムに取得

### パラメータ

`list=random`を用いる。

| パラメータ | 意味 | 値 |
|:---|:---|:---|
| rnlimit | 結果数の上限 | （整数） |
| rnnamespace | 記事の名前空間 | 0（通常の記事）, 1（ノート）, ... |
| rnredirect | リダイレクト記事のみを表示 | （なし） |


### 例

ランダムに10件の通常記事を取得

<http://ja.wikipedia.org/w/api.php?format=xml&action=query&list=random&rnnamespace=0&rnlimit=10>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<api>
  <query>
    <random>
      <page id="1928065" ns="0" title="小柴大始" />
      <page id="240784" ns="0" title="ジェイムス・ミッシェル" />
      ...
      <page id="350128" ns="0" title="OH!相撲" />
    </random>
  </query>
</api>
```