Atlassian のドキュメンテーション管理ツールである Confluence は、REST API を使って様々な操作を自動化することができます。
各言語用にラッパーライブラリが公開されているので、通常は REST API を直接呼び出す必要はありません。
ここでは、Atlassian Python API (atlassian-python-api
) を使って、Python から Confluence の情報を取得してみます。
atlassian-python-api のインストール
pip
コマンドで atlassian-python-api
パッケージをインストールします。
システムを汚さないように、venv 環境を作成してインストールする のがおすすめです。
ついでに、python-dotenv
を入れて、.env
ファイル でアクセストークンを設定できるようにしておきます。
アクセストークンの発行
API アクセスのための認証方法はいくつかありますが、今回は、Confluence 上で生成できるパーソナルアクセストークンを使うことにします。 Confluece 画面から次のようにして発行できます。
- Confluence 画面右上の
ユーザーアイコン
をクリック →設定
を選択 個人用アクセストークン
を選択し、トークンの作成
をクリック
.env
ファイルを作成し、Confluence のサーバーアドレスと、上記のアクセストークンを記述しておきます。
このファイルは Git にコミットしないように注意してください。
OS の環境変数に設定するのでも OK です。
config モジュールの作成
Confluence のサーバーアドレスとトークンを参照するための config
モジュールを作成しておきます。
こういった設定を別モジュール化しておくことで、メインロジックをシンプルに記述できます。
Confluence クラスを使って情報を取得する
次のように生成した atlassian.Confluence
インスタンスを使って、Confluence サーバーから様々な情報を取得することができます。
from atlassian import Confluence
import config
confluence = Confluence(url=config.CONFLUENCE_URL, token=config.CONFLUENCE_TOKEN)
スペースの一覧を取得する
res = confluence.get_all_spaces(start=0, limit=10)
for s in res["results"]:
print("{}, {}, {}".format(s["id"], s["key"], s["name"]))
ページの内容を取得する(ID 指定)
page_id = "1830728929"
res = confluence.get_page_by_id(
page_id=page_id,
expand="space,body.view" # スペース情報やページの本文を取得
)
print(res["space"]["key"])
print(res["id"])
print(res["title"])
print(res["body"]["view"]["value"][:100]) # 本文 (HTML) の先頭 100 文字
ページの本文部分の HTML を取得するには、expand
引数で body.view
を指定しておく必要があります。
body.view
の代わりに body.storage
を使うと、Confluence 独自の形式(HTML + 独自タグ)で本文を取得できます。
ページ内のテーブルの内容を取得する
# import json
page_id = "6349290133"
res = confluence.get_tables_from_page(page_id)
tables = json.loads(res)
print(tables["tables_content"][0])
これはちょっと面白い機能で、ページ内に記述したテーブルの内容を配列データとして取得できます。
Confluence のページを簡易的なデータベースとして使うことができます。
内部的に HTML/XML パーサーを利用するらしく、pip install lxml
が必要です。
その他の API
atlassian
モジュールには他にもいろいろな API がありますが、網羅的なドキュメントはないようです。
下記のモジュールドキュメントや、GitHub 上のサンプルコード、Atlassian の REST API ドキュメントなどを参考にして試行錯誤する必要があります。
特に、各 API のレスポンス内容は、REST API ドキュメントを見ないと分からなかったりします。