2

我正在尝试通过curl(在编写任何代码之前将其用作测试)访问我的 iCloud 日历,但遇到未经授权的访问错误。有没有人有幸让这个工作?我用来提取我的用户 ID,并通过给自己发送电子邮件事件邀请来确定服务器 ID。

命令运行

curl -u <apple email ID> https://<server id>-caldav.icloud.com/<user id>/calendars

回复

<html><head><title>Unauthorized</title></head><body><h1>Unauthorized</h1><p>You are not authorized to access this resource.</p></body></html>

编辑

我尝试使用 fiddler 复制查询,但不断收到 502 响应 - 连接失败并显示SecurityException.

4

1 回答 1

7

要访问 iCloud 日历或提醒,您可以使用称为 CalDAV的 IETF 协议。 构建 CalDAV 客户端 是关于如何执行此操作的一个很好的介绍。有了以上内容,您只是向GETAPI 发出请求......

使用 curl 它是一个 3 步过程来获取日历名称。首先,您需要找出代表您的 iCloud 帐户的 URL( 在 WebDAV 中称为Principal ):

curl -s -X PROPFIND -u "$APPLEID" -H "Depth: 0" \
  --data "<propfind xmlns='DAV:'><prop><current-user-principal/></prop></propfind>" \
  https://caldav.icloud.com/

如果您无法对此进行身份验证,您使用了错误的凭据,您可能已为您的 iCloud 帐户启用了两步验证,或者它已超过 2017-06-15:“将需要特定于应用程序的密码才能登录从 6 月 15 日起使用第三方应用程序到 iCloud"。在这种情况下,您需要为 CalDAV 访问设置 应用程序专用密码

上面的 curl 向您显示了您的帐户记录的 URL,它看起来像https://caldav.icloud.com/347723822/principal/. 下一步是确定您的日历的托管位置。它存储在calendar-home-set主体的帐户属性中,可以像这样访问:

curl -s -X PROPFIND -u "$APPLEID" -H "Depth: 0" \
  --data "<propfind xmlns='DAV:' xmlns:cd='urn:ietf:params:xml:ns:caldav'><prop><cd:calendar-home-set/></prop></propfind>" \
  https://caldav.icloud.com/827267162/principal/

这为您提供了对实际日历所在的集群的引用,它看起来像 https://p22-caldav.icloud.com:443/827161622/calendars. 假设您想获取用户拥有的所有日历的名称:

curl -s -X PROPFIND -u "$APPLEID" -H "Depth: 1" \
  --data "<propfind xmlns='DAV:'><prop><displayname/></prop></propfind>" \
  https://p42-caldav.icloud.com:443/28377271/calendars/ \
| grep displayname

希望这能让你开始。

于 2017-02-19T12:26:01.337 回答