【问题标题】:How do I resolve the AttributeError: 'Resource' object has no attribute in Google API?如何解决 AttributeError:“资源”对象在 Google API 中没有属性?
【发布时间】:2020-11-20 03:32:20
【问题描述】:

对于完整的上下文,我是脚本的新手。我正在尝试使用 Google 的 API 从 Google Admin 获取完整的用户列表,但我什至很难通过其中的 build() 部分。无论我在service 上标记什么,它都没有那个属性,除了close()

我的最终目标是获得用户、用户别名和组名的完整列表,以便在创建/分配之前检查它们是否已经存在。不幸的是,我被困在了这个障碍上。

我正在尝试使用的 API:https://developers.google.com/admin-sdk/directory

代码:

 #!/usr/local/bin/env python3

import json
import os
import googleapiclient.discovery
from google.oauth2 import service_account

SCOPES = ['https://www.googleapis.com/auth/admin.directory.user.readonly',
'https://www.googleapis.com/auth/admin.directory.user.alias.readonly',
'https://www.googleapis.com/auth/admin.directory.group.readonly']
SERVICE_ACCOUNT_FILE = os.get.environ('SERVICE_ACCOUNT_FILE')

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

service = googleapiclient.discovery.build('admin', 'directory_v1', credentials=credentials)

如果我只是尝试使用service.execute() 执行它,这是我一直遇到的错误:

   Traceback (most recent call last):
      File "test.py", line 17, in <module>
        service.execute()
    AttributeError: 'Resource' object has no attribute 'execute'

如果我在没有任何东西的情况下运行它,就在service = ... 行之后,它不会吐出错误,所以我假设服务帐户文件是正确的。

【问题讨论】:

  • 欢迎来到 SO。请包括所有相关代码和完整的回溯错误。
  • googleapiclient.discovery.build() 返回一个 Resource 对象,它没有 execute 方法。请阅读developers.google.com/docs/api/quickstart/python
  • 嗨@ewong!感谢您的回复!这就是整个代码,我刚刚开始使用它。此外,这是我运行$python test.py 时的完整回溯错误我在寻找什么对象?你发给我的链接与document = service.documents().get(documentId=DOCUMENT_ID).execute() 做类似的事情我在哪里可以找到我可以从service 调用的函数?

标签: python google-api google-admin-sdk


【解决方案1】:

build 返回的service 变量对应于class Resource

此类可用于与您在构建服务时指定的 API 进行交互。根据这些参数,service 将有特定的 API 方法可供使用,但execute() 不是其中之一。

由于您正在为Directory API 构建服务,这些将是与此 API 交互的相应方法:

例如,如果您想调用 Users: list 以列出您域中的所有用户,您可以执行以下操作:

service = googleapiclient.discovery.build('admin', 'directory_v1', credentials=getCreds())
response = service.users().list(domain="YOUR_DOMAIN").execute()

【讨论】:

  • 非常感谢@lamblichus 提供这些资源和示例代码!这正是我在寻找时遇到的麻烦。然后我可以将response 转换为 JSON 还是自动转换为 JSON?
  • @hyphalos 响应已经是 JSON 格式了,不需要再做转换。另外,请考虑accepting this answer,如果它解决了您的问题。
  • @hyphalos 这是您将获得的响应正文:ref。例如,您可以通过以下操作访问第一个用户的电子邮件地址:response["users"][0]["primaryEmail"]
  • @lamblichus,非常感谢!现在这对我来说很有意义,我终于可以继续努力了。我可能只使用get 方法,因为它同时搜索主要电子邮件和别名电子邮件,如果没有您采购文档,就不会找到该方法。非常感激!我接受了你的回答。
  • @hyphalos 不客气!很高兴您的问题得到了解决。
猜你喜欢
  • 2018-10-04
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
  • 2017-09-27
  • 2021-08-25
相关资源
最近更新 更多