【问题标题】:Reading Apple/iCloud calendar data using PHP/CalDAV使用 PHP/CalDAV 读取 Apple/iCloud 日历数据
【发布时间】:2013-12-01 18:41:14
【问题描述】:

我正在尝试通过 CalDAV 获取 iCloud 日历的日历事件来快速找到空闲/忙碌时间。我能够获得可用的日历,并且根据文档here 或使用DAViCal client library 获取给定日期范围的日历信息应该像将此 REPORT xml 请求发送到日历 URL 一样简单(即 @ 987654323@):

<c:calendar-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">
<d:prop>
    <d:getetag />
    <c:calendar-data />
</d:prop>
<c:filter>
    <c:comp-filter name="VCALENDAR">
       <C:comp-filter name="VEVENT">
            <C:time-range start="20131115T000000Z" end="20131201T000000Z"/>
          </C:comp-filter>
</c:comp-filter>
</c:filter>
</c:calendar-query>

这基本上就是 DAViCal 库中的 GetEvents() 函数所做的。但是,我只是在回复中获取每个日历条目的 URL,而不是日历数据本身:

<?xml version='1.0' encoding='UTF-8'?><multistatus xmlns='DAV:'>
  <response>
<href>/..userid../calendars/work/8D2D90EB-BD23-4137-AD22-70D971C587F2.ics</href>
<propstat>
  <prop>
    <getetag>"C=7734@U=b09ce345-d654-491e-bb4a-55358e7019d9"</getetag>
    <getcontenttype>text/calendar</getcontenttype>
  </prop>
  <status>HTTP/1.1 200 OK</status>
</propstat>
</response>
 <response>
<href>/..userid../calendars/work/AA2385AB-EA58-4625-AF87-6D4FB9405686.ics</href>
<propstat>
  <prop>
    <getetag>"C=7733@U=b09ce345-d654-491e-bb4a-55358e7019d9"</getetag>
    <getcontenttype>text/calendar</getcontenttype>
  </prop>
  <status>HTTP/1.1 200 OK</status>
</propstat>
</response>
...
</multistatus>

我当然可以为每个单独的日历项执行 GET 请求,但显然这很慢。在一个请求中下载日历数据有什么技巧吗?

【问题讨论】:

标签: php calendar icloud caldav


【解决方案1】:

如果你只包含它就可以了

<c:calendar-data />

而不是

<d:getetag /> 

在请求中,像这样:

<c:calendar-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">
<d:prop>
    <c:calendar-data />
</d:prop>
<c:filter>
    <c:comp-filter name="VCALENDAR">
       <C:comp-filter name="VEVENT">
            <C:time-range start="20131115T000000Z" end="20131201T000000Z"/>
          </C:comp-filter>
</c:comp-filter>
</c:filter>
</c:calendar-query>

:-)

【讨论】:

  • 完美运行,谢谢!我正在使用诸如 code.google.com/p/sabredav/wiki/… 之类的教程,它指定请求 etag 和 calendar-data 都会返回两者,但我猜不是苹果的 CalDAV 实现:)
【解决方案2】:

现在,苹果日历服务器支持这两个标签。

我正在使用日历服务器 9.0。

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query
    xmlns:D="DAV:"
    xmlns:C="urn:ietf:params:xml:ns:caldav">
    <D:prop>
        <D:getetag />
        <C:calendar-data>
            <C:comp name="VCALENDAR">
                <C:prop name="VERSION"/>
                <C:comp name="VEVENT"></C:comp>
            </C:comp>
            <C:expand start="20170101T060000Z" end="20170630T060000Z"/>
        </C:calendar-data>
    </D:prop>
    <C:filter>
        <C:comp-filter name="VCALENDAR">
            <C:comp-filter name="VEVENT">
                <C:time-range end="20170630T060000Z" start="20170101T060000Z"/>
            </C:comp-filter>
        </C:comp-filter>
    </C:filter>
</C:calendar-query>

响应 -

<?xml version='1.0' encoding='UTF-8'?>
<multistatus xmlns='DAV:'>
  <response>
    <href>/calendars/users/test/calendar/43fdddd1-ad3a-4c00-ac63-a76d89e074da.ics</href>
    <propstat>
      <prop>
        <getetag>"14db35d8d385ee62ced664efd56d3ac4"</getetag>
        <calendar-data xmlns='urn:ietf:params:xml:ns:caldav'><![CDATA[BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
UID:43fdddd1-ad3a-4c00-ac63-a76d89e074da
DTSTART;VALUE=DATE:20170110
DTEND;VALUE=DATE:20170111
CATEGORIES:Birthday
CREATED:20170130T070433Z
DESCRIPTION:Birthday from thunderbird
DTSTAMP:20170130T070515Z
LAST-MODIFIED:20170130T070515Z
SUMMARY:Test Event 123
TRANSP:TRANSPARENT
END:VEVENT
END:VCALENDAR
]]></calendar-data>
      </prop>
      <status>HTTP/1.1 200 OK</status>
    </propstat>
  </response>
  <response>
    <href>/calendars/users/test/calendar/53f7e764-9e46-4f7d-a851-714f9ea03ad1.ics</href>
    <propstat>
      <prop>
        <getetag>"e08f17f5f7483d31017c5391a7618d9b"</getetag>
        <calendar-data xmlns='urn:ietf:params:xml:ns:caldav'><![CDATA[BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
UID:53f7e764-9e46-4f7d-a851-714f9ea03ad1
DTSTART:20170112T093000Z
DTEND:20170112T103000Z
CREATED:20170130T092637Z
DESCRIPTION:Time based Event
DTSTAMP:20170130T092651Z
LAST-MODIFIED:20170130T092651Z
SUMMARY:Time based Event
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
]]></calendar-data>
      </prop>
      <status>HTTP/1.1 200 OK</status>
    </propstat>
  </response>
  <response>
    <href>/calendars/users/test/calendar/73a21941-ac24-492a-b00e-48d38feb7d01.ics</href>
    <propstat>
      <prop>
        <getetag>"8bceb0306b81b67a8dfb2f5d95d76dd1"</getetag>
        <calendar-data xmlns='urn:ietf:params:xml:ns:caldav'><![CDATA[BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
UID:73a21941-ac24-492a-b00e-48d38feb7d01
DTSTART;VALUE=DATE:20170111
DTEND;VALUE=DATE:20170112
CATEGORIES:Favorites
CREATED:20170130T073845Z
DESCRIPTION:Duration Event Desc
DTSTAMP:20170130T092634Z
LAST-MODIFIED:20170130T092634Z
SEQUENCE:1
SUMMARY:Duration Event
TRANSP:TRANSPARENT
X-MOZ-GENERATION:1
END:VEVENT
END:VCALENDAR
]]></calendar-data>
      </prop>
      <status>HTTP/1.1 200 OK</status>
    </propstat>
  </response>
</multistatus>

【讨论】:

  • 这个请求是否有限制?我有时两者都得到,有时只得到 etag 数据。
猜你喜欢
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 2012-04-02
  • 2013-01-03
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 2016-11-19
相关资源
最近更新 更多