有什么方法可以使用应用程序专用密码检索 Apple DSID?

Is there any way to retrieve Apple DSID with an app specific password?

我正在做一个小项目,我想将我的 Apple 日历与我的网络应用程序完全同步。我在 python(caldav 和 icalendar)中使用两个包来查看、创建、更新和删除事件,然后我使用一些 GraphQL 将数据美化到我的前端。目前它运行良好,但如果我将其投入生产,就会出现一个大问题。在 caldav 包中,您需要向客户端提供 link。它看起来像这样:

https://pXX-caldav.icloud.com/<DSID>/calendars

其中每个用户的 pXX 都不同,而 DSID 类似于您的 Apple 帐户的 Apple 唯一 ID。 pXX 获取起来不是很复杂,但是 DSID 有点麻烦。 当您检索日历时,您还需要为客户提供一个@icloud.com-帐户和一个应用程序专用密码。

有许多文章解释了如何通过转到您的 Apple 日历应用程序并在开发控制台中进行一些修改来获取 DSID。这行得通,但我不能让人们在注册后这样做。另一种方法是向

发出请求
https://setup.icloud.com/setup/ws/1/accountLogin

使用您的 Apple 凭据。这会返回有关您帐户的大量有趣信息,包括 DSID。但是,它确实只适用于您的真实 Apple ID 和密码,我不希望人们在 Apple 自己的网站以外的任何其他网站上输入该信息。我曾尝试使用我的应用专用密码来解决这个问题,但没有成功。

有没有人知道如何解决这个问题?如果真的没有办法,那我觉得这个项目也许应该暂时搁置了。

经过大量研究,最简单的答案:简单 'PROPFIND'-请求 https://caldav.icloud.com

import requests
from bs4 import BeautifulSoup

caldav_url = 'https://caldav.icloud.com'
username = <APPLE_ID>
password = <APP_SPECIFIC_PASSWORD>

principal_query = """\
<?xml version="1.0" encoding="utf-8"?>
<propfind xmlns='DAV:'>
    <prop>
        <current-user-principal/>
    </prop>
</propfind>
"""

r = requests.request(
    'PROPFIND',
    url=caldav_url,
    data=principal_query,
    auth=requests.auth.HTTPBasicAuth(username, password),
    headers={'Content-Type': 'application/xml'},
    )

soup = BeautifulSoup(r.text, 'lxml')
principal_extension = soup.find('current-user-principal').find('href').get_text()

print(principal_extension)
// -> /<DSID>/principal/