我正在使用Google People API访问我的联系人。
我在Google Developers Console中激活了它,并创建了一个项目,一个服务帐户(以....iam.gserviceaccount.com
结尾)和一个以JSON格式存储的身份验证密钥。
当我访问联系人时,似乎会将我的服务帐户地址而非我的Google帐户的联系人列为空列表。
如何告诉API使用我的帐户而不是服务帐户?
这是我到目前为止的代码:
from google.oauth2 import service_account
from googleapiclient.discovery import build
# pip install google-auth google-auth-httplib2 google-api-python-client
SCOPES = ['https://www.googleapis.com/auth/contacts.readonly']
KEY = '~/private.json'
credentials = service_account.Credentials.from_service_account_file(
KEY, scopes=SCOPES)
service = build(
serviceName='people', version='v1', credentials=credentials)
connections = service.people().connections().list(
resourceName='people/me', personFields='names').execute()
print(connections)
# result: {}
答案 0 :(得分:4)
服务帐户不您的服务帐户是虚拟用户,它拥有自己的谷歌驱动器帐户,谷歌日历和显然谷歌联系人。您看到空结果集的原因是您尚未向服务帐户帐户添加任何联系人。
服务帐户通常用于授予对开发人员拥有的数据的访问权限。例如,您可以使用服务帐户电子邮件地址并在Google云端硬盘上共享您的某个文件夹,然后它就可以访问您的Google云端硬盘帐户中的该文件夹。您可以使用谷歌日历执行相同的操作。
有些api不能让您与其他用户分享您的数据。 Youtube,adwords,博主和谷歌联系人等等。
您无法使用服务帐户访问您的个人Google通讯录。您最好的选择是使用oauth2对您的应用程序进行身份验证,然后以这种方式访问它们。
答案 1 :(得分:0)
不是 Python 专家,但我刚刚完成了 OP 在 .NET 中讨论的任务,我很确定它也适用于 Python。
所以看起来所有需要做的是delegating domain-wide authority to the SA。 IE。为您的 SA 分配所需的范围,在我的情况下是 https://www.googleapis.com/auth/contacts.readonly
。
然后您应该拨打电话并指定您要模拟的帐户(从 here 中获取 python 示例)
from google.oauth2 import service_account
SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = '/path/to/service.json'
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
# this is the line you apparently were missing
delegated_credentials = credentials.with_subject('user@example.org')
然后您就可以进行 people/me
调用了。正如我所说,在 .NET 中为我工作。