iCloud CalDAV через PHP

Я пытаюсь написать базовое взаимодействие CalDAV для использования с календарями Apple iCloud для данной учетной записи. На данный момент я получаю ответ, показанный ниже:

Precondition Failed
Requested resource has a matching ETag.

Код, который я использую, изначально был взят из http://trentrichardson.com/2012/06/22/put-caldav-events-to-calendar-in-php/ и адаптированы к следующему:

<?php

$account = array(
    'server'=> 'p05',
    'id'    => '######',
    'user'  => 'a****[email protected]',
    'pass'  => '*****'
);


$url = 'https://'.$account['server'].'-caldav.icloud.com/'.$account['id'].'/calendars/work/';
$userpwd = $account['user'] .":". $account['pass'];
$description = 'Test event description';
$summary = 'Test event';
$tstart = gmdate("Ymd\THis\Z", strtotime("-2 days"));
$tend = gmdate("Ymd\THis\Z", strtotime("-2 days"));
$tstamp = gmdate("Ymd\THis\Z");

$body = <<<__EOD
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
DTSTAMP:$tstamp
DTSTART:$tstart
DTEND:$tend
UID:$uid
DESCRIPTION:$description
LOCATION:Office
SUMMARY:$summary
END:VEVENT
END:VCALENDAR
__EOD;

$headers = array(
    'Content-Type: text/calendar; charset=utf-8',
    'If-None-Match: *', //Possibly this line causing a problem - unsure of what it does?
    'Content-Length: '.strlen($body),
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $userpwd);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
$res = curl_exec($ch);
curl_close($ch);

print_r($res);

?>

Вы можете получить свой идентификатор пользователя из этого скрипта: https://github.com/muhlba91/icloud/blob/master/PHP/icloud.php

Кто-нибудь знает, что означает ответ или как его решить? Я понимаю, что сценарий очень простой, но я хотел бы, чтобы что-то работало, прежде чем приводить его в порядок в классе.

Заранее благодарим за любой совет/помощь.


person Andy    schedule 19.01.2013    source источник


Ответы (1)


Конечно, после того, как вы потратите несколько часов на решение проблемы и прибегнете к SO, ваш мозг сработает.

Мне не хватало переменной $uid, для нее нужно установить уникальный (или существующий для обновления) идентификатор события. Нижеследующее должно работать для всех, кто пытается достичь того же:

<?php

$account = array(
    'server'=> 'p05',
    'id'    => '######',
    'user'  => 'a****[email protected]',
    'pass'  => '*****'
);

$uid = 'event-12345';
$url = 'https://'.$account['server'].'-caldav.icloud.com/'.$account['id'].'/calendars/work/' . $uid . '.ics';
$userpwd = $account['user'] .":". $account['pass'];
$description = 'Test event description';
$summary = 'Test event';
$tstart = gmdate("Ymd\THis\Z", strtotime("-2 days"));
$tend = gmdate("Ymd\THis\Z", strtotime("-2 days"));
$tstamp = gmdate("Ymd\THis\Z");

$body = <<<__EOD
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
DTSTAMP:$tstamp
DTSTART:$tstart
DTEND:$tend
UID:$uid
DESCRIPTION:$description
LOCATION:Office
SUMMARY:$summary
END:VEVENT
END:VCALENDAR
__EOD;

$headers = array(
    'Content-Type: text/calendar; charset=utf-8',
    'If-None-Match: *',
    'Expect: ',
    'Content-Length: '.strlen($body),
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $userpwd);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_exec($ch);
curl_close($ch);

?>

Моя ошибка.

person Andy    schedule 19.01.2013
comment
Как вы определили свой уникальный идентификатор Apple? Я читал, что вы можете найти его в файлах резервных копий IOS, но есть ли более простой способ? - person Realistic; 18.09.2013
comment
Эй, извини, что просто отвечаю. Запустите этот скрипт локально на Apache: github.com/muhlba91/icloud/blob /мастер/PHP/icloud.php - person Andy; 21.10.2013