我有一个存储在谷歌驱动器文件夹中的文件和文件夹列表。我的目标是识别与特定谷歌驱动器文件夹中的任何文件/文件夹相关的任何更改(修改/创建/删除(,即获取这些文件名及其驱动器路径的列表。
我没有注册任何域,因为我们的春季启动应用程序部署在K8的pod上,我不想在任何域或任何webhook地址上收到任何通知。当我调用下面的方法/api 时,我只想要被修改/删除的文件列表
下面是spring-boot应用程序的代码片段。
@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;
}
}
*以下是执行后的输出:
savedStartPageToken 165
======更改{"改变":[],"种类":"驱动器#changeList";,"newStartPageToken":"165〃;}
====================大小:0
====================变更列表::[]*
在我们更改驱动器中的任何内容后,savedStartPageToken将打印递增的数值,但ChangeList始终为空。
我很高兴能回答我自己的问题。问题是我在changeListapi中传递当前令牌。
实际上,解决方案是使用循环查找从上一个令牌到当前令牌的更改。