【问题标题】:iCloud Calendar RequestsiCloud 日历请求
【发布时间】:2017-07-08 06:03:12
【问题描述】:

我正在尝试通过curl 访问我的 iCloud 日历(在我编写任何代码之前将此用作测试),但我遇到了未经授权的访问错误。有没有人有幸让这个工作?我使用this 提取了我的用户 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 复制 this 查询,但一直收到 502 响应 - 使用 SecurityException 连接失败。

【问题讨论】:

    标签: curl icloud caldav icloud-api


    【解决方案1】:

    要访问 iCloud 日历或提醒,您可以使用称为 IETF 的协议 CalDAVBuilding a CalDAV client 是关于如何做到这一点的一个很好的介绍。 有了以上内容,您只是在 API 上抛出 GET 请求......

    使用 curl 可以通过 3 个步骤来获取日历名称。第一的 您需要找出代表您的 iCloud 帐户的 URL(称为 校长在 WebDAV 发言):

    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”。 在这种情况下,您需要设置一个 app-specific password 用于 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
    

    希望这能让你开始。

    【讨论】:

    • 感谢您发布这个广泛的答案。我遇到了与 OP 完全相同的问题,并使用 -v(详细)尝试了您的第一个 curl 命令并得到了 401。我 100% 确定我的凭据是正确的。当我登录 icloud.com 并工作时使用相同。没有 2-FA 活动。知道如何调试吗?
    • 就是这样。谢谢!
    • @hnh 在我的情况下,当我执行你的最后一步时,我得到The remote server returned an error: (403) Forbidden.。您知道导致这种情况的可能情况是什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2018-03-16
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    相关资源
    最近更新 更多