使用 confluence 的日历信息 API

Calendar info using confluence API

我有一个 Confluence 页面,里面有一个日历(请查看下面的照片)。 Calendar 我试图从这个日历中提取信息,比如每天有多少事件。仅此而已。

我使用了来自 Whosebug 的代码,该代码使用 API 读取 Confluence 页面。但是 json 响应不包含有关页面内日历的任何数据。

`import requests
import json
from requests.auth import HTTPDigestAuth
confluence_host = "https://confluence.tools.mycompany.com"
url = confluence_host + '/rest/api/content/'
page_id = "36013799"
page = requests.get(url=url + page_id,
                       params={'expand': 'body.storage'},
                   auth=('my_user', 'my_password') ).json()`

即使我写 html = page['body']['storage']['value'] 并检查它的输出,它也只给出这个:

name="calendar" ac:schema-version="1" ac:macro-id="99a26d73-abaa-45a1-92cc-0edafec567f5">72da4ae5-4888-46dd-9078-0299b51ab815,743a55b4-7b3b-4e00-b102-90d95916de8d

有什么方法可以获取日历信息吗?

谢谢

您正在页面中使用团队日历,团队日历是您页面中的一个插件。从技术上讲,/rest/api/content 只为您提供页面的内容,而不是插件的内容。据我所知,Team Calendar 没有 Public Rest API 正如你在 CONFSERVER-51323 上看到的那样,但你可以从数据库而不是 REST API 因为团队日历已经在您的数据库中创建了几个 AO 表。

我能够通过查看 GET 和 PUT,javascript 插件(rest/calendar-services/1.0/calendar/events.json):

您需要找出您的:subCalendarId='yourID'

urlC = 'https://yourconfluence.com/rest/calendar-services/1.0/calendar/events.json?subCalendarId=40xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&userTimeZoneId=America%2FMexico_City&start=2018-11-28T00%3A00%3A00Z&end=2018-11-28T00%3A00%3A00Z'

r = requests.get(urlC, auth=("myuser", "mypass"), 超时=15)

那将return那个时期的所有记录:

a = r.json()

a.keys()

[u'events', u'success']

一个['success']

正确

类型(a['events'])

列表

len(a['events'])

61

在 PUT 中使用以下数据添加新事件:

数据={ "subCalendarId": "xxx-xxx-xxx", "eventType": "custom", "customEventTypeId": "xxx-xxx-xxx", "what": "My Test", "person": "xxxxxxxxxxxxxxxxx", "startDate":“2018 年 11 月 28 日”, "startTime": "15:00", "endDate":“2018 年 11 月 28 日”, "endTime": "16:00", "allDayEvent": "false", "editAllInRecurrenceSeries": "true", "where": "Some Place", "description": "My testing Case", "userTimeZoneId": "America/Mexico_City",}

urlC = 'https://yourconfluence.com/rest/calendar-services/1.0/calendar/events.json'

r = requests.put(urlC, auth=('username', 'pass'), data=data, timeout=15)

那将 return 一个 'success': true 与新条目:

u'{"success":true,"subCalendar":{"reminderMe":false,.......}}

我发现最简单的方法是订阅 link 日历,然后使用 iCalendar 库解析数据。确保订阅按钮给你一个带有 {guid}.ics 而不是 undefined.ics 的 link - 为了解决这个问题,我不得不去主汇合处的日历 link [=18] =] 然后从下拉列表中选择 select。您可能必须创建一个空日历,以便 select 日历。

在 chrome 中通过开发人员控制台后,在分析有效负载的格式和所需的身份验证详细信息后,我找到了解决方案,

我的问题陈述略有不同我必须将事件添加到 confluence 日历,添加事件和提取事件都将遵循相同的过程。

像 JSESSIONID 和 seraphConfluence 这样的身份验证所需的 cookie 很少,它们将存储在应用程序 -> chrome 开发人员工具中的 cookie 中。 我们还需要 subCalenderid 和 Id Type,它们可以从 chrome 开发人员工具中的应用程序-> 本地存储中获取。

