pyicloud icon indicating copy to clipboard operation
pyicloud copied to clipboard

Authentication required for Account. (421) when trying to query api.calendar.events()

Open radoystoyanov opened this issue 4 years ago • 15 comments

The problem

I'm trying to retrieve calendar data from iCloud. I can authenticate successfully using the sample 2fa/2sa code. I can successfully call some of the APIs such as api.iphone.location(). However, when trying the following code, I get an error "pyicloud.exceptions.PyiCloudAPIResponseException: Authentication required for Account. (421)".

from_dt = datetime(2021, 3, 27)
to_dt = datetime(2021, 3, 28)
events = api.calendar.events(from_dt, to_dt)

Environment

  • pyiCloud release with the issue (pip show pyicloud): 0.10.2
  • Last working pyiCloud release (if known): N/A
  • Service causing this issue:
  • Python version (python -V): Python 3.7.1 64-bit
  • Operating environment (project deps/Docker/Windows/etc.): macOS 11.2.3

Traceback/Error logs

DEBUG:pyicloud.services.calendar.http:GET https://p17-calendarws.icloud.com:443/ca/events 
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): p17-calendarws.icloud.com:443
DEBUG:urllib3.connectionpool:https://p17-calendarws.icloud.com:443 "GET /ca/events?lang=en-us&usertz=Europe%2FSofia&startDate=2021-03-27&endDate=2021-03-28 HTTP/1.1" 421 0
DEBUG:pyicloud.base:Saved session data to file
DEBUG:pyicloud.base:Cookies saved to /var/folders/vj/x_87xd5j5tz71ntl61101tfm0000gn/T/pyicloud/XXXXXX/XXXXXX
DEBUG:pyicloud.services.calendar.http:Misdirected Request (421). Retrying ...
DEBUG:requests.sessions.http:GET https://p17-calendarws.icloud.com:443/ca/events 
DEBUG:urllib3.connectionpool:https://p17-calendarws.icloud.com:443 "GET /ca/events?lang=en-us&usertz=Europe%2FSofia&startDate=2021-03-27&endDate=2021-03-28 HTTP/1.1" 421 0
DEBUG:pyicloud.base:Saved session data to file
DEBUG:pyicloud.base:Cookies saved to /var/folders/vj/x_87xd5j5tz71ntl61101tfm0000gn/T/pyicloud/XXXXXX/XXXXXX
ERROR:pyicloud.base:Authentication required for Account. (421)
Traceback (most recent call last):
  File "/Users/radoystoyanov/Documents/Code/alchemy-pipeline/calendars/icloud.py", line 67, in <module>
    events = api.calendar.events(from_dt, to_dt)
  File "/Users/radoystoyanov/Documents/Code/alchemy-pipeline/calendars/lib/python3.7/site-packages/pyicloud/services/calendar.py", line 65, in events
    self.refresh_client(from_dt, to_dt)
  File "XXXXXX/lib/python3.7/site-packages/pyicloud/services/calendar.py", line 58, in refresh_client
    req = self.session.get(self._calendar_refresh_url, params=params)
  File "XXXXXX/lib/python3.7/site-packages/requests/sessions.py", line 555, in get
    return self.request('GET', url, **kwargs)
  File "XXXXXX/lib/python3.7/site-packages/pyicloud/base.py", line 128, in request
    return self.request(method, url, **kwargs)
  File "XXXXXX/lib/python3.7/site-packages/pyicloud/base.py", line 130, in request
    self._raise_error(response.status_code, response.reason)
  File "XXXXXX/lib/python3.7/site-packages/pyicloud/base.py", line 186, in _raise_error
    raise api_error
pyicloud.exceptions.PyiCloudAPIResponseException: Authentication required for Account. (421)

Additional information

I have including additional debug logging using:

logging.basicConfig(level=logging.DEBUG)

Thanks in advance for your support!

radoystoyanov avatar Mar 27 '21 12:03 radoystoyanov

