0

我正在使用设备的序列号作为参考,通过 Google Admin Directory API 检索 ChromeOS 设备 MAC 地址,并通过 apiclient.

service = discovery.build('admin', 'directory_v1', developerKey=settings.API_KEY)

以下是 ChromeOS 设备可用的调用;我的问题是我需要一个设备 ID 才能执行以下操作:

service.chromeosdevices().get(customerId=settings.CID, deviceId=obtained_id, projection=None).execute()

我可以通过以下格式发送 GET 查询:

https://www.googleapis.com/admin/directory/v1/customer/my_customer/devices/chromeos?projection=full&query=id:" + serial + "&orderBy=status&sortOrder=ascending&maxResults=10", "GET")

...但我试图避免使用 OAuth2,而只使用我的 API 密钥。传递key请求GET也不起作用,因为它仍然返回“需要登录”通知。

如何将上述查询压缩成apiclient友好的格式?我通过上述调用找到的唯一选择是请求我们拥有的每台设备(通过list),然后筛选大量数据以获取匹配的序列号,这似乎很愚蠢和过度。

我确实注意到我可以调用apiclient.http.HttpRequests,但我也找不到通过它传递 API 密钥的方法。有new_batch_http_request,但我无法从文档中辨别出如何简单地将 URL 传递给它。

谢谢!

4

1 回答 1

0

知道了!

您不能只使用一个密钥进行目录 API 查询,您需要一个服务帐户。

我正在使用google-auth请参阅此处),因为oauth2client已弃用。

您还需要:

像这样获取您的凭据:

credentials = service_account.Credentials.from_service_account_file(
    settings.CLIENT_KEY,
    scopes=settings.SCOPES,
    subject=settings.ADMIN_USER)

其中 ADMIN_USER 是授权域管理员的电子邮件地址。

然后你像这样发送一个 GET 请求:

authed_session = AuthorizedSession(credentials)
response = authed_session.get(request_id_url)

这将返回一个Requests对象,您可以通过 读取response.content

希望它可以帮助别人!

于 2017-11-30T01:16:22.243 回答