【问题标题】:Getting vCards from iCloud using PHP使用 PHP 从 iCloud 获取 vCard
【发布时间】:2017-01-20 06:08:43
【问题描述】:

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

获取Principal,使用“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/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>

最后,这是我尝试获取所有 vCard 的方法,使用 https://p44-contacts.icloud.com:443/1331115018/carddavhome/,REPORT,DEPTH 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"

我该怎么办?

【问题讨论】:

    标签: icloud webdav carddav


    【解决方案1】:

    CardDAV home(您的https://p44-contacts.icloud.com:443/1331115018/carddavhome/)包含 CardDAV 集合(又名“通讯录”),而不是 vCard(包含联系人和联系人组)。你需要再跳一跳。

    您可以使用常规的PROPFIND Depth 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-queryaddressbook-multiget 报告进行查询,如果支持则使用 sync-report(iCloud 支持)或再次使用简单PROPFIND。取决于你想要什么。

    给定一个地址簿集合 URL,如果服务器支持,“真实”客户端通常会使用同步报告来获取所有更改对象的 URL,或者只获取所有包含的 vCard 的 URL、Content-Type 和 ETag使用 PROPFIND 作为后备。例如:

    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 或 multiget REPORT 进行检索。

    顺便说一句:在您的 addressbook-multiget REPORT 中,您没有列出任何 vCard URL,因此结果集将始终为空...您可以在 RFC 6352 中阅读有关 multiget 的信息。

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

    这是对 CardDAV 的精彩介绍:Building a CardDAV client。 或者 YouTube 上的这个:FOSDEM 2009 CalDAV

    【讨论】:

    • 感谢您的回复。但我仍然不知道应该使用什么 XML。你能分享更多吗?
    【解决方案2】:

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

    让我们在 REPORT 请求中试试这个。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-17
        • 2014-07-22
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        • 2017-07-11
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        相关资源
        最近更新 更多