프로그램 (PHP,Python)

Atlassian API 활용한 Confluence WIKI 문서 작업 자동화

날으는물고기 2024. 9. 9. 00:56

Open API Documentation for Confluence

Confluence WIKI에 있는 표 형태의 내용 중 특정 필드의 값을 업데이트하는 작업을 n8n을 통해 자동화하려면 다음 단계를 따라야 합니다. 여기서는 Confluence API를 사용하여 표 데이터를 가져오고 업데이트하는 방법에 대한 설명입니다.

사전 준비

  1. Confluence API Token 생성
  2. n8n 설치 및 설정
    • n8n을 설치하고 실행합니다. (자세한 설치 방법은 n8n 공식 문서를 참고하세요.)

n8n Workflow 작성

  1. HTTP Request Node 추가 (Confluence에서 페이지 데이터 가져오기)
    • HTTP Request 노드를 추가하고 설정을 다음과 같이 합니다.
      • Method: GET
      • URL: https://your-confluence-domain.atlassian.net/wiki/rest/api/content/{pageId}?expand=body.storage
      • Authentication: Basic Auth (API 토큰 사용)
      • Headers:
        • Authorization: Bearer <API_Token>
        • Content-Type: application/json
      • Response Format: JSON
  2. Data Transformation Node 추가 (표 데이터 분석)
    • HTTP Request 노드의 출력을 받아 표 데이터를 분석하고 필요한 필드를 업데이트합니다.
    • Function 노드를 추가하고 JavaScript 코드를 작성하여 데이터를 변환합니다.
      const data = items[0].json.body.storage.value; // HTML 데이터 가져오기
      // 표 데이터 파싱 및 특정 필드 업데이트 로직 작성
      // 예: table row 및 cell 업데이트
      return [{ json: { updatedTable: modifiedHtmlTable } }];
  3. HTTP Request Node 추가 (Confluence 페이지 업데이트)
    • 변환된 데이터를 Confluence 페이지에 업데이트하기 위해 HTTP Request 노드를 추가하고 설정을 다음과 같이 합니다.
      • Method: PUT
      • URL: https://your-confluence-domain.atlassian.net/wiki/rest/api/content/{pageId}
      • Authentication: Basic Auth (API 토큰 사용)
      • Headers:
        • Authorization: Bearer <API_Token>
        • Content-Type: application/json
      • Body: JSON
        {
          "version": {
            "number": newVersionNumber
          },
          "title": "Page Title",
          "type": "page",
          "body": {
            "storage": {
              "value": updatedTable, // 업데이트된 HTML 테이블
              "representation": "storage"
            }
          }
        }

이 워크플로우는 Confluence 페이지에서 데이터를 가져와 특정 필드를 업데이트하고 다시 Confluence에 업데이트된 데이터를 저장합니다. 각 노드의 설정을 실제 Confluence 계정과 페이지 ID에 맞게 조정하면 됩니다. Confluence WIKI 콘텐츠를 HTML로 가져오면 작업이 어려울 수 있으므로, 마크다운(Markup)으로 변환 후 업데이트하는 방법을 사용하는 것이 더 효과적일 수 있습니다. 이를 위해 Confluence API와 n8n을 활용하여 다음과 같이 자동화할 수 있습니다.

  1. HTTP Request Node 추가 (Confluence에서 페이지 데이터 가져오기)
    • HTTP Request 노드를 추가하고 설정을 다음과 같이 합니다.
      • Method: GET
      • URL: https://your-confluence-domain.atlassian.net/wiki/rest/api/content/{pageId}?expand=body.storage
      • Authentication: Basic Auth (API 토큰 사용)
      • Headers:
        • Authorization: Bearer <API_Token>
        • Content-Type: application/json
      • Response Format: JSON
  2. Function Node 추가 (HTML을 마크다운으로 변환)
    • HTML 데이터를 가져온 후 마크다운으로 변환합니다. 이를 위해 turndown 라이브러리를 사용할 수 있습니다.
    • Function 노드를 추가하고 JavaScript 코드를 작성하여 데이터를 변환합니다.
      const TurndownService = require('turndown');
      const turndownService = new TurndownService();
      const htmlContent = items[0].json.body.storage.value;
      const markdownContent = turndownService.turndown(htmlContent);
      return [{ json: { markdownContent } }];
  3. Function Node 추가 (마크다운 데이터 변환 및 업데이트)
    • 마크다운 데이터를 변환하여 필요한 필드를 업데이트합니다.
    • Function 노드를 추가하고 JavaScript 코드를 작성하여 데이터를 변환합니다.
      const markdownContent = items[0].json.markdownContent; // 예: 특정 필드를 업데이트하는 로직 작성
      const updatedMarkdownContent = markdownContent.replace(/oldValue/g, 'newValue');
      return [{ json: { updatedMarkdownContent } }];
  4. Function Node 추가 (마크다운을 HTML로 다시 변환)
    • 업데이트된 마크다운 데이터를 HTML로 변환합니다.
    • Function 노드를 추가하고 JavaScript 코드를 작성하여 데이터를 변환합니다.
      const markdown = require('markdown-it')();
      const updatedMarkdownContent = items[0].json.updatedMarkdownContent;
      const updatedHtmlContent = markdown.render(updatedMarkdownContent);
      return [{ json: { updatedHtmlContent } }];
  5. HTTP Request Node 추가 (Confluence 페이지 업데이트)
    • 변환된 데이터를 Confluence 페이지에 업데이트하기 위해 HTTP Request 노드를 추가하고 설정을 다음과 같이 합니다.
      • Method: PUT
      • URL: https://your-confluence-domain.atlassian.net/wiki/rest/api/content/{pageId}
      • Authentication: Basic Auth (API 토큰 사용)
      • Headers:
        • Authorization: Bearer <API_Token>
        • Content-Type: application/json
      • Body: JSON
        {
          "version": {
            "number": newVersionNumber
          },
          "title": "Page Title",
          "type": "page",
          "body": {
            "storage": {
              "value": updatedHtmlContent, // 업데이트된 HTML 콘텐츠
              "representation": "storage"
            }
          }
        }

