Иногда может возникнуть необходимость автоматизировать некоторые действия в Confluence или выполнить какое-то действие несколько раз и т.д. Для этого можно использовать REST API Confluence вместе с языком программирования и API для взаимодействия через HTTP.
Предыдущий пример с использованием Groovy — https://dev.to/andriimaliuta/how-to-update-several-pages-in-confluence-via-rest-api-k6c.
В этом примере мы будем использовать JavaScript и библиотеку axios (вам не нужен сам axios и вы можете использовать основной FETCH, если хотите — это просто один из способов) для инициирования конечных точек Confluence REST:
- getPage.js
- getChildren.js
- getDescendants.js
- createComment.js
- createPage.js
- deleteLabel.js
- getPageLabels.js
Файл данных
Сначала мы создадим файл data.js для хранения констант с данными:
const dotenv = require('dotenv');
dotenv.config();
const username = process.env.username;
const password = process.env.password;
const CONF_URL = process.env.CONF_URL;
module.exports = {
authData: Buffer.from(`${username}:${password}`).toString('base64'),
CONF_URL
};
Мы создаем токен Basic Auth Base64 из имени пользователя и пароля.
Получение информации о странице
Запрос:
GET /rest/content
CONTENT — это объект, который представляет:
- страница
- комментарий
- блогпост
Пример файла getPage.js:
const axios = require('axios');
const https = require('https');
const { authData, CONF_URL } = require('./data');
module.exports = async function getPage(pageId) {
console.log('>>> Initiating REST request...');
return axios.get(`${CONF_URL}/rest/api/content/${pageId}`, {
headers: {
Authorization: `Basic ${authData}`,
},
httpsAgent: new https.Agent({
rejectUnauthorized: false,
}),
});
};
getChildren.js
Запрос:
GET ${CONF_URL}/rest/api/content/${pageId}/child/page
const axios = require("axios");
const https = require("https");
const { authData, CONF_URL } = require("./data");
module.exports = async function getPageChildren(pageId) {
console.log(" Initiating REST request...");
return await axios.get(`${CONF_URL}/rest/api/content/${pageId}/child/page`, {
headers: {
Authorization: `Basic ${authData}`,
},
httpsAgent: new https.Agent({
rejectUnauthorized: false,
}),
});
};
getDescendants.js
const axios = require("axios");
const https = require("https");
const { authData, CONF_URL } = require("./data");
module.exports = async function getPageChildren(pageId) {
console.log(">>> Initiating REST request...");
return await axios.get(
`${CONF_URL}/rest/api/search?cql=type+=+"page"+and+ancestor+%3D+"${pageId}"`,
{
headers: {
Authorization: `Basic ${authData}`,
},
httpsAgent: new https.Agent({
rejectUnauthorized: false,
}),
}
);
};
Создать страницу (запись в блоге / комментарий)
createPage.js
const axios = require('axios');
const https = require('https');
const { authData, CONF_URL } = require('./data');
module.exports = async function createPage(space, title, body, parent_id) {
console.log(' Initiating REST request...');
data = {
type: 'page',
title: title,
space: { key: space },
body: {
storage: {
value: body,
representation: 'storage',
},
},
ancestors: [{ id: parent_id }],
};
return await axios.post(`${CONF_URL}/rest/api/content`, {
headers: {
Authorization: `Basic ${authData}`,
'Content-Type': 'application/json',
},
httpsAgent: new https.Agent({
rejectUnauthorized: false,
}),
data: data,
});
};
Выполнение запросов
Теперь мы кратим файл index.js (название, конечно, на ваше усмотрение :)) и выполняем необходимые действия. Здесь мы будем CONSOLE.LOG результат запросов, но, конечно, вы можете и дальше корректировать, комбинировать и расширять код, чтобы сделать то, что вам нужно.
const getPage = require('./getPage');
const getChildren = require('./getChildren');
const getDescendants = require('./getDescendants');
const createPage = require('./createPage');
const getPageLabels = require('./getPageLabels');
const createComment = require('./createComment');
const PAGE_ID = 123456; // specify the PAGE ID
async function init() {
// GET PAGE
getPage(PAGE_ID)
.then((res) => console.log(res.data))
.catch((err) => console.log(err));
// GET all descendant pages of the root one
getDescendants(PAGE_ID).then((res) => console.log(res.data));
// ====== Create Page =====
const SPACE_KEY = "TEST";
createPage(SPACE_KEY, 'MY PAGE TITLE', 'this is body', PAGE_ID).then((res) =>
console.log(res.data)
);
// ====== Create comment ======
createComment('TEST', 'test title', 'rest comment!', 1000, PAGE_ID).then(
(res) => console.log(res.data)
);
// labels
const PAGE_ID = 12345;
getPageLabels(PAGE_ID).then((res) => {
for (label of res.data.results) {
deleteLabel(PAGE_ID, label.name);
}
});
deleteLabel(labelId, "error-template").then((res) => console.log(res.data));
}
// ========= initiate the code !!
init();
Вот и все. Конечно, это наглядные примеры, но главное — понять сами принципы и в дальнейшем выполнять практически любые необходимые действия через REST API, что облегчит вам работу с Confluence 🙂
Пожалуйста, дайте мне знать, если это было полезно.
Спасибо!