8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Confluence ServerのREST APIを用いたページコピー

Last updated at Posted at 2020-04-27

#1行概要
Confluence Serverの"Get content by id"と"Create content"APIを併用してコピーAPIを実現した。

#はじめに
Confluence(以下、コンフル)はAtlassian社が開発している、いわゆる企業向けウィキシステム。
私が4月から勤務している会社でもコンフルを導入しており、主に議事録や週報の作成・共有に使っている。

ふと週報を作成していて、コピー・命名作業が面倒だったので半自動化したいと思い立った。

#Confluence Server REST APIについて
コンフルのAPIはREST形式になっており、パラメータを指定して叩くとJSON形式でデータが返ってくる。
利用中のサービスによってServer REST APIClound REST APIを選択することになるが、弊社の場合は前者になる。
なお、後者の方が圧倒的に用意されているAPIメソッドが多い。(コピーAPIも用意されている。)

#実装
###1. 前準備
まず、ページのコピーと自動命名を行うスクリプトを格納するページを新規に作成する。
コピーをしたいページ、コピーを置きたいページとは異なるので注意。
新規ページ作成後「HTML」マクロを埋め込む。
html.PNG

###2. 処理の記述
次のスクリプトを記述する。

大まかな処理の流れは次の通り。
① Ajaxで**Get content by idAPIを叩く
② コピー元のページBody情報を取得
③ Ajaxをネストし
Create content**APIを叩く
④ コピー元のページBodyをコピー先のページBodyに代入
⑤ おわり

今回はコピー先のページタイトルに、コピー日の日付(yyyymmdd形式)を指定している


<script type="text/javascript">
$(() => {
  $("#btn").click(() => {
    /**
     * コピー元のページID、コピー先のページID、スペースキーの指定
     */
    const SRC_PAGE_ID = "【コピー元のページID】";
    const DST_PAGE_ID = "【コピー先のページID】";
    const SPACE_KEY = "【スペースキー】";

    /**
     * ページタイトルの指定
     */
    const today = new Date();
    const pageTitle = 
      today.getFullYear()
      + ("0"+ (today.getMonth() +1)).slice(-2) 
      + ("0"+ today.getDate()).slice(-2);

    /** 
     * 通信用ヘッダー
     */
    const headers = {
      "Accept": "application/json",
      "content-type": "application/json"
    };

    /**
     * ①② コピー元の情報取得
     */
    $.ajax({
      type: "get",
      url: "https://【ドメイン名】/rest/api/content/" + SRC_PAGE_ID + "?expand=body.view",
      headers: headers,
    })
    .done((result) => {
      console.log(result);
      const srcPageBody = result.body.view.value;
      /**
       * ③④ コピー先の作成
       */
      $.ajax({
        type: "post",
        url: "https://【ドメイン名】/rest/api/content",
        headers: headers,
        data: JSON.stringify({
          "type": "page",
          "ancestors": [{
            "id": DST_PAGE_ID
          }],
          "title": pageTitle,
          "space": {
            "key": SPACE_KEY
          },
          "body": {
            "storage": {
              "value": srcPageBody,
              "representation": "storage"
            }
          }
        }),
        success: () => {
          alert("Done");
        },
        error: () => {
          alert("Error:コピー先の作成に失敗しました。");
        }
      });
    })
    .fail(() => {
      alert("Error:コピー元の取得に失敗しました");
    });			
  })
})
</script>
<button id="btn">ページコピー</button>

###3. パラメータの説明

  • SRC_PAGE_IDDST_PAGE_ID:コピー元、コピー先のページID
  • SPACE_KEY:各スペースの一意IDで「スペース>スペース ディレクトリ」から確認可能

ページIDは、ページURL
https://【ドメイン名】/pages/viewpage.action?pageid=
の末尾9桁の数字

###4. 挙動
まずページ上には、<button id="btn">ページコピー</button>で記述したボタンが配置されており、ボタンを押下するとスクリプトが動く。
コピー元ページの取得とコピー先ページの作成に成功すると、alertメッセージ「Done」と表示される。
done.PNG

ページをリフレッシュすると、元のページツリーから
copymae.PNG
指定したコピー先に新規ページが作成されている。
copyato.PNG
ここでは、SRC_PAGE_IDに「テストタイトルです」、DST_PAGE_IDに「02_COPY」というタイトルのペーのIDを指定しており、
DST_PAGE_IDが親で、コピー日の日付をタイトルにした、SRC_PAGE_IDの中身のページを作成することができた。

###5. 確認
Get content by idで取得した中身を、console.log(result)から開発者メニューで確認することができる。
object.PNG

#おわりに
Confluence ServerのREST APIを利用したコピーメソッドを実現した。
同様に、MoveやCommentといったCloud APIにはあって、Server APIにはないメソッドがまだ多数ある。それらも実現できたらいいね(遠い目)。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?