Confluence Server REST API를 사용한 페이지 복사

1행 개요



Confluence Server의 "Get content by id"와 "Create content"API를 병용하여 복사 API를 실현했다.

소개



Confluence(이하, 컨플루)는 Atlassian사가 개발하고 있는, 이른바 기업용 위키 시스템.
내가 4월부터 근무하고 있는 회사에서도 컨플루를 도입하고 있어 주로 의사록이나 주보의 작성·공유에 사용하고 있다.

문득 주보를 작성하고 있어, 복사·명명 작업이 귀찮았으므로 반자동화하고 싶다고 생각했다.

Confluence Server REST API 정보



콘플루의 API는 REST 형식으로 되어 있으며, 파라미터를 지정해 두드리면 JSON 형식으로 데이터가 반환된다.
이용중의 서비스에 의해서 Server REST API나 Clound REST API를 선택하게 되지만, 당사의 경우는 전자가 된다.
덧붙여 후자 쪽이 압도적으로 준비되어 있는 API 메소드가 많다. (복사 API도 제공됩니다.)
  • 0부터 REST API를 살펴 보았습니다.

  • Confluence Server REST API Reference ←이쪽을 사용
  • Confluence Clound REST API Reference

  • 구현



    1. 전 준비



    우선, 페이지의 카피와 자동 명명을 행하는 스크립트를 저장하는 페이지를 새롭게 작성한다.
    카피를 하고 싶은 페이지, 카피를 두고 싶은 페이지와는 다르기 때문에 주의.
    신규 페이지 작성 후 「HTML」매크로를 포함한다.


    2. 처리 설명



    다음 스크립트를 작성합니다.

    거친 처리의 흐름은 다음과 같다.
    ① Ajax에서 Get content by id API를 두드리는
    ② 복사 원본 페이지 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_ID, DST_PAGE_ID : 복사 소스, 복사 대상 페이지 ID

  • SPACE_KEY : 각 공간의 고유 ID로 "공백> 공간 디렉토리"에서 확인 가능

  • 페이지 ID는 페이지 URL
    https://【도메인명】/pages/viewpage.action?pageid=
    의 마지막 9자리 숫자

    4. 거동



    우선 페이지상에는 <button id="btn">ページコピー</button> 로 기술한 버튼이 배치되어 있어 버튼을 누르면 스크립트가 움직인다.
    카피원 페이지의 취득과 카피처 페이지의 작성에 성공하면, alert 메세지 「Done」라고 표시된다.


    페이지를 새로 고치면 원래 페이지 트리에서

    지정된 복사 대상에 새 페이지가 작성되었습니다.

    여기서는 SRC_PAGE_ID에 '테스트 타이틀입니다', DST_PAGE_ID에 '02_COPY'라는 타이틀 페이의 ID를 지정하고,
    DST_PAGE_ID가 부모로, 복사일의 일자를 타이틀로 한, SRC_PAGE_ID의 내용의 페이지를 작성할 수 있었다.

    5. 확인



    Get content by id 에서 취득한 내용은 console.log(result) 에서 개발자 메뉴에서 확인할 수 있다.


    결론



    Confluence Server의 REST API를 이용한 복사 방법을 실현했다.
    마찬가지로 Move나 Comment와 같은 Cloud API에는 있고 Server API에는 없는 메소드가 아직 다수 있다. 그들도 실현할 수 있으면 좋겠다(먼 눈).

    좋은 웹페이지 즐겨찾기