likes
comments
collection
share

NodeJs 获取 Confluence 信息

作者站长头像
站长
· 阅读数 16

前言

之前我们写了一篇 - Jira 任务同步到 Microsoft Teams 的文章。今天我们来讲讲获取 Confluence 的信息。获取信息后将其同步到 Microsoft Teams 的操作请参考 发送数据到 Microsoft Teams 的 Channel 上

本文操作的 Node 版本是 v12.20.2npm 版本是 6.14.11,使用了 koa 库,且在 mac m1 系统上运行。下面我们一步步来操作~

NodeJs 获取 Confluence 信息

配置 Confluence 信息

在进行接口请求之前,我们需要用到下面的这些配置信息。

{
  "confluence": {
    "username": "your_username",
    "password": "your_password",
    "hostname": "https://your_domain.com"
  }
}

我们获取这些配置,其中用用户名和密码用来生成 tokenhostname 表明我们将连接的服务地址。

我们结合 config 使用:

import config from 'config'

const confluence_token = Buffer.from(`${ config.confluence.username }:${ config.confluence.password }`).toString('base64')

或者,我们可以结合 dotenv 使用:

const dotenv = require('dotenv');
dotenv.config();
const username = process.env.username;
const password = process.env.password;

const confluence_token = Buffer.from(`${username}:${password}`).toString('base64');

NodeJs 获取 Confluence 信息

连接服务

这里使用 axios 进行服务连接:

const axios = require('axios'); // 网络请求库

axios.get(`${ config.confulence.hostname }/rest/api/content/search`, {
  headers: {
    Authorization: `Basic ${ confluence_token }`
  }
})

上面的案例是以 get 接口为例,引入了 axios 网络请求库。并且,在请求头上添加请求的凭证,即可访问 confluence 服务。

下面我们用例子讲讲如何调用。

调用示范

我们假设有下面两个简单的场景:

1. 获取 Confluence 上指定人员创建,且类型是文档,指定创建时间范围的记录

class Demo {
  // 类静态方法
  static async getPersonalCreatedConfluence(creator, timeRange) {
    return await axios.get(`${config.confluence.hostname}/rest/api/content/search`, {
      params: {
        // cql
        cql: `creator = ${ creator } and type = page and created >= ${ timeRange[0] } and created <= ${ timeRange[1] }`,
        limit: 100,
        expand: 'history',
      },
      headers: {
        Authorization: `Basic ${confluence_token}`
      }
    })
  }
}
// 调用
Demo.getPersonalCreatedConfluence('jimmy', ['2023-03-15', '2023-03-16'])

上面采用了 cqlConfluence Query Language 查询方式,我们指定 creatortypetimeRange。我们还限制了一次查询出来一页展示 100 条数据,并将操作的历史查询出来。更多相关 CQL 的内容,可以点击 Adcanced Searching using CQL

2. 获取 Confluence 上指定人员更新,且类型是文档,指定修改时间范围的记录

class Demo {
  static async getPersonalUpdateConfluence(contributor, timeRange) {
    return await axios.get(`${config.confluence.hostname}/rest/api/content/search`, {
      params: {
        // cql
        cql: `contributor = ${ contributor } and type = page and lastModified >= ${ timeRange[0] } and lastModified <= ${ timeRange[1] }`,
        limit: 100,
        expand: 'history.lastUpdated',
      },
      headers: {
        Authorization: `Basic ${confluence_token}`
      }
    });
  }
}
//  调用同上
Demo.getPersonalUpdateConfluence('jimmy', ['2023-03-15', '2023-03-16'])

代码跟上面👆的差不多,我们只是更改了 cql 的语句,并且更改了 expand 的值为 history.lastUpdated,因为我们要获取到 lastUpdated 的对象值,默认是不展示该对象的值。

当然,我们判断 jimmy 是否是 contributor 来判断他就是此时更新者的话,是不正确的。比如Jimmy 创建了一个新文本,过了一段时间后,Timmy 更新了文本,这个时候 Jimmy 没有参与进来,所以不应该计算。所以我们得排除:

let confluenceChangeObj = await Demo.getPersonalUpdateConfluence('jimmy', ['2023-03-15', '2023-03-16']);
// 更新的
let tmpConfluenceUpdatedList = [];  
for(let i = 0; i < confluenceChangeObj.results.length; i += 1) {
  let item = confluenceChangeObj.results[i];
  // 更新的用户是否是当前用户
  if(item.history.lastUpdated.by.username == current_username) {
    // do something
  }
} 

更多的查询和其他操作,请前往 CQL field reference

参考

Thanks for reading.