【发布时间】: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