元セブ島在住のエンジニアの僕「Tommy」が、プログラミング・英語・セブ事情を発信するブログ

Tommy's blog

【Python】Confluenceを操作する方法【→業務効率UP】

9月 26, 2019

プログラム女子
会社でConfluenceが導入されたんだけど、Pythonで業務効率を改善できるかことはあるかな...
ConfluenceのREST APIを使えば、Confluenceのページの作成や、ページコンテンツの読み取ったりすることができるよ。<br>今回はConfluenceの操作方法について説明するね。
Tommy

この記事で分かること

  • Confluenceを操作する仕組みが分かる
  • PythonプログラムでConfluenceを操作する方法が分かる

PythonでConfluenceを操作する概要

今回の記事では、Confluence REST APIを利用して、Confluenceページの作成や、ページコンテンツの読み取りなど、ConfluenceをPythonで操作する方法を解説します。PythonでConfluenceを使う為には、PythonのコードからConfluenceのREST APIを呼べば終了です。

しかし、ConfluenceのRESTAPIではGETとPOSTで呼ぶことできる機能APIが異なります。なので、やりたい処理に合わせてGETリクエストとPOSTリクエストを呼び分ける必要があります。下の表のように、Confluenceを操作する機能はそれぞれGETとPOSTという具合に呼び出し方が決まっています。

GET or POST API名 機能
POST Create space スペースを作る
GET Get user ユーザー情報を取得する
POST Create content ページを作成する
GET Get content by ID ページ情報を取得する

PythonでConfluenceを操作する前提の環境

Confluenceを操作する前提の環境は、下の記事で説明している私の環境と同じ環境で確認しています。

レンタルサーバなどのLinuxサーバを使っている場合は、下の記事でプログラミングする環境の作り方を説明しています。もし、まだプログラムする環境ができていない方は、先にこちらの記事を読んで、プログラミングできる環境をつくることをおすすめします。

PythonでConfluenceを操作するサンプルプログラム

ここでは、実際にPythonでConfluenceを使う為サンプルプログラムを説明します。ユーザーの環境毎に設定が変わる部分は、個人で設定する必要がありますので、その点は注意してください。サンプルプログラムは次の順番で説明します。

  1. Confluenceを操作する為に必要なライブラリ
  2. Confluence REST APIへのGETメッセージ
  3. Confluence REST APIへのPOSTメッセージ
  4. 作成ページコンテンツの作成
  5. POSTリクエストの呼び出し

1.Confluenceを操作する為に必要なライブラリ

PythonでConfluenceを使う為に、私は下記の3つのライブラリを準備しました。その他のやり方もありますが、ここでは下記3つのPythonライブラリを用いた方法で解説します。

import base64
import urllib2
import json

  1. ライブラリ「base64」をインポートする
  2. ライブラリ「urllib2」をインポートする
  3. ライブラリ「json」をインポートする

2.Confluence REST APIへのGETメッセージ

こちらはConfluence REST APIにGETリクエストを送信する方法を説明しています。基本的な処理の流れは、base64でエンコードしたヘッダー情報にして、 urllib2のRequestメソッドを呼ぶだけです。関数「get_input_param」はConfluenceユーザー名とパスワードをユーザーに問い合わせ、取得するメソッドです。ユーザー名とパスワードの取得方法は、お持ちの環境に合わせて選んでください。

def GetConfluenceRespGET(url):

    user,passwd,input_result = get_input_param()
    page = ''

    if input_result is "OK":
        headers = {
            'Content-Type': 'application/json'
        }

        auth = user + ':' + passwd
        auth_b64 = base64.encodestring(auth.encode("utf8")).decode("ascii")[:-1]
        # need to remove '\n' by [:-1]
        headers['Authorization'] = 'Basic ' + auth_b64

        resp = ''
        req = urllib2.Request(url=url, headers=headers)

        res = urllib2.urlopen(req)
        resp = res.read().decode("utf-8")
        res.close()

        page = json.loads(resp)
    else:
        print('Wrong confluence account')

    return page

  1. 関数「GetConfluenceRespGET」を定義宣言する。
  2. 「user」「passwd」「input_result」 の3つの変数を関数「 get_input_param」からの戻り値で初期化する。
  3. 変数「input_result 」の値が文字列「OK」の場合は次の処理を実施する。
    1. 変数「headers」 を定義する。
    2. 変数「auth」を 変数「user」と文字「:」と変数「passwd」を連結させた文字列で初期化する。
    3. 変数「auth_b64」をライブラリ「base64」の関数「encodestring」の戻り値で初期化する
    4. 「headers」の要素「Authorization'」を 文字列「Basic」 と変数「 auth_b64」の値を連結させた要素で初期化する。
    5. 変数「body_data」をライブラリ「json」の関数「dumps」からの戻り値で初期化する。
    6. 変数「resp」を空の文字列で初期化する。
    7. 変数「req」をライブラリ「urllib2」の関数「Request」からの戻りで初期化する。
    8. 変数「res」 をライブラリ「urllib2」の関数「urlopen」からの戻りで初期化する。
    9. 変数「resp」をオブジェクト「res」の関数「read」からの戻り値で初期化する。
    10. 変数「page」をライブラリ「json」の関数「loads」からの戻り値で初期化する。
  4. 変数「input_result 」の値が文字列「OK」以外の場合は次の処理を実施する。
    1. 文字列「Wrong confluence account」を表示する。
  5. 変数「page」の値を戻り値として返却する。

