Google Calendar API - 通过服务帐户访问自己的日历

时间:2012-09-03 18:35:27

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

我想访问Google Calendar 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

我用Google搜索了大约2个小时,但似乎记录得非常糟糕。有没有办法在没有用户互动的情况下通过Google Calendar API插入新活动(又称三条腿OAuth),还是有办法解决这个问题?

我刚发现已弃用的ClientLoging。谷歌为何如此困难?

亲切的问候

1 个答案:

答案 0 :(得分:1)

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

所以流程是: 将Google API中所述的 client_secrets.json 添加到与此脚本相同的文件夹中。从提示中给出的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​​。