Python 使用Dropbox API还原已删除的文件
我正在寻找一种使用Dropbox API恢复文件的方法,Google把我带到了这里 首先,谈谈我的情况: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
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