Google 驱动器 API 识别文件的变化
Google Drive API to identify the changes in files
我有一份文件和文件夹列表存储在 google 驱动器文件夹中。我的 objective 用于识别与特定 google 驱动器文件夹中任何 file/folder 相关的任何更改(modify/create/delete),即获取这些文件名及其驱动器路径的列表。
我没有注册任何域,因为我们的 spring 启动应用程序部署在 K8 的 pod 上,我不希望在任何域或任何 webhook 地址上收到任何通知。当我调用下面的 method/api
时,我只希望文件列表为 modified/deleted
下面是 spring 引导应用程序的代码片段。
@Component
public class DriveServiceProvider {
@Autowired
private DriveConfig dc;
public Drive getDriveService() throws IOException, GeneralSecurityException {
final GoogleCredentials credentials = GoogleCredentials
.fromStream(new ByteArrayInputStream(new JSONObject(dc.getCred()).toString().getBytes()))
.createScoped(Collections.singletonList("https://www.googleapis.com/auth/drive"));
HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);
return new Drive.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), requestInitializer)
.setApplicationName(ApplicationConstants.APPLICATION_NAME).build();
}
}
控制器:
@RestController
@RequestMapping("/admin/watch")
public class TestGoogleWatchController {
@Autowired
private DriveServiceProvider driveServiceProvider;
@PostMapping(value = "/googleWatchNotification")
@ResponseStatus(HttpStatus.OK)
public Channel getNotification() throws IOException, GeneralSecurityException {
try {
StartPageToken pageToken = driveServiceProvider.getDriveService().changes().getStartPageToken().execute();
String savedStartPageToken = pageToken.getStartPageToken();
System.err.println(" savedStartPageToken "+savedStartPageToken );
while (savedStartPageToken != null) {
ChangeList changes = driveServiceProvider.getDriveService().changes().list(savedStartPageToken).execute();
System.err.println("======= changes " + changes.toPrettyString());
System.err.println("============ size ::" + changes.getChanges().size());
System.err.println("============ ChangeList ::" + changes.getChanges());
for (Change changeObj : changes.getChanges()) {
System.err.println(" files "+changeObj.getFileId() + " Kind "+changeObj.getKind() + ", Team Drive ID "+changeObj.getTeamDriveId() + ", Type::"+changeObj.getType()+ ",File ::"+changeObj.getFile()+ ", Is Removed::"+changeObj.getRemoved()+ ",Time ::"+changeObj.getTime());
}
}
}catch(Exception ex) {
}
return null;
}
}
*下面是执行后的输出:
保存的起始页面令牌 165
======= 更改 {
“变化” : [ ],
“种类”:“驱动器#changeList”,
“newStartPageToken”:“165”
}
============大小::0
============变更列表::[]*
在我们更改驱动器中的任何内容后,savedStartPageToken 正在打印递增的数值,但是 ChangeList 始终为空白。
很高兴我回答了我自己的问题。问题是我在 changeList api.
中传递了当前令牌
实际上,解决方案是使用循环查找从上一个标记到当前标记的变化。
我有一份文件和文件夹列表存储在 google 驱动器文件夹中。我的 objective 用于识别与特定 google 驱动器文件夹中任何 file/folder 相关的任何更改(modify/create/delete),即获取这些文件名及其驱动器路径的列表。
我没有注册任何域,因为我们的 spring 启动应用程序部署在 K8 的 pod 上,我不希望在任何域或任何 webhook 地址上收到任何通知。当我调用下面的 method/api
时,我只希望文件列表为 modified/deleted下面是 spring 引导应用程序的代码片段。
@Component
public class DriveServiceProvider {
@Autowired
private DriveConfig dc;
public Drive getDriveService() throws IOException, GeneralSecurityException {
final GoogleCredentials credentials = GoogleCredentials
.fromStream(new ByteArrayInputStream(new JSONObject(dc.getCred()).toString().getBytes()))
.createScoped(Collections.singletonList("https://www.googleapis.com/auth/drive"));
HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);
return new Drive.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), requestInitializer)
.setApplicationName(ApplicationConstants.APPLICATION_NAME).build();
}
}
控制器:
@RestController
@RequestMapping("/admin/watch")
public class TestGoogleWatchController {
@Autowired
private DriveServiceProvider driveServiceProvider;
@PostMapping(value = "/googleWatchNotification")
@ResponseStatus(HttpStatus.OK)
public Channel getNotification() throws IOException, GeneralSecurityException {
try {
StartPageToken pageToken = driveServiceProvider.getDriveService().changes().getStartPageToken().execute();
String savedStartPageToken = pageToken.getStartPageToken();
System.err.println(" savedStartPageToken "+savedStartPageToken );
while (savedStartPageToken != null) {
ChangeList changes = driveServiceProvider.getDriveService().changes().list(savedStartPageToken).execute();
System.err.println("======= changes " + changes.toPrettyString());
System.err.println("============ size ::" + changes.getChanges().size());
System.err.println("============ ChangeList ::" + changes.getChanges());
for (Change changeObj : changes.getChanges()) {
System.err.println(" files "+changeObj.getFileId() + " Kind "+changeObj.getKind() + ", Team Drive ID "+changeObj.getTeamDriveId() + ", Type::"+changeObj.getType()+ ",File ::"+changeObj.getFile()+ ", Is Removed::"+changeObj.getRemoved()+ ",Time ::"+changeObj.getTime());
}
}
}catch(Exception ex) {
}
return null;
}
}
*下面是执行后的输出:
保存的起始页面令牌 165
======= 更改 { “变化” : [ ], “种类”:“驱动器#changeList”, “newStartPageToken”:“165” }
============大小::0
============变更列表::[]*
在我们更改驱动器中的任何内容后,savedStartPageToken 正在打印递增的数值,但是 ChangeList 始终为空白。
很高兴我回答了我自己的问题。问题是我在 changeList api.
中传递了当前令牌实际上,解决方案是使用循环查找从上一个标记到当前标记的变化。