在没有人机交互的情况下使用日历API

2024-09-28 01:25:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从谷歌日历中获取事件,而不向用户提示同意页面。 我为此使用了一个服务帐户(包含所有数据的json文件)

但是当我运行脚本时,我得到了这个

from google.oauth2 import service_account
import googleapiclient.discovery
import time
import jwt

SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']
SERVICE_ACCOUNT_FILE = '/Users/user/Downloads/XXXXXXXX.json'

credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)

service = googleapiclient.discovery.build('calendar', 'v3', credentials=credentials)

page_token = None
calendar_list_entry = service.calendarList().get(calendarId='XXXXXXXXXXX@group.calendar.google.com').execute()

Traceback (most recent call last): File "/Users/user/Downloads/blender.py", line 16, in calendar_list_entry = service.calendarList().get(calendarId='XXXXXXX@group.calendar.google.com').execute() File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/googleapiclient/_helpers.py", line 131, in positional_wrapper return wrapped(*args, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/googleapiclient/http.py", line 937, in execute raise HttpError(resp, content, uri=self.uri) googleapiclient.errors.HttpError: <HttpError 404 when requesting https://www.googleapis.com/calendar/v3/users/me/calendarList/XXXXXXXX%40group.calendar.google.com?alt=json returned "Not Found". Details: "[{'domain': 'global', 'reason': 'notFound', 'message': 'Not Found'}]">`


Tags: inpyimportcomjsonexecuteservicegoogle
1条回答
网友
1楼 · 发布于 2024-09-28 01:25:59

为了将Google Calendar与服务帐户一起使用,您必须对您的workspace account设置域范围的权限

请求错误消息时,您将收到一条HttpError 404,因为您没有正确地将服务帐户委派给您域中有权访问该日历的用户,因此该服务帐户没有访问权限

在下面的代码示例中,仔细查看第credentials = credentials.create_delegated(user_email)行,这是您希望将服务帐户权限委托给的域上的用户

from googleapiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

# Email of the Service Account
SERVICE_ACCOUNT_EMAIL = '<some-id>@developer.gserviceaccount.com'

# Path to the Service Account's Private Key file
SERVICE_ACCOUNT_PKCS12_FILE_PATH = '/path/to/<public_key_fingerprint>-privatekey.p12'

def create_directory_service(user_email):
    """Build and returns an Calendar service object authorized with the service accounts
    that act on behalf of the given user.

    Args:
      user_email: The email of the user. Needs permissions to access the calendar APIs.
    Returns:
      Calendar service object.
    """

    credentials = ServiceAccountCredentials.from_p12_keyfile(
        SERVICE_ACCOUNT_EMAIL,
        SERVICE_ACCOUNT_PKCS12_FILE_PATH,
        'notasecret',
        scopes=['https://www.googleapis.com/auth/calendar'])

    credentials = credentials.create_delegated(user_email)

    return build('calendar', 'v3', credentials=credentials)

Json密钥文件。有一个使用json密钥文件here的库示例,它不包括您需要添加该行的委托

请记住,服务帐户仅适用于google workspace域。它不适用于标准的谷歌日历帐户

相关问题 更多 >

    热门问题