如何通过Google Drive API及PHP google/apiclient库获取文件/文件夹权限创建者信息
如何获取Google Drive权限(共享操作)的创建者信息?
问题描述
我开发了一款基于PHP的应用,采用google/apiclient库进行开发。目前我需要检索出为文件或文件夹创建权限(即执行文件/文件夹共享操作)的用户信息,请问是否存在对应的API或实现方法可以获取该权限创建者的相关信息?以下是我当前持有的Permission对象:
0 => Google_Service_Drive_Permission^ {#166 #collection_key: "teamDrivePermissionDetails" +allowFileDiscovery: null +deleted: false +displayName: "My Drives" +domain: null +emailAddress: "shared@mydomain.com" +expirationTime: null +id: "42334331410813143544" +kind: "drive#permission" #permissionDetailsType: "Google_Service_Drive_PermissionPermissionDetails" #permissionDetailsDataType: "array" +photoLink: "https://lh3.googleusercontent.com/a-/Abrbrb7k54odEg7qpULhrrzPcNImd7EBgBLgUOPeK=s64" +role: "organizer" #teamDrivePermissionDetailsType: "Google_Service_Drive_PermissionTeamDrivePermissionDetails" #teamDrivePermissionDetailsDataType: "array" +type: "user" +view: null #internal_gapi_mappings: [] #modelData: [] #processed: [] +"teamDrivePermissionDetails": array:1 [ 0 => Google_Service_Drive_PermissionTeamDrivePermissionDetails^ {#62 +inherited: false +inheritedFrom: null +role: "organizer" +teamDrivePermissionType: "member" #internal_gapi_mappings: [] #modelData: [] #processed: [] } ] +"permissionDetails": array:1 [ 0 => Google_Service_Drive_PermissionPermissionDetails^ {#1151 +inherited: false +inheritedFrom: null +permissionType: "member" +role: "organizer" #internal_gapi_mappings: [] #modelData: [] #processed: [] } ] }
解决方案
好问题!我刚好之前处理过类似的需求,咱们一步步来梳理:
1. 先明确:直接从Permission对象拿不到创建者信息
你贴的Google_Service_Drive_Permission对象里确实没有包含权限创建者的字段——Google Drive的Permission资源本身只记录权限的核心属性(比如角色、类型、目标用户),并不存储「谁创建了这个权限」这类操作日志信息。
2. 可行方案:调用Drive API的「改动历史」或「活动记录」接口
要获取权限创建者信息,需要通过Drive的操作日志类接口来查询,这里有两个靠谱的方式:
方式一:使用Changes.list接口(基于Drive API)
这个接口可以列出Drive内的所有改动记录,包括权限添加操作。你可以筛选出changeType为permission的改动,再通过fileId和permissionId匹配你要查询的目标权限,改动记录里的user字段就是创建该权限的用户信息。
PHP代码示例:
// 初始化Drive服务 $driveService = new Google_Service_Drive($client); // 获取改动记录的起始页令牌(首次调用可以用null,后续用返回的nextPageToken分页) $startPageToken = $driveService->changes->getStartPageToken()->getStartPageToken(); $changes = $driveService->changes->listChanges($startPageToken); foreach ($changes->getChanges() as $change) { // 筛选出目标文件的权限改动,匹配你要查询的permissionId if ($change->getChangeType() === 'permission' && $change->getFileId() === '你的目标文件ID' && $change->getPermissionId() === '你要查询的权限ID') { // 获取创建者信息 $creator = $change->getUser(); echo "权限创建者邮箱:" . $creator->getEmailAddress() . "\n"; echo "权限创建者名称:" . $creator->getDisplayName() . "\n"; break; } } // 如果有更多分页,需要循环处理nextPageToken while ($changes->getNextPageToken()) { $changes = $driveService->changes->listChanges($changes->getNextPageToken()); // 重复上述筛选逻辑 }
注意事项:
- 需要具备
drive.readonly或更高权限 - 改动记录有保留期限,过旧的操作可能无法查询到
方式二:使用Activities.list接口(基于Drive Activity API,推荐更精准)
这个接口专门用于获取Drive的活动日志,支持更精细的筛选条件,能直接定位到「添加权限」的操作,活动记录里的actor字段就是权限创建者。
步骤说明:
- 先在Google Cloud控制台启用「Drive Activity API」
- 使用以下PHP代码查询:
// 初始化Drive Activity服务 $driveActivityService = new Google_Service_DriveActivity($client); // 构建查询请求,筛选目标文件的权限添加活动 $request = new Google_Service_DriveActivity_QueryDriveActivityRequest(); // 筛选条件:动作类型为添加权限,且目标文件为指定ID $request->setFilter("detail.action_detail_case:PERMISSION_ADD AND itemName='items/你的目标文件ID'"); $activities = $driveActivityService->activity->query($request); foreach ($activities->getActivities() as $activity) { // 遍历活动中的执行者(即权限创建者) $actors = $activity->getActors(); $targetCreator = null; foreach ($actors as $actor) { if ($actor->getUser()) { $targetCreator = $actor->getUser(); break; } } // 匹配对应的permissionId(一个文件可能有多次权限添加操作) $details = $activity->getDetails(); foreach ($details as $detail) { if ($detail->getPermissionAdd()) { $permissionId = $detail->getPermissionAdd()->getPermission()->getId(); if ($permissionId === '你要查询的权限ID') { // 输出创建者信息 echo "权限创建者邮箱:" . $targetCreator->getEmail() . "\n"; echo "权限创建者名称:" . $targetCreator->getDisplayName() . "\n"; break 2; } } } }
注意事项:
- 需要具备
drive.activity.readonly权限 - 对Shared Drive(原Team Drive)的支持更友好,能准确关联到团队内的操作
内容的提问来源于stack exchange,提问作者MakoBuk
相关产品推荐
相关产品推荐

