
本文介绍一种基于 google drive api 的可靠方法,通过“仅扫描自己拥有的文件夹”这一策略,精准筛选出由其他账号在你共享的子文件夹中创建、且未主动共享给你的文件,避免误包含外部账户共享的文件。
本文介绍一种基于 google drive api 的可靠方法,通过“仅扫描自己拥有的文件夹”这一策略,精准筛选出由其他账号在你共享的子文件夹中创建、且未主动共享给你的文件,避免误包含外部账户共享的文件。
在使用 Google Drive API 进行文件检索时,一个常见但棘手的需求是:找出所有“存在于我的 Drive 中、但并非我创建、也未被他人显式共享给我”的文件——典型场景如:你将某个文件夹共享给团队成员,并赋予“编辑”权限,对方在该文件夹内新建了文档;这些文档归属对方账号(owners ≠ me),但因父级文件夹属于你,它们逻辑上“位于你的 Drive 空间”,却不会出现在 sharedWithMe 视图中,也不应被误判为“外部共享文件”。
直接使用 q="not 'me' in owners" 配合全局 files.list() 是不可靠的,因为它会混入两类干扰项:
- ✅ 目标文件:你在自己的文件夹中授予权限后,他人创建的文件(期望捕获);
- ❌ 干扰文件:其他用户主动通过“共享”动作发送给你的文件(
sharedWithMe类型),尽管你非其所有者,但它们物理上不在你的文件夹树中。
关键洞察在于:Google Drive 的所有权与位置是解耦的,但“文件是否位于你拥有的文件夹下”是可判定的业务逻辑边界。 因此,正确路径是:
-
先枚举你拥有的所有文件夹(
mimeType='application/vnd.google-apps.folder' and 'me' in owners); -
再逐个遍历这些文件夹,查询其子项中所有非你拥有的文件(
'{folder_id}' in parents and not 'me' in owners); - 此方式天然排除了
sharedWithMe文件——因为它们不位于任何你拥有的文件夹的parents链中。
以下是完整、可运行的 Python 实现(适配 Google Colab,亦可迁移至本地环境):
Access Gmail, Calendar, Drive, Docs, and Sheets via the gws CLI or Python.
from google.colab import auth
from googleapiclient.discovery import build
from google.auth import default
ACCOUNTNAME = "your-email@example.com" # 替换为你的 Google 账号邮箱
SCOPES = ['https://www.googleapis.com/auth/drive.readonly']
def authenticate_google_drive():
auth.authenticate_user()
creds, _ = default(scopes=SCOPES)
return build('drive', 'v3', credentials=creds)
def list_owned_folders(service):
"""获取当前用户拥有的所有文件夹(ID 和名称)"""
query = "mimeType='application/vnd.google-apps.folder' and 'me' in owners"
response = service.files().list(
q=query,
fields="files(id, name)",
pageSize=100
).execute()
return response.get('files', [])
def list_foreign_files_in_folder(service, folder_id):
"""在指定文件夹中查找非当前用户拥有的文件"""
query = f"'{folder_id}' in parents and not '{ACCOUNTNAME}' in owners"
response = service.files().list(
q=query,
fields="files(id, name, owners, mimeType, createdTime)",
pageSize=100
).execute()
return response.get('files', [])
def main():
service = authenticate_google_drive()
print("? 正在检索您拥有的文件夹...")
folders = list_owned_folders(service)
if not folders:
print("⚠️ 未找到您拥有的文件夹。请确认权限并检查是否有至少一个文件夹由您创建。")
return
print(f"✅ 找到 {len(folders)} 个您拥有的文件夹,开始扫描其中的他人创建文件...\n")
total_foreign_files = 0
for folder in folders:
files = list_foreign_files_in_folder(service, folder['id'])
if files:
print(f"? 文件夹: {folder['name']} (ID: {folder['id']})")
for f in files:
owners = [o['emailAddress'] for o in f.get('owners', [])]
print(f" ? {f['name']} | 类型: {f['mimeType'].split('.')[-1] or 'unknown'} "
f"| 创建时间: {f['createdTime'][:10]} | 所有者: {', '.join(owners)}")
total_foreign_files += len(files)
print()
print(f"? 扫描完成!共发现 {total_foreign_files} 个由他人在您拥有的文件夹中创建的文件。")
if __name__ == '__main__':
main()
? 重要注意事项:
-
权限要求:必须授权
https://www.googleapis.com/auth/drive.readonly(或更宽松的drive),且需确保服务账号/用户已开启 Google Drive API; - 递归限制:本方案仅扫描一级子文件。若需深度遍历(如子文件夹中的子文件夹),需改写为递归函数,注意避免循环引用与配额超限;
-
性能优化:对大型 Drive,建议添加分页处理(
pageToken)及指数退避重试; -
安全边界:此方法严格限定于“你拥有的文件夹”,因此完全规避了
sharedWithMe、teamDrive或第三方共享链接文件的干扰,结果语义清晰、可审计。
总结而言,与其在全局空间中做模糊排除,不如锚定可信上下文(own folders)进行精确收束——这是实现该需求最稳健、最符合 Drive 数据模型本质的工程实践。










