为什么收到“客户端错误:403客户端错误:...错误消息:访问被拒绝请检查凭据,然后重试”

问题描述

我正在尝试从Outlook获取日历数据,所以我有以下代码

from O365 import Account,MSGraPHProtocol
import datetime as dt

CLIENT_ID = 'f8384621-1095-4519-8999-0c7e616b7bc8'
SECRET_ID = '.s03m-t9u2q_9.Lpim5F.DTL-F1u4MBQy6'

credentials = (CLIENT_ID,SECRET_ID)

protocol = MSGraPHProtocol()
#protocol = MSGraPHProtocol(defualt_resource='<sharedcalendar@domain.com>')
scopes = ['User.Read']
account = Account(credentials,protocol=protocol)

if account.authenticate(scopes=scopes):
   print('Authenticated!')

schedule = account.schedule()
calendar = schedule.get_default_calendar()
events = calendar.get_events(include_recurring=False)
# events = calendar.get_events(query=q,include_recurring=True)


for event in events:
    print(event)

但不幸的是,在成功通过身份验证后,还会出现以下错误

Client Error: 403 Client Error: Forbidden for url: https://graph.microsoft.com/v1.0/me/calendar | Error Message: Access is denied. Check credentials and try again.
Traceback (most recent call last):
  File "C:/Users/username/Documents/pycharmproba/main.py",line 18,in <module>
    calendar = schedule.get_default_calendar()
  File "C:\Users\username\Documents\pycharmproba\venv\lib\site-packages\O365\calendar.py",line 1942,in get_default_calendar
    response = self.con.get(url)
  File "C:\Users\username\Documents\pycharmproba\venv\lib\site-packages\O365\connection.py",line 805,in get
    return self.oauth_request(url,'get',params=params,**kwargs)
  File "C:\Users\username\Documents\pycharmproba\venv\lib\site-packages\O365\connection.py",line 794,in oauth_request
    return self._internal_request(self.session,url,method,line 756,in _internal_request
    raise HTTPError('{} | Error Message: {}'.format(e.args[0],error_message),response=response) from None
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://graph.microsoft.com/v1.0/me/calendar | Error Message: Access is denied. Check credentials and try again.

解决方法

您尚未添加访问日历事件的范围。将以下范围添加到您的代码中,然后重试。

protocol = MSGraphProtocol()    
scopes = ['User.Read'] 
calendar_scopes = protocol.get_scopes_for('calendar_all')
scopes.extend(calendar_scopes)
account = Account(credentials,protocol=protocol)

if account.authenticate(scopes=scopes):
    print('Authenticated!')

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...