picklepete / pyicloud

A Python + iCloud wrapper to access iPhone and Calendar data.
MIT License
2.45k stars 437 forks source link

Reminders doesn't work for iOS13 (404 response) #406

Open ghost opened 1 year ago

ghost commented 1 year ago

The problem

Calling api.reminders.post() returns a 404 error

Environment

Traceback/Error logs

<Response [404]>

Additional information

When I do the refresh method and look at the data retrieved from the endpoint /rd/startup I get: {'Collections': [...], 'Reminders': [ ... 'startDateIsAllDay': True, 'title': 'Where are my reminders?'}, { ... 'startDateIsAllDay': True, 'title': 'The creator of this list has upgraded these ' 'reminders.'}]}

russinnes commented 7 months ago

Same thing here - but an additional point with the current source and reminders:

Calling the api.reminders as is would result in:

pyicloud.exceptions.PyiCloudAPIResponseException: Authentication required for Account. (421)

Specifically, as identified in #330 , the 'dsid' parameter needs to be added when the reminders api call is made:

def refresh(self): """Refresh data.""" params_reminders = dict(self._params) params_reminders.update( {"clientVersion": "4.0", "lang": "en-us", "usertz": get_localzone_name(), "dsid": self.session.service.data["dsInfo"]["dsid"] <---- This key/value })

^-- Adding the 'dsid' key and associated object to the 'params_reminders.update' dictionary got around the auth error (in services/reminders.py)

So now that the reminders call is working, the returned value when calling 'api.reminders.lists' is as follows: {'Somelistname': [{'title': 'The creator of this list has upgraded these reminders.', 'desc': 'Learn more here: https://support.apple.com/HT210220', 'due': None},.... for each individual list. This follows what we knew when Apple updated Reminders a few years back. So more-or-less, the above patch to services/reminders.py is required to get the API call to function, but the returned data no longer works for anyone who was upgraded their Reminders app(s) in the last 2 years.

FWIW - calling api.reminders.collections does seem to return the appropriate list structure and accompanying GUID.