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 脚本看到它。或者,如果您希望将其设为对您的应用不公开,则使用您应用的身份创建 属性。
如果我像这样直接使用 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 脚本看到它。或者,如果您希望将其设为对您的应用不公开,则使用您应用的身份创建 属性。