Python 使用Dropbox API还原已删除的文件

Python 使用Dropbox API还原已删除的文件,python,dropbox,dropbox-api,Python,Dropbox,Dropbox Api,我正在寻找一种使用Dropbox API恢复文件的方法,Google把我带到了这里 首先,谈谈我的情况: dbx = dropbox.Dropbox('token is intentionally hidden') print dbx.users_get_current_account() for entry in dbx.files_list_folder('', recursive = False, include_deleted = True).entries: if (isinsta

我正在寻找一种使用Dropbox API恢复文件的方法,Google把我带到了这里

首先,谈谈我的情况:

dbx = dropbox.Dropbox('token is intentionally hidden')
print dbx.users_get_current_account()
for entry in dbx.files_list_folder('', recursive = False, include_deleted = True).entries:
  if (isinstance(entry, dropbox.files.FileMetadata) or isinstance(entry, dropbox.files.DeletedMetadata)):
    if not entry.name.endswith('cerber2'):
      print "name: ", entry.name, "| path: ", entry.path_lower 
      print repr(entry)
      try:
        meta, resp = dbx.files_download(entry.path_lower)
      except dropbox.exceptions.ApiError as e:
        print e.user_message_text
      print "-" * 80
我的电脑感染了一种病毒,它可以重命名我的所有文件(如果在Dropbox上识别为rename或delete,则为idk),并且这些文件都同步到Dropbox。我想使用Dropbox API下载我的所有原始文件

正如我在web界面上看到的,我可以单独下载它们,但我有上千个文件,所以我无法完成

我的问题:

dbx = dropbox.Dropbox('token is intentionally hidden')
print dbx.users_get_current_account()
for entry in dbx.files_list_folder('', recursive = False, include_deleted = True).entries:
  if (isinstance(entry, dropbox.files.FileMetadata) or isinstance(entry, dropbox.files.DeletedMetadata)):
    if not entry.name.endswith('cerber2'):
      print "name: ", entry.name, "| path: ", entry.path_lower 
      print repr(entry)
      try:
        meta, resp = dbx.files_download(entry.path_lower)
      except dropbox.exceptions.ApiError as e:
        print e.user_message_text
      print "-" * 80
我使用Python API包装器来处理Dropbox API。我首先获取了我的所有文件,并尝试获取它们的所有修订,但原始文件不包括在修订列表中

然后我尝试列出我的所有文件,包括删除的文件,我可以看到我的原始文件列表。我试图使用下载端点下载它们,但它返回
未找到文件
错误。有没有人碰到过类似的事情?我如何解决这个问题

我的代码片段:

dbx = dropbox.Dropbox('token is intentionally hidden')
print dbx.users_get_current_account()
for entry in dbx.files_list_folder('', recursive = False, include_deleted = True).entries:
  if (isinstance(entry, dropbox.files.FileMetadata) or isinstance(entry, dropbox.files.DeletedMetadata)):
    if not entry.name.endswith('cerber2'):
      print "name: ", entry.name, "| path: ", entry.path_lower 
      print repr(entry)
      try:
        meta, resp = dbx.files_download(entry.path_lower)
      except dropbox.exceptions.ApiError as e:
        print e.user_message_text
      print "-" * 80

今天下午,我一直在为这个问题绞尽脑汁,试图恢复一个朋友的投递箱的状态,它被同样的勒索软件击中了。我不知道你是否仍然需要一个解决方案,但简而言之,这是游戏的状态

在Dropbox API V2中,每个文件都有一个唯一的ID。这会在删除、重命名、移动等过程中保持不变。这将是解决此问题的关键,因为Dropbox会按文件路径跟踪文件历史记录,因此一旦勒索软件重命名了您的文件,以编程方式简单回滚文件的选项就会丢失。为了让事情变得更加困难,获取一个目录列表,将
include\u deleted
设置为True,您会注意到Dropbox在元数据中不包含文件ID以进行删除。如果他们这样做了,这将是轻而易举的事

因此,以下是我们应该做的:

  • 正常情况下,获取文件列表
  • 将该文件列表拆分为两个列表,即现有文件和已删除的文件:

    删除=列表(过滤器(lambda文件:isinstance(文件,dropbox.files.DeletedMetadata),files.entries))

  • (其中
    files
    dropbox.files.ListFolderResult
    的一个实例)

  • 在这里,当涉及到API调用时,事情变得有点棘手。对于每个已删除的文件,您需要使用
    dropbox.dropbox.files\u list\u revisions
    获取修订列表。以最新的第一个修订版为例,将其ID存储在文件路径旁边。这是我们获取已删除文件的ID的方式
  • 现在,我们(希望)在您的文件夹/Dropbox中为每个删除的文件都有了一个ID,剩下要做的就是将这些ID与现有加密的.cerber2文件的ID进行匹配。完成后,将在加密的.cerber2文件和存储在Dropbox历史记录中的原始解密文件之间建立映射。只需恢复旧文件并删除病毒创建的文件

  • 我有意将代码中的实际实现留给您,但我希望这会有所帮助。

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

    在Dropbox API V2中,每个文件都有一个唯一的ID。这会在删除、重命名、移动等过程中保持不变。这将是解决此问题的关键,因为Dropbox会按文件路径跟踪文件历史记录,因此一旦勒索软件重命名了您的文件,以编程方式简单回滚文件的选项就会丢失。为了让事情变得更加困难,获取一个目录列表,将
    include\u deleted
    设置为True,您会注意到Dropbox在元数据中不包含文件ID以进行删除。如果他们这样做了,这将是轻而易举的事

    因此,以下是我们应该做的:

  • 正常情况下,获取文件列表
  • 将该文件列表拆分为两个列表,即现有文件和已删除的文件:

    删除=列表(过滤器(lambda文件:isinstance(文件,dropbox.files.DeletedMetadata),files.entries))

  • (其中
    files
    dropbox.files.ListFolderResult
    的一个实例)

  • 在这里,当涉及到API调用时,事情变得有点棘手。对于每个已删除的文件,您需要使用
    dropbox.dropbox.files\u list\u revisions
    获取修订列表。以最新的第一个修订版为例,将其ID存储在文件路径旁边。这是我们获取已删除文件的ID的方式
  • 现在,我们(希望)在您的文件夹/Dropbox中为每个删除的文件都有了一个ID,剩下要做的就是将这些ID与现有加密的.cerber2文件的ID进行匹配。完成后,将在加密的.cerber2文件和存储在Dropbox历史记录中的原始解密文件之间建立映射。只需恢复旧文件并删除病毒创建的文件

  • 我有意将代码中的实际实现留给您,但我希望这会有所帮助。

    感谢James Scholes,这正是我想要的。 该解决方案可以很好地处理文件,但这不适用于文件夹,因为文件夹没有版本/修订。在这种情况下,是否有其他方法可以取消删除文件夹


    谢谢,

    谢谢詹姆斯·斯科尔斯,这正是我想要的。 该解决方案可以很好地处理文件,但这不适用于文件夹,因为文件夹没有版本/修订。在这种情况下,是否有其他方法可以取消删除文件夹

    谢谢,

    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());
        }
    
    }
    
    publicstaticvoidmain(字符串[]args)抛出IOException、dbxeexception{
    字符串userLocale=Locale.getDefault().toString();
    DbxRequestConfig requestConfig=newdbxrequestconfig(“示例授权”,userLocale);
    dbxclientv2c