🐡

wikibaseのapiをつかってみる

2023/07/19に公開

概要

wikibaseのapiをpythonクライアントから使用する機会がありましたので、その備忘録です。

以下のライプラリを使用しました。

https://wikibase-api.readthedocs.io/en/latest/index.html

インストール

以下でインストールします。

!pip install wikibase-api

Read

今回は、以下のwikibaseインスタンスに対して処理を行います。

https://nakamura196.wikibase.cloud/

from wikibase_api import Wikibase

api_url = "https://nakamura196.wikibase.cloud/w/api.php"
wb = Wikibase(api_url=api_url)

r = wb.entity.get("Q1")
print(r)

上記により、Q1に関する情報を取得することができました。

Create

認証情報の取得

アイテムの作成などを行う際には、以下のどちらかの方法で認証を行う必要がありました。

  • Authentication using OAuth
  • Authentication with a user account

後者はBot passwordsを作成する方法で、以下の記事でも作成方法を紹介しています。

https://zenn.dev/nakamura196/articles/95c36ed43626b1

今回は前者の方法を試します。

「Special pages」の「OAuth consumer registration」を選択します。

「Request a token for a new OAuth 1.0a consumer.」と「Request a token for a new OAuth 2.0 client.」の2つの作成方法がありますが、前者を選択します。

項目を埋めていきます。

今回はテストのため、すべての項目にチェックを入れました。

結果、以下のようなページが表示され、認証情報を取得できます。

実行

.envファイルを作成します。

.env
consumer_key=xxx
consumer_secret=yyy
access_token=zzz
access_secret=aaa

load_dotenvを使って認証情報をロードして、設定します。

from wikibase_api import Wikibase
from dotenv import load_dotenv
import os

api_url = "https://nakamura196.wikibase.cloud/w/api.php"

load_dotenv(override=True)

oauth_credentials = {
    "consumer_key": os.getenv("consumer_key"),
    "consumer_secret": os.getenv("consumer_secret"),
    "access_token": os.getenv("access_token"),
    "access_secret": os.getenv("access_secret"),
}

wb = Wikibase(api_url=api_url, oauth_credentials=oauth_credentials)

以下を実行することで、空のアイテムを作成できます。

r = wb.entity.add("item")

例えば、以下のような結果が得られます。

{'entity': {'type': 'item',
  'id': 'Q49',
  'labels': {},
  'descriptions': {},
  'aliases': {},
  'claims': {},
  'sitelinks': {},
  'lastrevid': 128},
 'success': 1}

アイテムの編集等については、別の記事にまとめたいと思います。

削除

削除する際には、Item:Property:を頭につける必要がありました。

wb.entity.remove("Item:Q49")

以下のような結果が得られ、ページが削除されました。

{'warnings': {'main': {'*': 'Unrecognized parameter: summary.'}},
'delete': {'title': 'Item:Q49',
 'reason': 'content was: "", and the only contributor was "[[Special:Contributions/Nakamura|Nakamura]]" ([[User talk:Nakamura|talk]])',
 'logid': 100}}

検索

以下のようなクエリを発行してみます。

wb.entity.search("japan", "en")

以下のような結果が得られました。

{
	"warnings": {
		"main": {
			"*": "Unrecognized parameter: offset."
		}
	},
	"searchinfo": {
		"search": "japan"
	},
	"search": [
		{
			"id": "Q43",
			"title": "Item:Q43",
			"pageid": 84,
			"display": {
				"label": {
					"value": "Japan",
					"language": "en"
				},
				"description": {
					"value": "island country in East Asia",
					"language": "en"
				}
			},
			"repository": "local",
			"url": "https://nakamura196.wikibase.cloud/wiki/Item:Q43",
			"concepturi": "https://nakamura196.wikibase.cloud/entity/Q43",
			"label": "Japan",
			"description": "island country in East Asia",
			"match": {
				"type": "label",
				"language": "en",
				"text": "Japan"
			}
		}
	],
	"success": 1
}

まとめ

wikibaseのapiをpythonクライアントから試してみました。wikibaseと外部システムをAPIを介して接続することで、色々と便利に利用することができそうでした。

他の方の参考になりましたら幸いです。

Discussion