通过PHP的iCloud CalDAV

通过PHP的iCloud CalDAV,php,curl,calendar,icloud,caldav,Php,Curl,Calendar,Icloud,Caldav,我正在尝试编写一个基本的CalDAV交互脚本,以便与给定帐户的苹果iCloud日历一起使用。目前,我收到如下回复: Precondition Failed Requested resource has a matching ETag. 我使用的代码最初是根据以下内容改编的: <?php $account = array( 'server'=> 'p05', 'id' => '######', 'user' => 'a****z@me.c

我正在尝试编写一个基本的CalDAV交互脚本,以便与给定帐户的苹果iCloud日历一起使用。目前,我收到如下回复:

Precondition Failed
Requested resource has a matching ETag.
我使用的代码最初是根据以下内容改编的:

<?php

$account = array(
    'server'=> 'p05',
    'id'    => '######',
    'user'  => 'a****z@me.com',
    '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);

?>

您可以从此脚本获取您的用户ID:

有人知道这个回答是什么意思,或者如何解决吗?我意识到脚本是非常基本的,但我想在整理成一个类之前让它工作


提前感谢您的建议/帮助。

当然,在花了几个小时解决一个问题并求助于此之后,您的大脑会活跃起来

我缺少$uid变量,需要设置为唯一(或现有以更新)的事件ID。以下内容适用于尝试实现相同目标的任何其他人:

<?php

$account = array(
    'server'=> 'p05',
    'id'    => '######',
    'user'  => 'a****z@me.com',
    '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);

?>


我的错误。

您是如何确定您的apple唯一id的?我已经读到你可以在IOS备份文件中挖掘它,但有没有更简单的方法?嘿,很抱歉,请回复。在Apache上本地运行此脚本: