使用 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'
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)
以上代码将复制将事件添加到日历的整个过程。您可以使用相同的方法来复制获取特定日期之间的所有事件。
我有一个 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'
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)
以上代码将复制将事件添加到日历的整个过程。您可以使用相同的方法来复制获取特定日期之间的所有事件。