【问题标题】:Reading free-busy calDAV iCloud PHP阅读闲暇 calDAV iCloud PHP
【发布时间】:2015-01-24 17:58:18
【问题描述】:

我正在尝试从 iCloud 日历中读取忙/闲信息。

我的解决方案基于这个 php 客户端 https://github.com/muhlba91/icloud/blob/master/PHP/icloud.php

目前有效: 使用凭据从 Apple ID 获取 Apple 用户编号,这是访问 calDAV URL 所必需的

从用户处获取可用日历的列表(例如,家庭、工作、...)

什么不起作用: 我无法从 Apple calDAV 服务器获得有效响应。

请求(已编辑):

$ctag_request="<A:propfind xmlns:A='DAV:' xmlns:cs='https://p01-caldav.icloud.com/**USERID**/calendars/home/'>
    <A:prop>
       <cs:getctag />
    </A:prop>
</A:propfind>";


    $response=simplexml_load_string($this->doPropfindRequest($user['appleID'], $user['applepass'], $url, $ctag_request));

这是 DoRequest 函数。这与我用来获取用户 ID 和日历列表的 propfind 函数完全相同,除了 CURLOPT_CUSTOMREQUEST 设置为 PROPFIND 或 REPORT。 我的结论是我的解决方案的 cURL 部分是正确构建的。

function doReportRequest($user, $pw, $url, $xml)
{
    //Init cURL
    $c=curl_init($url);
    //Set headers
    curl_setopt($c, CURLOPT_HTTPHEADER, array("Depth: 1", "Content-Type: text/xml; charset='UTF-8'", "User-Agent: DAVKit/4.0.1 (730); CalendarStore/4.0.1 (973); iCal/4.0.1 (1374); Mac OS X/10.6.2 (10C540)"));
    curl_setopt($c, CURLOPT_HEADER, 0);
    //Set SSL
    curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 0);
    //Set HTTP Auth
    curl_setopt($c, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($c, CURLOPT_USERPWD, $user.":".$pw);
    //Set request and XML
    curl_setopt($c, CURLOPT_CUSTOMREQUEST, 'PROPFIND');
    curl_setopt($c, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    //Execute
    $data=curl_exec($c);
    //Close cURL
    curl_close($c);

    return $data;
}

但是,苹果在这个请求中返回给我的是以下内容:

object(SimpleXMLElement)#259 (1) {
  ["response"]=>
  object(SimpleXMLElement)#261 (2) {
    ["href"]=>
     string(27) "/8126574070/calendars/home/"
     ["propstat"]=>
     object(SimpleXMLElement)#262 (2) {
      ["prop"]=>
      object(SimpleXMLElement)#260 (1) {
        ["getctag"]=>
        object(SimpleXMLElement)#263 (0) {
        }
      }
      ["status"]=>
      string(22) "HTTP/1.1 404 Not Found"
    }
  }
}

我收到 404 响应。我认为问题在于网址错误。但是我无法在网上找到正确的 apple caldav URL。

我希望有一些 calDAV 专家可以帮助我解决这个问题。

编辑

好的,我编辑了代码/问题,因为 Apple 不支持忙/闲,而且它处于半工作状态。

【问题讨论】:

    标签: php xml curl icloud caldav


    【解决方案1】:

    在此处记录了 REPORT 方法的supported-report 前提条件:http://www.webdav.org/specs/rfc3253.html#rfc.iref.d.17

    这只是意味着这个 iCloud 日历不支持忙闲查询。如果您创建一个事件并打开可用性面板,您可以在 OS X 日历应用程序中看到相同的内容。 它说“此日历不支持可用性”...

    将答案扩展到已编辑的问题:这是错误的:

    $ctag_request="<A:propfind xmlns:A='DAV:' xmlns:cs='https://p01-caldav.icloud.com/**USERID**/calendars/home/'>
      <A:prop>
        <cs:getctag />
      </A:prop>
    </A:propfind>";
    

    getctag 属性的命名空间是“http://calendarserver.org/ns/”。试试这个:

    $ctag_request="<propfind xmlns='DAV:'>
      <prop>
        <getctag xmlns='http://calendarserver.org/ns/' />
      </prop>
    </propfind>";
    

    https://p01-caldav.icloud.com/USERID/calendars/home/ 是日历集合的 URL。它不是 XML 命名空间。

    是的,如果您收到 404,您的网址是错误的/不存在。

    另一个问题可能是您的身份验证凭据错误。您是否在基本身份验证中提供了application password

    【讨论】:

    • 如果我尝试进行日历查询,我会得到相同的支持报告。这是否意味着 iCloud 也不支持日历查询?如果是这样,我应该如何通过 calDAV 读取事件信息?
    • AFAIK iCloud 支持日历查询的子集。即它确实支持 iOS 使用的时间范围查询。但我有点怀疑你的请求有问题。也许将您的问题的 HTTP 表示添加到您的问题中。
    猜你喜欢
    • 2013-01-03
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2018-07-07
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多