3.Confluence REST APIへのPOSTメッセージ

こちらはConfluence REST APIにPOSTリクエストを送信する方法です。上記と同様に、base64でエンコードしたヘッダー情報にして、 urllib2のRequestメソッドを呼ぶだけです。

関数「get_input_param」でConfluenceユーザー名とパスワードを取得していますが、これはそれぞれの環境に合わせて取得してください。

def GetConfluenceRespPOST(url, obj):
    user,passwd,input_result = get_input_param()
    page = ''
    if input_result is "OK":
        headers = {
            'Content-Type': 'application/json'
        }

        auth = user + ':' + passwd
        auth_b64 = base64.encodestring(auth.encode("utf8")).decode("ascii")[:-1]
        # [:-1]で'\n'を削除する必要がある
        headers['Authorization'] = 'Basic ' + auth_b64

        body_data = json.dumps(obj).encode("utf-8")

        resp = ''
        req = urllib2.Request(url=url, data=body_data,headers=headers)
        res = urllib2.urlopen(req)
        resp = res.read().decode("utf-8")
        page = json.loads(resp)
    else:
        print('Wrong confluence account')

    return page

  1. 関数「GetConfluenceRespPOST」を定義宣言する。
  2. 「user」「passwd」「input_result」 の3つの変数を関数「 get_input_param」からの戻り値で初期化する。
  3. 変数「input_result 」の値が文字列「OK」の場合は次の処理を実施する。
    1. 変数「headers」 を定義する。
    2. 変数「auth」を 変数「user」と文字「:」と変数「passwd」を連結させた文字列で初期化する。
    3. 変数「auth_b64」をライブラリ「base64」の関数「encodestring」の戻り値で初期化する
    4. 「headers」の要素「Authorization'」を 文字列「Basic」 と変数「 auth_b64」の値を連結させた要素で初期化する。
    5. 変数「body_data」をライブラリ「json」の関数「dumps」からの戻り値で初期化する。
    6. 変数「resp」を空の文字列で初期化する。
    7. 変数「req」をライブラリ「urllib2」の関数「Request」からの戻りで初期化する。
    8. 変数「res」をライブラリ「urllib2」の関数「urlopen」からの戻りで初期化する。
    9. 変数「resp」をオブジェクト「res」の関数「read」からの戻り値で初期化する。
    10. 変数「page」をライブラリ「json」の関数「loads」からの戻りtで初期化する。
  4. 変数「input_result 」の値が文字列「OK」以外の場合は次の処理を実施する。
    1. 文字列「Wrong confluence account」を表示する。
  5. 変数「page」の値を戻り値として返却する。

4.作成ページコンテンツの作成

次に関数「create_confluence_page_data」を定義します。ConflueneページのコンテンツをpayloadというJSON形式で返却する関数になります「payload」 に必要な値を入れて、これから作成するページの情報を作成します。

def create_confluence_page_data(title,ancestors_id,space,page_contents):

    payload = {
        "type":"page",
        "title":title,
        "ancestors":[{"id":ancestors_id}],
        "space":{"key":space},
        "body":{
        "storage":{
            "value" : page_contents,
            "representation":"storage"
            }
        }
    }
    return payload

  1. 変数「payload」を定義する。
  2. 変数「payload」を戻り値として返却する。

5.POSTリクエストの呼び出し

こちらはメインからの上記で定義した、Confluenceページコンテンツを作成し、POSTリクエストによってConfluence REST APIにページ作成依頼する一連の流れになります。関数「get_confluence_baseurl」にてConfluenceのURLを取得していますが、これはそれぞれの環境に合わせて入力してください。

関数「create_confluence_page_data」のそれぞれの引数の意味は下記の通りです。

  • 「title」はページのタイトルです。
  • 「ancestors_id」は、親のページが存在する場合、その親ページのIDです。
  • 「space」はスペース名です。
  • 「page_contents」は作成するHTML形式のページデータです。
if __name__ == '__main__':
	url = get_confluence_baseurl()
	obj = create_confluence_page_data(title=title,ancestors_id=ancestors_id,space=space,page_contents=page_contents)
    res = GetConfluenceRespPOST(url=url,obj=obj)

  1. 変数「url」を関数「get_confluence_baseurl」からの戻り値で初期化する。
  2. 変数「obj」を関数「create_confluence_page_data」戻り値で初期化する。
  3. 変数「res」を関数「GetConfluenceRespPOST」の戻り値で初期化する。

Pythonで業務効率化するその他の方法

今回の記事では、ConfluenceRESTAPIを利用して、Confluenceページの作成や、ページコンテンツの読み取りなど、ConfluenceをPythonで操作する方法を解説しました。

Confluence以外にも、Pythonには、業務効率化できる手段がたくさんあります。

下記の記事に、Confluence以外に、普段オフィス環境で使われるツールを使って業務効率化できる方法をまとめていますので、合わせて読んでください。