问题描述
我正在做一个小项目,我想将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/