confluence_utils.py•3.82 kB
import os
from atlassian import Confluence
import urllib
from dotenv import load_dotenv
class ConfluenceUtils:
def __init__(self):
load_dotenv()
self.token = os.environ.get("CONFLUENCE_TOKEN")
self.url = os.environ.get("CONFLUENCE_URL")
self.username = os.environ.get("CONFLUENCE_USERNAME")
self.password = os.environ.get("CONFLUENCE_PASSWORD")
self.headers = {
"Authorization": "Bearer " + self.token,
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',
'sec-ch-ua-platform': 'macOS',
'Referer': '', # 这里看起来是一个错误,Referer 头部应该是一个完整的 URL,这里留空
'DNT': '1',
'sec-ch-ua-mobile': '?0',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
'content-type': 'application/json'
}
self.page_url = urllib.parse.urljoin(
self.url, "pages/viewpage.action?pageId={page_id}")
self.confluence = Confluence(
url=self.url,
token=self.token,
cloud=False
)
def search_by_key(self, key, limit=10):
"""
搜索 Confluence 页面(标题和内容)
:param key: 搜索关键字
:param limit: 返回结果数量限制
:return: 搜索结果列表,每个结果包含页面基本信息
"""
# 使用 CQL 搜索标题和内容
cql = f'text ~ "{key}" OR title ~ "{key}"'
results = self.confluence.cql(cql, limit=limit)
if not results or 'results' not in results:
return []
# 格式化返回结果
formatted_results = []
for result in results['results']:
formatted_results.append({
'id': result.get('content', {}).get('id'),
'title': result.get('content', {}).get('title'),
'type': result.get('content', {}).get('type'),
'url': self.page_url.format(page_id=result.get('content', {}).get('id')),
'excerpt': result.get('excerpt', '') # 搜索结果中的匹配内容片段
})
return formatted_results
def get_page_content(self, page_id):
"""
获取页面的完整信息
:param page_id: 页面 ID
:return: 包含页面详细信息的字典
"""
page = self.confluence.get_page_by_id(
page_id,
expand='body.storage,version,space,history,metadata.labels'
)
if not page:
return None
# 构建完整的页面信息
page_info = {
'id': page.get('id'),
'title': page.get('title'),
'space': {
'key': page.get('space', {}).get('key'),
'name': page.get('space', {}).get('name')
},
'version': page.get('version', {}).get('number'),
'content': page.get('body', {}).get('storage', {}).get('value'),
'url': self.page_url.format(page_id=page_id),
'created': {
'date': page.get('history', {}).get('createdDate'),
'by': page.get('history', {}).get('createdBy', {}).get('displayName')
},
'modified': {
'date': page.get('version', {}).get('when'),
'by': page.get('version', {}).get('by', {}).get('displayName')
},
'labels': [label.get('name') for label in page.get('metadata', {}).get('labels', {}).get('results', [])]
}
return page_info
cf = ConfluenceUtils()