8

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">

このサービスアカウントで自分のデータにアクセスできると思っていたのですが、そうではないようです。

グーグルはそれを主張します

サービスアカウントが作成されると、秘密鍵に関連付けられたクライアントIDにもアクセスできるようになります。アプリケーションをコーディングするときは、両方が必要になります。-https://developers.google.com/accounts/docs/OAuth2?hl = de#scenarios

私は約2時間グーグルで検索しましたが、それは非常に悪い記録になっているようです。ユーザーの操作なしでGoogleカレンダーAPIを介して新しいイベントを挿入する方法(別名3本足のOAuth)はありますか、それとも修正する方法はありますか?

非推奨のClientLogingを見つけました。なぜグーグルはそれをそんなに難しくしているのですか?

敬具

4

1 に答える 1

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 を使用します。

于 2012-09-04T18:50:34.237 に答える