通过serverfault.com,stackoverflow.com,apple.stackexchange.com搜索,谷歌搜索仍然没有走得太远。需要有人帮忙。
我试图从iCloud帐户中获取所有vCard。
我从Roundcube / CardDav的插件开始。
来自以下文章:
stackoverflow.com/questions/24202551/manipulate-groups-in-icloud-with-carddav-protocol sabre.io/dav/building-a-carddav-client/ sabre.io/dav/clients/osx-addressbook/ stackoverflow.com/questions/15111887/how-to-import-icloud-contacts-in-php# tools.ietf.org/html/rfc6352#section-8.7.1
我设法获得校长,校长的地址。但获取卡的最后一步返回ContentLength为0。
以下是我的工作:
- use icloud email as username
- use icloud password
要获得校长,请使用" https:/ / contacts.icloud.com/"作为URL,PROPFIND,DEPTH 0:
<?xml version="1.0" encoding="UTF-8"?>
<d:propfind xmlns:d="DAV:">
<d:prop>
<d:current-user-principal/>
</d:prop>
</d:propfind>
响应:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<multistatus xmlns="DAV:">
<response>
<href>/</href>
<propstat>
<prop>
<current-user-principal>
<href>/1331115018/principal/</href>
</current-user-principal>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>
接下来,我将采用&#34; https:/ /contacts.icloud.com/1331115018/principal/" ;, PROPFIND,DEPTH 0:
<?xml version="1.0" encoding="UTF-8"?>
<d:propfind xmlns:d="DAV:" xmlns:card="urn:ietf:params:xml:ns:carddav">
<d:prop>
<card:addressbook-home-set/>
</d:prop>
</d:propfind>
响应:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<multistatus xmlns="DAV:">
<response>
<href>/1331115018/principal/</href>
<propstat>
<prop>
<addressbook-home-set xmlns="urn:ietf:params:xml:ns:carddav">
<href xmlns="DAV:">https://p44-contacts.icloud.com:443/1331115018/carddavhome/</href>
</addressbook-home-set>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>
最后,以下是我尝试使用https获取所有vCard的方法:/ / p44-contacts.icloud.com:443/1331115018/carddavhome/,REPORT,DETTH 1:
<?xml version="1.0" encoding="utf-8" ?>
<C:addressbook-multiget xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
<D:prop>
<D:getetag/>
<C:address-data>
<C:prop name="UID"/>
<C:prop name="EMAIL"/>
<C:prop name="FN"/>
</C:address-data>
</D:prop>
</C:addressbook-multiget>
响应:
<?xml version="1.0" encoding="UTF-8"?>
<multistatus xmlns="DAV:" xmlns:CD="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
</multistatus>
或
<?xml version="1.0" encoding="utf-8" ?>
<C:addressbook-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
<D:prop>
<D:getetag/>
<C:address-data>
<C:prop name="UID"/>
<C:prop name="EMAIL"/>
<C:prop name="FN"/>
</C:address-data>
</D:prop>
</C:addressbook-query>
响应:
<?xml version="1.0" encoding="UTF-8"?>
<multistatus xmlns="DAV:" xmlns:CD="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/">
<response>
<href>/1331115018/carddavhome/</href>
<propstat>
<prop> <getetag>"C=0@U=9123588c-8038-439c-a547-19c866d1ed06"</getetag>
<address-data xmlns="urn:ietf:params:xml:ns:carddav">
</address-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>
或
<?xml version="1.0" encoding="utf-8" ?>
<C:addressbook-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
<D:prop>
<D:getetag/>
<C:address-data>
<C:prop name="UID"/>
<C:prop name="EMAIL"/>
<C:prop name="FN"/>
</C:address-data>
</D:prop>
<C:prop-filter name="EMAIL">
<C:text-match collation="i;unicode-casemap" match-type="equals">me</C:text-match>
</C:prop-filter>
</C:filter>
</C:addressbook-query>
响应:
"Didn't understand the report"
我该怎么做?
答案 0 :(得分:1)
CardDAV home(您的https://p44-contacts.icloud.com:443/1331115018/carddavhome/
)包含CardDAV集合(又名&#39;地址簿&#39;),而不是vCards(包含联系人和联系人组)。你需要再多花一点。
您可以使用常规PROPFIND
深度1在家中列出地址簿集合,然后使用您指定的报告查询联系人的地址集集。像这样:
PROPFIND /1331115018/carddavhome/ HTTP/1.1
Depth: 1
Host: p44-contacts.icloud.com:443
Authorization: ...
Content-Type: text/xml; charset=utf-8
Content-Length: ...
<propfind xmlns="DAV:">
<prop>
<displayname />
<resourcetype />
</prop>
</propfind>
这将返回CardDAV主页集合中所有子集合的列表。
具有addressbook
resourcetype
的集合是CardDAV地址簿集合,可以使用addressbook-query
或addressbook-multiget
报告使用sync-report进行查询支持(iCloud)或再次使用简单的PROPFIND
。取决于你想要的东西。
给定一个地址簿收集网址&#39;真实&#39;如果服务器支持,客户端通常会使用同步报告来获取所有已更改对象的URL,或者只使用PROPFIND作为后备来获取所有包含的vCard的URL,Content-Type和ETag。例如:
PROPFIND /1331115018/carddavhome/contacts/ HTTP/1.1
Depth: 1
Host: p44-contacts.icloud.com:443
Authorization: ...
Content-Type: text/xml; charset=utf-8
Content-Length: ...
<propfind xmlns="DAV:">
<prop>
<getetag />
<getcontenttype />
</prop>
</propfind>
这为您提供了地址簿集合中所有对象的URL。然后,您可以使用简单的GET或多重报告来检索。
顺便说一句:在您的addressbook-multiget
REPORT
中,您没有列出任何vCard网址,因此结果集将始终为空...您可以在RFC 6352中阅读有关multiget的内容。
注意:在iCloud中,家中通常只有一个地址簿集合,但在其他服务器中,拥有多个地址集是很常见的。此外,在某些服务器中,CalDAV和CardDAV家庭是相同的集合(即记得实际检查相应家庭集合中子集合的资源类型)。
这是对CardDAV的一个很好的介绍:Building a CardDAV client。 或者是YouTube上的这个:FOSDEM 2009 CalDAV。
答案 1 :(得分:0)
<card:addressbook-multiget xmlns:d="DAV:" xmlns:card="urn:ietf:params:xml:ns:carddav">
<d:prop>
<d:getetag />
<card:address-data />
</d:prop>
<d:href>/1331115018/carddavhome/card/vcard_UUID.vcf</d:href>
</card:addressbook-multiget>
让我们在“报告请求”中尝试一下。
答案 2 :(得分:-1)
获取凭据:https://github.com/muhlba91/icloud/blob/master/groovy_java/gui-2.1.0.zip!请注意:https://support.apple.com/en-us/HT204397
获取电子名片:https://github.com/andig/carddav2fb-只需使用下载命令:php carddav2fb download yourdownload.vcf