使用Dropbox API恢复已删除的文件

时间:2016-08-12 07:26:44

标签: python dropbox dropbox-api

我正在寻找一种方法来使用Dropbox API来恢复我的文件,谷歌将我带到了这里。

首先,关于我的情况:

我的电脑遇到了一个病毒,它重命名了我的所有文件(如果它被识别为在Dropbox上重命名或删除,则为idk)并且它们都被同步到Dropbox。我想使用Dropbox API下载所有原始文件。

正如我在网络界面上看到的那样,我可以单独下载它们,但我有一千个文件,所以我无法做到。

我的问题:

我使用Python API包装器来使用Dropbox API。我首先获取了所有文件,并尝试获取所有修订版本,但原始文件未包含在修订列表中。

然后我尝试列出我的所有文件,包括已删除的文件,我可以看到我列出的原始文件。我尝试使用下载端点下载它们,但它返回i. Item 1 ii. Item 2 iii. Item 3 错误。有没有人碰到类似的东西?我该如何解决这个问题?

我的代码段

File not found

3 个答案:

答案 0 :(得分:2)

我今天下午一直在为这个确切的问题摸不着头脑,试图恢复被同一个勒索软件击中的朋友Dropbox的状态。我不知道你是否仍然需要一个解决方案,但简而言之,这就是游戏的状态。

在Dropbox API V2中,每个文件都有唯一的ID。这是删除,重命名,移动等的持久性。这将是解决此问题的关键,因为Dropbox按文件路径跟踪文件历史记录,因此只要勒索软件重命名您的文件,只需以编程方式回滚文件即可丢失。为了使事情变得更加困难,请将include_deleted设置为True的目录列表获取,并且您会注意到Dropbox不会在元数据中包含用于删除的文件ID。如果他们这样做,这将是一件轻而易举的事。

所以,在这里做什么:

  1. 正常获取文件列表。
  2. 将该文件列表拆分为两个列表,即现有文件和已删除的文件:

    deleted = list(filter(lambda file:isinstance(file,dropbox.files.DeletedMetadata),files.entries))

  3. (其中filesdropbox.files.ListFolderResult)的实例

    1. 在API调用方面,事情变得有些毛茸茸。对于每个已删除的文件,您需要使用dropbox.Dropbox.files_list_revisions获取修订列表。进行第一次修订,这将是最新版本,并将其ID与文件路径一起存储。这是我们获取已删除文件的ID的方式。
    2. 既然我们(希望)在您的文件夹/ Dropbox中为每个已删除的文件都有一个ID,那么剩下要做的就是将这些ID与现有加密的.cerber2文件的ID相匹配。完成此操作后,您将在加密的.cerber2文件与存储在Dropbox历史记录中的原始解密文件之间建立映射。只需恢复旧文件并删除病毒创建的文件即可。
    3. 我故意将代码中的实际实现留给您,但我希望这会有所帮助。

答案 1 :(得分:0)

感谢James Scholes,正是我所寻找的。 解决方案适用于文件,但这不适用于文件夹,因为文件夹没有版本/修订版。在这种情况下,我可以取消删除文件夹的任何其他方式??。

谢谢,

答案 2 :(得分:0)

Java中的示例代码:

    public static void main(String[] args) throws IOException, DbxException {

    String userLocale = Locale.getDefault().toString();
    DbxRequestConfig requestConfig = new DbxRequestConfig("examples-authorize", userLocale);

    DbxClientV2 client = new DbxClientV2(requestConfig, AUTH_TOKEN);
    FullAccount account = client.users().getCurrentAccount();

    Set<String> folderNames;

    SearchResult result = client.files().searchBuilder("/Pankaj", "*.cerber3").withMaxResults(1000L).withMode(SearchMode.FILENAME).start();
    folderNames = new HashSet<>(result.getMatches().size());
    for (SearchMatch match : result.getMatches()){
        FileMetadata fileMetadata = (FileMetadata) match.getMetadata();
        String path = fileMetadata.getPathLower();
        folderNames.add(path.substring(0, path.lastIndexOf("/")));
    }
    for(String path : folderNames){
        processDirectory(path, client);
    }
}

static void processDirectory(String dirName, DbxClientV2 client) throws DbxException {
    ListFolderResult result = client.files().listFolderBuilder(dirName).withIncludeDeleted(true).start();

    while (true) {
        for (Metadata metadata : result.getEntries()) {
        if(metadata instanceof DeletedMetadata){
                String filePath = metadata.getPathLower();
                if(filePath.endsWith(".doc") || filePath.endsWith(".docx") || filePath.endsWith(".pdf")){
                    List<FileMetadata> revisions = client.files().listRevisions(filePath).getEntries();
                    if(revisions.size()>0) {
                        FileMetadata revision = revisions.get(0);
                        System.out.println("Deleted File: " + filePath + ", " + revision.getClientModified() + ", Id:" + revision.getId());
                        revision.getRev();
                        client.files().restore(filePath, revision.getRev());
                    }
                }
            }
        }

        if (!result.getHasMore()) {
            break;
        }

        result = client.files().listFolderContinue(result.getCursor());
    }

}