Получение vCards из iCloud с использованием PHP

Искал через serverfault.com, stackru.com, apple.stackexchange.com, гуглил и все еще не далеко. Нужен кто-то, чтобы помочь.

Я пытаюсь получить все vCards от учетных записей iCloud.

Я начинаю с плагина от Roundcube/CardDav.

Из статей, таких как:

stackru.com/questions/24202551/manipulate-groups-in-icloud-with-carddav-protocol sabre.io/dav/building-a-carddav-client/ sabre.io/dav/clients/osx-addressbook/ stackru.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>

Далее, вот что я делаю, чтобы получить дом, используя "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: / / p44-contacts.icloud.com:443/1331115018/carddavhome/, ОТЧЕТ, ГЛУБИНА 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"

Что мне нужно сделать?

1 ответ

Дом CardDAV (ваш https://p44-contacts.icloud.com:443/1331115018/carddavhome/) содержит коллекции CardDAV (также называемые "адресными книгами"), а не визитные карточки (которые содержат контакты и группы контактов). Вам нужно сделать еще один прыжок.

Вы можете перечислить коллекции адресной книги в доме, используя обычный 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.

Коллекции, которые имеют addressbookresourcetype являются коллекциями адресной книги CardDAV и могут быть запрошены с помощью addressbook-query или же addressbook-multiget отчет, используя sync-report, если это поддерживается (iCloud поддерживает), или снова, используя простой PROPFIND, Зависит от того, чего вы хотите.

При наличии URL-адреса коллекции адресной книги "реальный" клиент обычно использует отчет синхронизации для получения URL-адресов всех измененных объектов, если сервер поддерживает это, или просто захватывает URL-адреса, Content-Type и ETag всех содержащихся vCards с помощью 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 или многократного отчета.

Кстати: в вашем addressbook-multigetREPORT Вы не перечисляете URL-адреса vCard, поэтому набор результатов всегда будет пустым... Вы можете прочитать о multiget в 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

Получение vCard: https://github.com/andig/carddav2fb - просто используйте команду загрузки:php carddav2fb download yourdownload.vcf

Другие вопросы по тегам