![](/img/trans.png)
[英]Google Drive API - List files in a shared folder that I have not accessed yet
[英]Google drive api failed to list folder or download files from Shared with me before open them in browser once, though anyone have read access
在与我共享中,我有一个与某人共享的文件夹,该权限显示每个人都具有读取权限。
使用我使用 Google 驱动器 API 开发的 python 脚本,我可以列出一些子文件夹并下载一些文件,但无法列出其他子文件夹(得到 [])或下载其他文件(404 错误),而每个人都可以读取所有子文件夹和文件.
最令人困惑的是,打开失败的文件夹或在浏览器中预览失败的文件后,问题就迎刃而解了。
我不知道是什么导致了问题,我已经阅读了 https://developers.google.com/drive/api/v3/reference/files/list和https://developers.google.com/drive/api/v3/ reference/files/get ,尝试更改files().list()
和files().get()
的 arguments ,但没有成功。
我还使用上述网址中的“试用”API 工具包,并获得相同的结果。
PS。 我用其他一些共享文件夹测试了我的脚本,但没有遇到问题。
I use API service with my Gmail account, register my Desktop App with Oauth2 credentials, just same as the code shown in quickstart: https://developers.google.com/drive/api/quickstart/python , and the share url I test在这里: https://drive.google.com/drive/folders/0B59W0kcOXxj6UUdYUzRYOHE0R1E?resourcekey=0-JyYB6JeJHIBT3lFz4e5NzA&usp=sharing
def download_folder(folders_todownload):
dict_folder2pagetoken = {}
service = build('drive', 'v3', credentials=creds, cache_discovery=False)
while folders_todownload:
folderid, folderpath = folders_todownload.pop()
while True:
PageToken, page = dict_folder2pagetoken.get(folderid, (None, 1))
q = "'%s' in parents" % (folderid)
file_metas = "id, name, mimeType, resourceKey, createdTime, modifiedTime, originalFilename, md5Checksum, size"
try:
results = service.files().list(q=q, supportsAllDrives=True, fields="nextPageToken, files(%s)" % (file_metas), pageSize=1000, pageToken=PageToken).execute()
if "nextPageToken" in results:
dict_folder2pagetoken[folderid] = (results["nextPageToken"], page + 1)
items = results.get('files', [])
if not items:
# some folders is empty before open them in browser
logging.warning('No files found in %s.' % (folderpath))
break
cnt_todownload = len([x["md5Checksum"] for x in items if "md5Checksum" in x])
seq_todownload = 0
for item in items:
taskpath = folderpath + '/' + item['name']
item["parent"] = folderpath
if item['mimeType'] == 'application/vnd.google-apps.folder':
folders_todownload.append((item['id'], taskpath))
elif "md5Checksum" in item:
seq_todownload += 1
logging.info("(%s/%s) download %s" % (seq_todownload, cnt_todownload, taskpath.split("/")[-1]))
try:
request = service.files().get_media(fileId=item['id'], supportsAllDrives=True, acknowledgeAbuse=True)
# for test purpose, just download first 1k byte
request.headers["Range"] = "bytes={}-{}".format(0, 1024)
# some files response 404 before preview them in browser
response = request.execute()
except HttpError as e:
# some files response 404 before preview them in browser
logging.error("download failed, HTTP CODE %s" % (e.status_code))
except HttpLib2Error as e:
logging.error("download failed, HttpLib2Error %s" % (e))
except Exception as e:
logging.error("download failed, Exception %s" % (e))
line = ""
for k in ["id", "parent", "name", "mimeType", "resourceKey", "createdTime", "modifiedTime", "originalFilename", "md5Checksum", "size"]:
line += item.get(k, "-") + "\t"
line = line.rstrip("\t") + "\n"
codecs.open(file_output, "a", "utf-8").write(line)
except HttpError as error:
folders_todownload.append((folderid, folderpath))
logging.error('An HTTP error occurred: %s' % (error))
except Exception as e:
time.sleep(1)
folders_todownload.append((folderid, folderpath))
logging.error('An error occurred: %s' % (e))
if "nextPageToken" not in results:
break
看起来您需要将includeItemsFromAllDrives=True
参数添加到您的files().list
方法中:
results = service.files().list(q=q, supportsAllDrives=True,
includeItemsFromAllDrives=True,
fields="nextPageToken,
files(%s)" % (file_metas),
pageSize=1000,
pageToken=PageToken).execute()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.