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

问题描述

我正在做一个小项目,我想将Apple Calendar与我的Web应用程序完全同步。我在python中使用两个包(caldav和icalendar)来查看,创建,更新和删除事件,然后使用一些GraphQL将数据整理到前端。目前,它的运行情况非常好,但是如果我将其推向生产阶段,那将是一个大问题。在caldav软件包中,您需要提供到客户端的链接。看起来像这样:

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

每个用户的pXX不同,DSID类似于您的Apple帐户的Apple唯一ID。 pXX的获取不是很复杂,但是DSID有点麻烦。 检索日历时,还需要向客户端提供@ icloud.com帐户和应用专用密码。

有许多文章介绍了如何通过进入Apple Calendar应用程序并在开发控制台中进行一些改动来获取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/

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...