Merge pull request #21 from kirk24788/master
Support for Contacts service
This commit is contained in:
commit
c50f74e7d3
3 changed files with 63 additions and 1 deletions
|
@ -8,7 +8,8 @@ from pyicloud.exceptions import PyiCloudFailedLoginException
|
|||
from pyicloud.services import (
|
||||
FindMyiPhoneServiceManager,
|
||||
CalendarService,
|
||||
UbiquityService
|
||||
UbiquityService,
|
||||
ContactsService
|
||||
)
|
||||
|
||||
|
||||
|
@ -72,6 +73,12 @@ class PyiCloudService(object):
|
|||
)
|
||||
self.params.update({'id': sha.hexdigest().upper()})
|
||||
|
||||
clientId = str(uuid.uuid1()).upper()
|
||||
self.params.update({
|
||||
'clientBuildNumber': '14E45',
|
||||
'clientId': clientId,
|
||||
})
|
||||
|
||||
def authenticate(self):
|
||||
"""
|
||||
Handles the full authentication steps, validating,
|
||||
|
@ -126,6 +133,11 @@ class PyiCloudService(object):
|
|||
service_root = self.webservices['calendar']['url']
|
||||
return CalendarService(service_root, self.session, self.params)
|
||||
|
||||
@property
|
||||
def contacts(self):
|
||||
service_root = self.webservices['contacts']['url']
|
||||
return ContactsService(service_root, self.session, self.params)
|
||||
|
||||
def __unicode__(self):
|
||||
return 'iCloud API: %s' % self.user.get('apple_id')
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
from pyicloud.services.calendar import CalendarService
|
||||
from pyicloud.services.findmyiphone import FindMyiPhoneServiceManager
|
||||
from pyicloud.services.ubiquity import UbiquityService
|
||||
from contacts import ContactsService
|
||||
|
|
49
pyicloud/services/contacts.py
Normal file
49
pyicloud/services/contacts.py
Normal file
|
@ -0,0 +1,49 @@
|
|||
from __future__ import absolute_import
|
||||
import os
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from calendar import monthrange
|
||||
|
||||
|
||||
class ContactsService(object):
|
||||
"""
|
||||
The 'Contacts' iCloud service, connects to iCloud and returns contacts.
|
||||
"""
|
||||
def __init__(self, service_root, session, params):
|
||||
self.session = session
|
||||
self.params = params
|
||||
self._service_root = service_root
|
||||
self._contacts_endpoint = '%s/co' % self._service_root
|
||||
self._contacts_refresh_url = '%s/startup' % self._contacts_endpoint
|
||||
self._contacts_changeset_url = '%s/changeset' % self._contacts_endpoint
|
||||
|
||||
def refresh_client(self, from_dt=None, to_dt=None):
|
||||
"""
|
||||
Refreshes the ContactsService endpoint, ensuring that the
|
||||
contacts data is up-to-date.
|
||||
"""
|
||||
host = self._service_root.split('//')[1].split(':')[0]
|
||||
self.session.headers.update({'host': host})
|
||||
params_contacts = dict(self.params)
|
||||
params_contacts.update({
|
||||
'clientVersion': '2.1',
|
||||
'locale': 'en_US',
|
||||
'order': 'last,first',
|
||||
})
|
||||
req = self.session.get(self._contacts_refresh_url, params=params_contacts)
|
||||
self.response = req.json()
|
||||
params_refresh = dict(self.params)
|
||||
params_refresh.update({
|
||||
'prefToken': req.json()["prefToken"],
|
||||
'syncToken': req.json()["syncToken"],
|
||||
})
|
||||
self.session.post(self._contacts_changeset_url, params=params_refresh)
|
||||
req = self.session.get(self._contacts_refresh_url, params=params_contacts)
|
||||
self.response = req.json()
|
||||
|
||||
def all(self):
|
||||
"""
|
||||
Retrieves all contacts.
|
||||
"""
|
||||
self.refresh_client()
|
||||
return self.response['contacts']
|
Loading…
Reference in a new issue