Workflow 예제

[
  {
    "nodes": [
      {
        "parameters": {
          "requestMethod": "GET",
          "url": "https://your-confluence-domain.atlassian.net/wiki/rest/api/content/{pageId}?expand=body.storage",
          "responseFormat": "json",
          "headerParametersUi": {
            "parameter": [
              {
                "name": "Authorization",
                "value": "Bearer <API_Token>"
              },
              {
                "name": "Content-Type",
                "value": "application/json"
              }
            ]
          },
          "options": {}
        },
        "name": "Get Page Data",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 1,
        "position": [
          250,
          300
        ]
      },
      {
        "parameters": {
          "functionCode": "const TurndownService = require('turndown');\nconst turndownService = new TurndownService();\n\nconst htmlContent = items[0].json.body.storage.value;\nconst markdownContent = turndownService.turndown(htmlContent);\n\nreturn [{ json: { markdownContent } }];"
        },
        "name": "Convert HTML to Markdown",
        "type": "n8n-nodes-base.function",
        "typeVersion": 1,
        "position": [
          450,
          300
        ]
      },
      {
        "parameters": {
          "functionCode": "const markdownContent = items[0].json.markdownContent;\n\n// 예: 특정 필드를 업데이트하는 로직 작성\nconst updatedMarkdownContent = markdownContent.replace(/oldValue/g, 'newValue');\n\nreturn [{ json: { updatedMarkdownContent } }];"
        },
        "name": "Update Markdown Content",
        "type": "n8n-nodes-base.function",
        "typeVersion": 1,
        "position": [
          650,
          300
        ]
      },
      {
        "parameters": {
          "functionCode": "const markdown = require('markdown-it')();\nconst updatedMarkdownContent = items[0].json.updatedMarkdownContent;\nconst updatedHtmlContent = markdown.render(updatedMarkdownContent);\n\nreturn [{ json: { updatedHtmlContent } }];"
        },
        "name": "Convert Markdown to HTML",
        "type": "n8n-nodes-base.function",
        "typeVersion": 1,
        "position": [
          850,
          300
        ]
      },
      {
        "parameters": {
          "requestMethod": "PUT",
          "url": "https://your-confluence-domain.atlassian.net/wiki/rest/api/content/{pageId}",
          "responseFormat": "json",
          "headerParametersUi": {
            "parameter": [
              {
                "name": "Authorization",
                "value": "Bearer <API_Token>"
              },
              {
                "name": "Content-Type",
                "value": "application/json"
              }
            ]
          },
          "options": {},
          "bodyParametersUi": {
            "parameter": [
              {
                "name": "version",
                "value": {
                  "number": newVersionNumber
                }
              },
              {
                "name": "title",
                "value": "Page Title"
              },
              {
                "name": "type",
                "value": "page"
              },
              {
                "name": "body",
                "value": {
                  "storage": {
                    "value": updatedHtmlContent,
                    "representation": "storage"
                  }
                }
              }
            ]
          }
        },
        "name": "Update Page Data",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 1,
        "position": [
          1050,
          300
        ]
      }
    ],
    "connections": {
      "Get Page Data": {
        "main": [
          [
            {
              "node": "Convert HTML to Markdown",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Convert HTML to Markdown": {
        "main": [
          [
            {
              "node": "Update Markdown Content",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Update Markdown Content": {
        "main": [
          [
            {
              "node": "Convert Markdown to HTML",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Convert Markdown to HTML": {
        "main": [
          [
            {
              "node": "Update Page Data",
              "type": "main",
              "index": 0
            }
          ]
        ]
      }
    }
  }
]

이 워크플로우는 Confluence 페이지에서 데이터를 가져와 마크다운으로 변환한 후, 특정 필드를 업데이트하고 다시 HTML로 변환하여 Confluence에 저장합니다. 각 노드의 설정을 실제 Confluence 계정과 페이지 ID에 맞게 조정하면 됩니다.

 

Confluence API를 통해 검색을 수행하려면 cql 쿼리를 사용하여 검색할 수 있습니다. 아래는 n8n HTTP Request 노드에서 Confluence API를 통해 특정 스페이스에서 특정 키워드를 검색하여 페이지 목록을 가져오는 설정 방법입니다.

단계 1: Confluence API 설정

  1. API 인증 정보 준비
    • Confluence의 REST API를 사용하기 위해 API Token 또는 사용자 이름과 비밀번호가 필요합니다.
    • Confluence Cloud에서는 이메일과 API Token을 사용합니다.
  2. API URL 구성
    • 기본 URL은 다음과 같습니다.
      • https://<your-domain>.atlassian.net/wiki/rest/api/content/search
    • 특정 스페이스에서 키워드로 검색하려면 다음과 같은 cql 쿼리 파라미터를 사용합니다.
      • ?cql=space=<space-key> AND (title~"<keyword>" OR text~"<keyword>")

단계 2: n8n에서 HTTP Request 노드 설정

  1. HTTP Request 노드 추가
    • n8n에서 새 워크플로우를 생성하고 HTTP Request 노드를 추가합니다.
  2. 노드 구성
    • Method: GET
    • URL: https://<your-domain>.atlassian.net/wiki/rest/api/content/search?cql=space="<space-key>" AND (title~"<keyword>" OR text~"<keyword>")
    • Authentication: Basic Auth
      • Username: your-email
      • Password: your-api-token
    • Headers:
      • Content-Type: application/json
      • Accept: application/json
  3. Example
    {
      "nodes": [
        {
          "parameters": {
            "authentication": "basicAuth",
            "requestMethod": "GET",
            "url": "https://<your-domain>.atlassian.net/wiki/rest/api/content/search?cql=space=\"<space-key>\" AND (title~\"<keyword>\" OR text~\"<keyword>\")",
            "jsonParameters": true,
            "responseFormat": "json",
            "headerParametersJson": {
              "Content-Type": "application/json",
              "Accept": "application/json"
            },
            "queryParametersJson": {},
            "sendBinaryData": false
          },
          "name": "Confluence Search",
          "type": "n8n-nodes-base.httpRequest",
          "typeVersion": 1,
          "position": [
            450,
            250
          ],
          "credentials": {
            "httpBasicAuth": {
              "id": "1",
              "name": "Confluence Basic Auth"
            }
          }
        }
      ],
      "connections": {}
    }

단계 3: 워크플로우 테스트 및 실행

  1. 워크플로우 테스트
    • 설정이 완료되면 워크플로우를 실행하여 결과를 확인합니다.
    • HTTP Request 노드의 출력에서 Confluence 페이지 목록을 확인할 수 있습니다.
  2. 후속 작업 설정
    • 필요에 따라 추가 노드를 연결하여 검색된 페이지 목록을 처리하거나 다른 작업을 수행할 수 있습니다.

이 설정을 통해 n8n을 사용하여 Confluence API에서 특정 스페이스와 키워드로 페이지를 검색하는 HTTP Request 노드를 구성할 수 있습니다.

728x90