β

Dropbox自动删除冗余文件的实现

Er... 6 阅读

Dropbox最近可以说是相当“火”,原因复杂,简而言之是拜12306所赐。不少回去的同学表示google、dropbox已经不能访问,即使是ssl也无可奈何。尚未回去的我,表示暂无压力。不过,也许被墙就在明天,姑且自娱自乐好了。

最近在弄博客的备份问题,同学推荐了一款wordpress插件——WordPress Backup to Dropbox。听他说起来,用的蛮舒服,效果也蛮不错。主要是运用了dropbox的版本控制。当启动服务的时候,wordpress空间里的文件会与dropbox服务器里上传的文件进行对比,如果有区别,则将dropbox端的文件进行更新,有点类似github。我个人对github是充满热情的,所以自然欣然前往。不过真心是事与愿违,安装了这款插件,启用,设置,运行。等了半天,除了收到一封email告知有一个app连入到dropbox以及在dropbox上多了一个空文件夹之外,就什么也没有了。和同学讨论了半天,得出一结论:我的空间不支持这款插件。我勒个囧zzZ~

好吧,一条路行不通,总不能不走了吧。想到之前域名被封,空间转移等带来的各种坑爹后果,空间备份真的是必要的啊。于是,在wordpress安装插件处搜索dropbox,然后出现在第一条的是一个评分不错的插件,这款插件就是我现在在用的BackWPup。这款插件光看介绍,就足够心潮澎湃了:支持备份到dropbox,支持邮件,支持。。。于是,充满激动的心情,试用了。当在dropbox里发现了空间文件打包成的.zip文件的时候,那兴奋劲,真叫一个爽!

按照我自己设定的路线:多写博客,于是备份频率设成了每天一次(其实每周一次就够了,但是不影响这篇博客的产生)。那么,问题就来了。生成的.zip文件是按照时间命名的,诸如“backwpup_1_2013-01-20_14-19-32.zip”,所以版本控制是没有指望了(如果每次都生成一下的名字,你可以去试试)。我的空间算是比较小的了,打成包也有快30M。按照每天30M的净增长,dropbox空间容量肯定吃不消。那怎么办呢?

一个简单有效的方法就是删除较久远的备份文件,可是每次去dropbox删除,总觉得有点繁琐,而且很有可能因为事情一段时间没整理,dropbox就满了。有什么可以自动化执行的方法呢?

上网搜了一下dropbox,发现有api,可以自己创建应用。这里,真心要赞一下诸如dropbox和weibo这样的应用,开放自己的api的做法值得赞赏。于是,创建了一个 app 。这里选择full dropbox,因为我们要删除某个指定位置的文件,而不是只在单独的应用文件夹里。应用创建完成后,可以获得APP_KEY和APP_SECRET,这两个变量就标明了一个app。下面就是具体的操作了,这里需要的是调用delete_file()这个接口。其他的API在 这里 ,有兴趣的可以去查阅。

在实现的过程中,有一个问题是影响自动化实现的。那就是每次需要连接到dropbox,按照官方API的说法,是要在浏览器打开一个url,然后点击允许按钮。这种做啊,显然是很繁琐,与自动化的初衷是相悖的。下面就考量如何来解决这一问题,做到允许自动化。

打开认证过程中产生的url,对页面进行解读,发现按钮其实就是一个post form的submit操作。那么,我们可以模拟这个操作。这里,用的是python实现(dropbox的API支持很多语言,大家可以按需选择)。python模拟操作,应该是比较简单的,就是模拟发送http请求,这里需要模拟的有传送的数据(postdata),请求的头(headers)。

postdata部分,可以利用chrome浏览器Inspect Element模式中Network部分获取,这个Network将页面的变化中的请求记录了下来,这里要赞一下这个功能,如下图。
chrome浏览器Inspect Element模式Network板块
headers部分,同样可以从Network获取,不过需要的内容没有那么多,必不可少的有User-Agent和Cookie。大家可以将自己chrome浏览器中的相应部分复制下来,放到headers变量中即可。

headers = {'User-Agent':'填写获取的对应信息',
           'Content-Type':'application/x-www-form-urlencoded',
	   'Cookie': '填写获取的对应信息'
          }

接下来,利用urllib和urllib2这两个第三方模块,就可以完成允许的自动化了。

dropbox的API还是比较简单的,不多说,展示一下关键部分代码:

client = client.DropboxClient(sess)
#print "linked account:", client.account_info()

folder_metadata = client.metadata('/WordPress')
contents = folder_metadata['contents']
files = [content['path'] for content in contents]
#print files

#Delete the expired file or dir
#Just leave the lastest 3 backup files
for file in files[:-3]:
    client.file_delete(file)
    #print file + 'has deleted!'

至此,算是大功告成了。在享受BackWPup带来的wordpress备份福利的同时,又解决了dropbox容量的风险。

作者:Er...
Time is to be forgotten, and we are always familiar.
原文地址:Dropbox自动删除冗余文件的实现, 感谢原作者分享。

发表评论