2017-01-20 18 views
0

Искал thru serverfault.com, stackoverflow.com, apple.stackexchange.com, googled и до сих пор не уходит далеко. Нужна помощь кому-то.Получение vCards из iCloud с использованием PHP

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

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

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

stackoverflow.com/questions/24202551/manipulate-groups-in-icloud-with-carddav-protocol sabre.io/dav/building-a-carddav- клиент/ 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, ГЛУБИНА 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> 

Далее, вот что мне делать, чтобы получить дом, USI нг "HTTPS://contacts.icloud.com/1331115018/principal/", PROPFIND, глубина 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> 

Наконец, вот что я делаю, чтобы попытаться получить все VCards, используя 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>"[email protected]=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" 

Что д o Мне нужно делать?

ответ

0

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

Вы можете перечислить коллекцию адресной книги в доме с помощью обычной 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 и могут быть запрошены с помощью addressbook-query или addressbook-multiget отчет, используя в sync-report, если это поддерживается (ICloud делает) или снова с помощью простого PROPFIND. Зависит от того, чего вы хотите.

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

BTW: В вашем addressbook-multigetREPORT вы не указываете URL-адрес vCard, поэтому набор результатов всегда будет пустым ... Вы можете прочитать о мультигете в RFC 6352.

Примечание: В iCloud обычно есть только одна коллекция адресных книг в доме, но на других серверах довольно часто бывает несколько. Также на некоторых серверах дома CalDAV и CardDAV являются одной и той же коллекцией (т. Е. Не забудьте проверить resourcetype подкатегорий в соответствующих домашних коллекциях).

Это отличное введение на CardDAV: Building a CardDAV client. Или этот на YouTube: FOSDEM 2009 CalDAV.

+0

Thx для ответа. Но я до сих пор не знаю, какой XML я должен использовать. Можете ли вы поделиться больше? – charleslcso