使用PHP从iCloud获取vCards



通过serverfault.com、stackoverflow.com、apple.stackeexchange.com搜索,在谷歌上搜索,但仍然没有走多远。需要人帮忙。

我正在尝试从iCloud帐户获取所有vCard。

我从Roundcube/CardDav的插件开始。

来自以下文章:

stackoverflow.com/questions/2402551/manioper-groups-in-cloud-with-cardav-协议sabre.io/dav/building-a-carddav-client/sabre.io/dav/clients/osx-addressbook/stackoverflow.com/questions/1511187/how-to-import-icloud-contacts-in-php#tools.ietf.org/html/rfc6532#章节-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>

接下来,我将使用"https://contacts.icloud.com/1331115018/princil/",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://p44-contacts.icloud.com:443/1331115018/carddavhome/,REPORT,DEPTH 1:获取所有vCard

<?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"

我该怎么办?

CardDAV主页(您的https://p44-contacts.icloud.com:443/1331115018/carddavhome/)包含CardDAV集合(也称为"通讯录"),而不是vCards(包含联系人和联系人组)。你需要再跳一步。

您可以使用常规的PROPFINDDepth 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主集合中所有子集合的列表。

具有addressbookresourcetype的集合是CardDAV通讯簿集合,可以使用addressbook-queryaddressbook-multiget报告、使用同步报告(如果支持的话)或再次使用简单的PROPFIND进行查询。这取决于你想要什么。

给定一个通讯簿集合URL,如果服务器支持,"真实"客户端通常会使用同步报告来获取所有更改对象的URL,或者只使用PROPFIND作为回退获取所有包含的vCard的URL、内容类型和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或多集报告来检索。

BTW:在您的addressbook-multigetREPORT中,您没有列出任何vCard URL,因此结果集将始终为空。。。您可以在RFC 6352中阅读有关多重集的内容。

注意:在iCloud中,家中通常只有一个地址簿集合,但在其他服务器中,通常有多个地址簿。此外,在某些服务器中,CalDAV和CardDAV主集合是相同的集合(即,请记住实际检查各自主集合中子集合的资源类型)。

这是关于CardDAV的精彩介绍:构建CardDAV客户端。或者YouTube上的这个:FOSDEM 2009 CalDAV。

<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>

让我们在报告请求中尝试一下。

获取凭据:https://github.com/muhlba91/icloud/blob/master/groovy_java/gui-2.1.0.zip!请记住:https://support.apple.com/en-us/HT204397

获取您的vCards:https://github.com/andig/carddav2fb-只需使用下载命令:php carddav2fb download yourdownload.vcf

相关内容

  • 没有找到相关文章

最新更新