【问题标题】:Google Calendar API - Access own calendar via Service accountGoogle Calendar API - 通过服务帐户访问自己的日历
【发布时间】:2021-04-02 16:30:15
【问题描述】:

我想访问 Google 日历 API 以使用 Python 插入条目。我在 Google API 控制台上创建了一个服务帐户,添加了一个私钥,然后下载了它。

但是当我尝试修改日历的任何内容时,它在同一个帐户上,我收到以下错误消息。阅读作品。

代码是

import httplib2

from oauth2client.client import SignedJwtAssertionCredentials 
from apiclient.discovery import build

event = {
         'summary' : 'Appointment',
         'location' : 'Somewhere',
         'start' : {
                    'dateTime' : '2012-09-03T10:00:00.000-07:00'
                    },
         'end' :    {
                 'dateTime' : '2012-09-03T10:25:00.000-07:00'
                    }
}


f = file("key.p12", "rb")
key = f.read()
f.close()

credentials = SignedJwtAssertionCredentials(
                                                service_account_name='423291807109-XXXXXXXXXXXXXXXXxx@developer.gserviceaccount.com',
                                                private_key=key,

                                                scope='https://www.googleapis.com/auth/calendar'                                            
                                            )

http = httplib2.Http()
http = credentials.authorize(http)

service = build('calendar', 'v3', http=http)
request = service.events().insert(calendarId='XXXXXXXXXXXXXXXXXX@group.calendar.google.com', body=event)

response = request.execute()

print(response)

错误信息是:

apiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/XXXXXXXXXXXXXXXXXXX@group.calendar.google.com/events?alt=json returned "Forbidden">

我原以为我可以使用此服务帐户访问我自己的数据,但似乎不是。

Google 声称

创建服务帐户后,您还可以访问 到与私钥关联的客户端 ID。你将需要两者 在编写应用程序时。 - https://developers.google.com/accounts/docs/OAuth2?hl=de#scenarios

我用谷歌搜索了大约 2 小时,但似乎记录得很糟糕。有没有一种方法可以通过 Google Calendar API 插入新事件而无需用户交互(又名 3-legged OAuth),或者有什么方法可以解决它?

我刚刚发现已弃用的 ClientLoging。为什么 Google 让这件事变得如此困难?

亲切的问候

【问题讨论】:

    标签: python api authentication calendar google-api-python-client


    【解决方案1】:

    我意识到,如果将生成的凭据转储到 JSON 并在每次需要时读取它们,三步 OAuth 就可以工作。

    所以流程是: 将您的 client_secrets.json 添加到与此脚本相同的文件夹中,如 Google API 所述。从提示中给出的 url 中获取密钥。根据提示输入它。派对!11。我希望这些凭据永远存在。

    from oauth2client.client import flow_from_clientsecrets
    
    flow = flow_from_clientsecrets('client_secrets.json',
                                   scope='https://www.googleapis.com/auth/calendar',
                                   redirect_uri='urn:ietf:wg:oauth:2.0:oob')
    
    auth_uri = flow.step1_get_authorize_url()
    print('Visit this site!')
    print(auth_uri)
    code = raw_input('Insert the given code!')
    credentials = flow.step2_exchange(code)
    print(credentials)
    
    with open('credentials', 'wr') as f:
        f.write(credentials.to_json())
    

    现在,在应用程序本身中:

    def __create_service():
        with open('credentials', 'rw') as f:
            credentials = Credentials.new_from_json(f.read())
    
        http = httplib2.Http()
        http = credentials.authorize(http)
    
        return build('calendar', 'v3', http=http)
    

    要获取服务对象,现在可以调用

    service = __create_service()
    

    并在其上使用 API。

    【讨论】:

    • 我遵循了您的解决方案,并且我的凭据在文件中没有。你能告诉我如何从那个文件中加载那些然后使用credentials.authorize()
    • 我很久以前写过一个例子,你可以在github.com/Rentier/ReindeerIkenga找到它
    猜你喜欢
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2017-03-01
    相关资源
    最近更新 更多