Google REST HTTP 请求传递的属性比 google-api-python-client Python 请求多

Google REST HTTP request delivers more properties than google-api-python-client Python request

如果我像这样直接使用 HTTP REST 接口发出请求:

GET https://www.googleapis.com/drive/v2/files/1el16TSNYvaGQndXXDZjheN_CANnWbA9wSA?key={YOUR_API_KEY}

我获得了文件的一组元数据,其中包含文件 properties 元素等。相反,我使用 Python 库调用驱动器 API,如下所示:

md = service.files().get(fileId='1el16TSNYvaGQndXXDZjheN_CANnWbA9wSA').execute()

我在 md 中得到了一个字典,其中包含的数据集要有限得多,properties 等都丢失了。我没有表达字段过滤。

这是 Google Python 库的限制还是我需要设置一些选项?

更新: 根据评论,我回去检查了身份验证。我直接使用 Google 食谱中的 Oauth2 和完整的授权范围 ('https://www.googleapis.com/auth/drive')。下面的代码(我认为)是演示结果所需的最少代码。

import httplib2
import os
import json

from apiclient import discovery
import oauth2client
from oauth2client import client
from oauth2client import tools

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

SCOPES = 'https://www.googleapis.com/auth/drive'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Other Client 1'


def get_credentials():
    home_dir = os.path.expanduser('~')
    credential_dir = os.path.join(home_dir, '.credentials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir, 'drive-tagger.json')
    store = oauth2client.file.Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else: # Needed only for compatability with Python 2.6
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials


def main():
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('drive', 'v2', http=http)

    md = service.properties().list(fileId='1el16TSNYvaGQndXXDZjheN_CANnWbA9wSA').execute()
    print "properties().list() returns:"
    print json.dumps(md, indent=4)
    print "***Done***"

if __name__ == '__main__':
    main()

如果我 运行 这样做,我会收到一个身份验证浏览器弹出窗口,并向我在 API 资源管理器中使用的同一域进行身份验证。结果是这样的:

Authentication successful.
Storing credentials to C:\Users\scott_jackson\.credentials\drive-tagger.json
properties().list() returns:
{
    "items": [], 
    "kind": "drive#propertyList", 
    "etag": "\"amKkzAMv_fUBF0Cxt1a1WaLm5Nk/vyGp6PvFo4RvsFtPoIWeCReyIC8\"", 
    "selfLink": "https://www.googleapis.com/drive/v2/files/1el16TSNYvaGQndXXDZjheN_CANnWbA9wSA/properties?alt=json"
}
***Done***

请注意 "items" 为空。 但是,如果我使用 API 资源管理器,并在同一个域中进行身份验证并请求相同的 fileId,我将得到:

{
 "kind": "drive#propertyList",
 "etag": "\"amKkzAMv_fUBF0Cxt1a1WaLm5Nk/BEYHBcaVZiElhupVVaqT2nEhnc0\"",
 "selfLink": "https://www.googleapis.com/drive/v2/files/1el16TSNYvaGQndXXDZjheN_CANnWbA9wSA/properties",
 "items": [
  {

   "kind": "drive#property",
   "etag": "\"amKkzAMv_fUBF0Cxt1a1WaLm5Nk/Mg7GWY95vfY7E-2gvlxRbl7MLDk\"",
   "selfLink": "https://www.googleapis.com/drive/v2/files/1el16TSNYvaGQndXXDZjheN_CANnWbA9wSA/properties/md5sum?visibility=PRIVATE",
   "key": "md5sum",
   "visibility": "PRIVATE",
   "value": "a61b0d91a294364b0c4eebb3ee83c09a"
  }
 ]
}

其中有我要找的'items'

如有任何见解,我们将不胜感激。

您应该检查属性端点:

https://developers.google.com/drive/v2/reference/properties

所以 Python 句子将是:

props = service.properties().list(fileId='1el16TSNYvaGQndXXDZjheN_CANnWbA9wSA').execute()

请注意 属性 被标记为 PRIVATE。这意味着只有创建它的应用程序才能看到它。既然你说它出现在 APIs Explorer 中,我猜你可能也通过 APIs Explorer 创建了 属性 并且作为私有 属性.

如果您使用的是资源管理器,请尝试将 属性 创建为 public。这将允许您的 python 脚本看到它。或者,如果您希望将其设为对您的应用不公开,则使用您应用的身份创建 属性。