繁体   English   中英

Google 驱动器 api 在浏览器中打开它们之前未能列出文件夹或从与我共享的文件中下载文件,尽管任何人都具有读取权限

[英]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/listhttps://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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM