【问题标题】:Python library to access a CalDAV server用于访问 CalDAV 服务器的 Python 库
【发布时间】:2013-07-13 20:41:25
【问题描述】:

我在我的网络空间上运行 ownCloud 来共享日历。现在我正在寻找一个合适的 python 库来获得对日历的只读访问权限。我想把日历的一些信息放在一个内网网站上。

我尝试过http://trac.calendarserver.org/wiki/CalDAVClientLibrary,但它总是使用查询命令返回NotImplementedError,所以我的猜测是查询命令不适​​用于给定的库。

我可以改用什么库?

【问题讨论】:

  • 您找到解决方案了吗?

标签: python-2.7 caldav owncloud


【解决方案1】:

我推荐图书馆,caldav

只读在这个库中工作得非常好,对我来说很直接。它将完成获取日历和阅读事件的全部工作,并将它们返回到iCalendar format。有关caldav 库的更多信息也可以在documentation 中获得。

import caldav

client = caldav.DAVClient(<caldav-url>, username=<username>,
                          password=<password>)
principal = client.principal()
for calendar in principal.calendars():
    for event in calendar.events():
        ical_text = event.data

从这里开始,您可以使用 icalendar 库来读取特定字段,例如类型(例如事件、待办事项、警报)、名称、时间等 - 一个好的起点可能是 this question

【讨论】:

  • 欢迎来到 Stack Overflow!虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
  • 感谢您的评论,我认为编辑是您要求的?
【解决方案2】:

几个月前我编写了这段代码,从 CalDAV 获取数据以在我的网站上展示它们。 我已将数据更改为 JSON 格式,但您可以对数据做任何您想做的事情。

我添加了一些打印内容供您查看输出,您可以在生产中删除它们。

    from datetime import datetime
import json
from pytz import UTC # timezone
import caldav
from icalendar import Calendar, Event

# CalDAV info
url = "YOUR CALDAV URL"
userN = "YOUR CALDAV USERNAME"
passW = "YOUR CALDAV PASSWORD"

client = caldav.DAVClient(url=url, username=userN, password=passW)
principal = client.principal()
calendars = principal.calendars()

if len(calendars) > 0:
    calendar = calendars[0]
    print ("Using calendar", calendar)
    results = calendar.events()
    eventSummary = []
    eventDescription = []
    eventDateStart = []
    eventdateEnd = []
    eventTimeStart = []
    eventTimeEnd = []

    for eventraw in results:

        event = Calendar.from_ical(eventraw._data)
        for component in event.walk():
            if component.name == "VEVENT":
                print (component.get('summary'))
                eventSummary.append(component.get('summary'))
                print (component.get('description'))
                eventDescription.append(component.get('description'))
                startDate = component.get('dtstart')
                print (startDate.dt.strftime('%m/%d/%Y %H:%M'))
                eventDateStart.append(startDate.dt.strftime('%m/%d/%Y'))
                eventTimeStart.append(startDate.dt.strftime('%H:%M'))
                endDate = component.get('dtend')
                print (endDate.dt.strftime('%m/%d/%Y %H:%M'))
                eventdateEnd.append(endDate.dt.strftime('%m/%d/%Y'))
                eventTimeEnd.append(endDate.dt.strftime('%H:%M'))
                dateStamp = component.get('dtstamp')
                print (dateStamp.dt.strftime('%m/%d/%Y %H:%M'))
                print ('')

    # Modify or change these values based on your CalDAV
    # Converting to JSON
    data = [{ 'Events Summary':eventSummary[0], 'Event Description':eventDescription[0],'Event Start date':eventDateStart[0], 'Event End date':eventdateEnd[0], 'At:':eventTimeStart[0], 'Until':eventTimeEnd[0]}]
    data_string = json.dumps(data)
    print ('JSON:', data_string)

【讨论】:

    【解决方案3】:

    pyOwnCloud 可能是适合您的选择。我没试过,但它应该提供一个 CMDline/API 来读取日历。

    【讨论】:

      【解决方案4】:

      您可能想提供更多关于您如何实际使用 API 的详细信息,但如果查询命令确实没有实现,CalConnect website (archvied 版本,@987654322)中提供了其他 Python 库的列表@ 现在已经死了)。

      【讨论】:

      • 此页面已失效
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2021-08-16
      • 1970-01-01
      相关资源
      最近更新 更多