2012-09-03 165 views
7

我想訪問Google Calendar API以使用Python插入條目。我在Google API控制檯上創建了一個服務帳號,添加了一個私鑰,並將其下載。Google Calendar 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='[email protected]', 
               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='[email protected]', body=event) 

response = request.execute() 

print(response) 

錯誤消息:

apiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/calendar/v3/calendars/[email protected]/events?alt=json returned "Forbidden"> 

我本來以爲我可以用這個服務帳戶訪問自己的數據,但它似乎不是。

谷歌稱,該服務帳戶已創建

後,您還將有機會 與私鑰相關聯的客戶端ID。編碼您的應用程序時,您將需要 。 - https://developers.google.com/accounts/docs/OAuth2?hl=de#scenarios

我搜索了大約2個小時,但它似乎記錄非常糟糕。有沒有一種方法可以在沒有用戶交互的情況下通過Google Calendar API插入新事件(又名3腳OAuth)還是有辦法解決這個問題?

我剛剛發現不推薦使用ClientLoging。爲什麼Google讓它變得困難?

親切的問候

回答

1

我意識到,3階梯式OAuth的工作,如果一個轉儲導致憑據JSON,並在每個你需要的時候讀取它們。

所以流程是: 添加您的client_secrets.json在同一文件夾這個腳本上Google API說。從提示中給出的網址抓取密鑰。根據請求輸入它以提示。黨!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​​就可以了。

+0

我跟隨你的解決方案,我的憑證在文件中是noe。你能告訴我如何加載那些文件,然後使用'credentials.authorize()'。 – user26

+0

我很久以前寫過一個例子,你可以在https://github.com/Rentier/ReindeerIkenga找到它 – reindeer

相關問題