My script needed a verification code today and hit this error for the first time. While writing a simple test script to show the issue and was reminded that it uses cookies; I got curious and found two files in the directory, {foo} and {foo}.session (where {foo} is an appleid email address with punctuation removed). After removing these files I was able to re-authenticate (after satisfying the verification challenge of course).

leres avatar May 02 '21 17:05 leres

That didn't work for me, and the same happens for me with the reminders service ... the fmip and contacts services, however, seem to work just fine ...

Any chance one of the contributors can guide us to how we can debug this further?

One thing I found interesting, not sure if related to the above issue, is that the api.requires_2fa and api.requires_2sa both return False while my appleid settings show TWO-FACTOR AUTHENTICATION as "On". Though, why would the contacts service returns info without further 2fa? Note that I use a keyring, but I also tried instantiating PyiCloudService with a password directly, to no avail.

asfaltboy avatar May 08 '21 11:05 asfaltboy

A duplicate of #322. (Also experiencing the same issue.)

pali6 avatar May 21 '21 08:05 pali6

Same thing for me.

Cyberbird85 avatar Jul 01 '21 13:07 Cyberbird85

Having the same issue. Would really love to find a solution here.

dexma-dev avatar Nov 04 '21 13:11 dexma-dev

Same here

tomx-sh avatar Nov 12 '21 21:11 tomx-sh

Same issue here

plk avatar Dec 01 '21 19:12 plk

Same here

xaoyaoo avatar Dec 03 '21 00:12 xaoyaoo

After comparing the request fired at browser to the payload generated at pyicloud, i found that param dsid is lost and it causes 419 http error.

To fix the problem, you can append the following code to pyicloud/services/calendar.py:L55

        params.update(
            {
                "lang": "en-us",
                "usertz": get_localzone().zone,
                "startDate": from_dt.strftime("%Y-%m-%d"),
                "endDate": to_dt.strftime("%Y-%m-%d"),
                "dsid": self.session.service.data["dsInfo"]["dsid"],  # PATCH HERE!!
            }
        )

zarkin404 avatar Dec 22 '21 17:12 zarkin404

Many thanks @zarkin404 - that fixed it for me but needed to be patched on line 83 also.

plk avatar Dec 22 '21 18:12 plk

Thank you very much

xaoyaoo avatar Dec 23 '21 00:12 xaoyaoo

The monkeypatch is working for me. If this is generally a working solution, please merge soon.

clstaudt avatar Jan 04 '22 13:01 clstaudt

Happening for me today after monkey patching the suggested. Anyone else seeing this?

WillPeak avatar May 08 '22 12:05 WillPeak

I'm sorry fix didn't work for me on Python 3.9.2

File "/home/pi/python/./icloudlogin.py", line 62, in print(api.calendar.events(from_dt, to_dt)) File "/home/pi/.local/lib/python3.9/site-packages/pyicloud/services/calendar.py", line 64, in events self.refresh_client(from_dt, to_dt) File "/home/pi/.local/lib/python3.9/site-packages/pyicloud/services/calendar.py", line 57, in refresh_client req = self.session.get(self._calendar_refresh_url, params=params) File "/usr/lib/python3/dist-packages/requests/sessions.py", line 555, in get return self.request('GET', url, **kwargs) File "/home/pi/.local/lib/python3.9/site-packages/pyicloud/base.py", line 131, in request return self.request(method, url, **kwargs) File "/home/pi/.local/lib/python3.9/site-packages/pyicloud/base.py", line 133, in request self._raise_error(response.status_code, response.reason) File "/home/pi/.local/lib/python3.9/site-packages/pyicloud/base.py", line 189, in _raise_error raise api_error pyicloud.exceptions.PyiCloudAPIResponseException: Authentication required for Account. (421)

ffHakke avatar Sep 12 '22 18:09 ffHakke

I did the patch, but I'm now getting pyicloud.exceptions.PyiCloudAPIResponseException: Authentication required for Account. (500)

Which is different as the error code is 500. Still not working, really need a solution.

WhyNineKay avatar Mar 27 '23 08:03 WhyNineKay