而且,汇流将使用 'application/x-www-form-urlencoded' 作为 Content-Type 发送请求,所以在数据中我们应该以编码格式, 为此,我们可以使用以下代码转换为该格式

import urllib
urllib.parse.quote_plus('May 4, 2022') 

输出:

'May+4%2C+2022'

日期和类型也应该在 MMM D、YYYY 和 h:MM 中,您可以使用箭头 python 包来完成工作的格式

arrow.utcnow.format(MMM D, YYYY)

输出

May 4, 2022

下面有一个来自 chrome 中的请求有效负载的字符串,当我们点击添加事件时它发送放置请求,如果我们分析该字符串,我们可以看到我们有

confirmRemoveInvalidUsers=false&childSubCalendarId=&customEventTypeId=asdfghjk-asdf-asdf-asfg-sdfghjssdfgh&eventType=custom&isSingleJiraDate=false&originalSubCalendarId=&originalStartDate=&originalEventType=&originalCustomEventTypeId=&recurrenceId=&subCalendarId=asdfghjk-asdf-asdf-asdg-asdfghjkl&uid=&what=test&startDate=May+4%2C+2022&startTime=&endDate=May+4%2C+2022&endTime=&allDayEvent=true&rruleStr=&until=&editAllInRecurrenceSeries=true&where=&url=&description=&userTimeZoneId=America%2FNew_York

经过分析我们可以得出结论,我们必须用我们的代码替换开始日期,结束日期,开始和结束时间,what,where,子日历id和类型等字段并发送请求。

下面是执行此操作的代码

def addEventtoCalender():
    reqUrl = 'https://confluence.yourdomain.com/rest/calendar-services/1.0/calendar/events.json'
    authDetails = getConfluenceAuthenticationDetails()
    what=urllib.parse.quote_plus('WHAT field data')
    startDate = urllib.parse.quote_plus(arrow.utcnow().format('MMM D, YYYY'))
    startTime=urllib.parse.quote_plus(arrow.utcnow().format('h:MM A'))
    endDate=urllib.parse.quote_plus(arrow.utcnow().format('MMM D, YYYY'))
    endTime=urllib.parse.quote_plus(arrow.utcnow().shift(hours=+1).format('h:MM A'))
    where=urllib.parse.quote_plus('WHERE field data')
    url=urllib.parse.quote_plus('https://yoururl.com')
    description=urllib.parse.quote_plus('test test test')
    customEventTypeId = authDetails['CONFLUENCE_CUSTOM_EVENT_TYPE_ID'] #subcalender type
    subCalendarId = authDetails['CONFLUENCE_SUBCALENDAR_ID']
    seraphConfluence =  authDetails['CONFLUENCE_SERAPH_CONFLUENCE']
    JSESSIONID = authDetails['CONFLUENCE_JSESSION_ID']
    data = f'confirmRemoveInvalidUsers=false&childSubCalendarId=&customEventTypeId={customEventTypeId}&eventType=custom&isSingleJiraDate=false&originalSubCalendarId=&originalStartDate=&originalEventType=&originalCustomEventTypeId=&recurrenceId=&subCalendarId={subCalendarId}&uid=&what={what}&startDate={startDate}&startTime={startTime}&endDate={endDate}&endTime={endTime}&allDayEvent=false&rruleStr=&until=&editAllInRecurrenceSeries=true&where={where}&url={url}&description={description}&userTimeZoneId=America%2FNew_York'
 
    headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Cookie': f'seraph.confluence={seraphConfluence}; JSESSIONID={JSESSIONID}'
    }
    res = requests.put(url=reqUrl,data=data,headers=headers,verify=False)

以上代码将复制将事件添加到日历的整个过程。您可以使用相同的方法来复制获取特定日期之间的所有事件。