有什么方法可以使用应用程序专用密码检索 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/
我正在做一个小项目,我想将我的 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/