Чтение свободного времени в calDAV iCloud PHP

Я пытаюсь прочитать информацию о свободном времени из календаря iCloud.

Я основал свое решение на этом php-клиенте https://github.com/muhlba91/icloud/blob/master/PHP/icloud.php

Что пока работает: получение номера пользователя Apple из идентификатора Apple с использованием учетных данных, это необходимо для доступа к URL-адресу calDAV.

Получение списка доступных календарей от пользователя (например, дома, работы, ...)

Что не работает: я не могу получить действительный ответ от сервера 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. Это в точности то же самое, что и функция 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. Я думаю, проблема в том, что URL неправильный. Однако я нигде не могу найти в Интернете правильный URL-адрес яблочного калдава.

Я надеюсь, что есть какой-нибудь эксперт по calDAV, который может помочь мне в этом вопросе.

ИЗМЕНИТЬ

Хорошо, я отредактировал код / ​​вопрос, так как free-busy не поддерживается Apple, и он частично работает.


person Rbn    schedule 26.11.2014    source источник


Ответы (1)


Предварительное условие поддерживаемого отчета для метода REPORT описано здесь: http://www.webdav.org/specs/rfc3253.html#rfc.iref.d.17

Это просто означает, что этот календарь iCloud не поддерживает запросы freebusy. Вы можете увидеть то же самое в приложении календаря 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, ваш URL неверный / не существует.

Другая проблема может заключаться в том, что ваши учетные данные для аутентификации неверны. Предоставляете ли вы пароль приложения в вашем основном auth?

person hnh    schedule 28.11.2014
comment
Если я попытаюсь выполнить календарный запрос, я получу тот же поддерживаемый отчет. Означает ли это, что iCloud также не поддерживает календарные запросы? Если да, то как мне читать информацию о событиях через calDAV? - person Rbn; 29.11.2014
comment
AFAIK iCloud поддерживает подмножество календарных запросов. Т.е. он поддерживает запросы временного диапазона, используемые iOS. Но я подозреваю, что с вашим запросом что-то не так. Возможно, добавьте в свой вопрос HTTP-представление вашей проблемы. - person hnh; 03.12.2014