PS:将原来的一篇文章拆开了,上篇是安装使用讲解,这篇是开发过程讲解。

以前使用dropbox的linux客户端备份VPS上的文件和数据,但是近来dorpbox在国内越来越难访问,加上dropbox本身的容量只有几G,于是有了自己动刀写一个网盘的客户端,首先想到的是百度网盘,2T的巨大容量肯定是够用了!

没想到这个决定却是悲剧的开始,按照百度PCS的API文档写了半天,没想到PCS开通居然审核了一周多还不通过! 联系客服,没想到他们的PCS API已经不审核新的申请了!再次吐槽下,你不审核,申请的时候就不能给个提示么!!! 遂放弃!

然后就想到了还是用金山快盘吧,前段时间刚被迅雷收购,速度方面应该是没有问题。找到金山快盘的官方开放平台,看了看文档似乎是…有点麻烦啊。不过本着有难度才有挑战的原则,还是开搞了。下面介绍下开发过程中遇到的一些问题。

首先就是快盘的授权机制,本来是不太复杂,但是它的授权流程签名并不支持PLAINTEXT明文文本格式,只支持了一个HMAC-SHA1加密方式。为了处理这个签名倒是走了一些弯路。

拿到授权token的过程可以总结为三歩走:

  1. 获取未授权的临时 token;
  2. 用户登陆并授权你的应用;
  3. 根据临时 token换取真实的 access_token。

图示如下:

授权流程

在每次请求中,下面几个参数是必须的

Name Required Type and Limit Description
oauth_consumer_key Y string 第1步的 consumer_key
oauth_signature Y string 本次请求的签名,生成方法请参考附录-签名生成算法
oauth_timestamp Y int 时间戳,正整数,和标准时间不超过5分钟
oauth_nonce Y string [ 0-9A-Za-z_ ]随机字符串,长度小于32字节。每次请求请使用不同的nonce

oauth_consumer_key可以在你创建应用的时候拿到,oauth_timestamp为标准的unix时间戳格式,oauth_nonce每次都生成一个随机数,这几个参数都非常好处理,主要就是oauth_signature这个费些周章。

官方的OAuth签名生成讲的比较具体,其实获取签名的方式也非常简单:

  • 计算串基
  • 根据串基按HMAC-SHA1获取签名并使用bash64和url_encode 转码

生成签名的时候,如果是申请request_token 那么HMAC_SHA1加密的key 就是你的consumer_secret+&,其他都是consumer_secret+&+oauth_token_secret!

Linux shell中处理url_encode 没有太好的办法,我索性就写了一个函数用sed处理了,代码如下:

#url encode
function url_encode
{

	url=$1
	echo -n $(echo -n "$url" | sed 's/\%/\%25/g'|sed 's/&/\%26/g' |sed 's/:/\%3A/g' |sed 's/\//\%2F/g'| sed 's/=/\%3D/g' |sed 's/ /\%20/g' |sed 's/@/\%40/g' |sed 's/+/\%2B/g' |sed 's/\*/\%2A/g')
	
}

拼接字符串基可归结为:请求方式&url_encode(请求URL)&(url_encode(参数1+参数2… ))

使用bash获取签名处理方法如下:

function get_signature
{
	method=$1
	url=$2
	data=$3
	token_secret=$4
	baseUrl="$1&$(url_encode "$2")&$(url_encode "$3")"
	signature=$(echo -n $baseUrl | openssl dgst -sha1 -binary -hmac "$APP_CONSUMER_SECRET&$token_secret" |base64)
	
	echo -n $(url_encode $signature)
}

《阅读全文》

上一篇介绍了如何使用vimwiki组建个人wiki,但是如何同步自己的vimwiki 到线上却成了很多人的困扰。丘迟的维基世界介绍了同步 vimwiki 到线上的各种方法,如果你的桌面是使用linux的话,当然问题不大,很轻松就能写出一个同步的脚本。但是还是有很多人平时工作在windows的系统环境中,这里我自己写了一个vim的小插件用来一键同步vimwiki到线上。

首先分析一下这个同步需求:

  1. 需要自动同步 vimwiki_html 的所有文件
  2. 有变更的文件才同步上去
  3. 被删掉的文件也要能同步删掉
  4. 由于文件修改频繁,不需要一旦修改就马上同步
  5. 有需要时可以手动同步
  6. 最好能排除一些不用放在线上的文件
  7. 不能占用太多系统资源

这里我将vimwiki生成的html托管在了自己的github上面,此vim脚本的运行需要依赖你gvim对应版本的python,或者自己在windows下编译一个gvim。(好吧,这个实在够蛋疼。。。)

安装并配置你的github

首先关闭360安全卫士等流氓软件!切记!

从github下载github for window,链接如下:

http://github-windows.s3.amazonaws.com/GitHubSetup.exe

安装完成后,用你的账号登录,然后在tools/options中设置默认的shell为cmd,如下图:

image

完成后双击桌面上的git shell图标,打开git shell 后执行如下命令

echo %path% >>c:\path.txt

打开c:\path.txt 将里面的内容全部复制,粘贴到系统的path变量中(覆盖原来的path)。完成此步骤后,cmd中会使用github生成的配置进行ssh的key-agent验证登录,故实现了git命令免密码的效果。完成后,运行cmd,输入git,能识别这个命令表示成功。然后就可以使用我写的这个脚本了(汗,脚本依赖有点高~~)

脚本的代码如下:

《阅读全文》

发一个一键备份脚本,可以将网站文件和数据库备份到FTP和Dropbox,可以从这里下载autobackup.
1、配置dropbox_Uploader.sh

运行dropbox_sync.sh,根据提示完成dropbox的授权。

2、自动备份脚本autobackup.sh内容

#!/bin/bash
#你要修改的地方从这里开始
MYSQL_USER= #mysql用户名
MYSQL_PASS= #mysql密码
MAIL_TO= #数据库发送到的邮箱
FTP_USER= #ftp用户名
FTP_PASS= #ftp密码
FTP_IP= #ftp地址
FTP_backup= #ftp上存放备份文件的目录,这个要自己得ftp上面建的
WEB_DATA= #要备份的网站数据根目录
#你要修改的地方从这里结束
#定义数据库的名字和旧数据库的名字
DataBakName=Data_$(date +"%Y%m%d").tar.gz
WebBakName=Web_$(date +%Y%m%d).tar.gz
OldData=Data_$(date -d -10day +"%Y%m%d").tar.gz
OldWeb=Web_$(date -d -10day +"%Y%m%d").tar.gz
#删除本地3天前的数据
cd /home/backup
rm -rf Data_$(date -d -3day +"%Y%m%d").tar.gz Web_$(date -d -3day +"%Y%m%d").tar.gz
#导出数据库,一个数据库一个压缩文件
for db in `/usr/local/mysql/bin/mysql -u$MYSQL_USER -p$MYSQL_PASS -B -N -e 'SHOW DATABASES' | xargs`; do
 (/usr/local/mysql/bin/mysqldump -u$MYSQL_USER -p$MYSQL_PASS ${db} | gzip -9 - > ${db}.sql.gz)
done
#压缩数据库文件为一个文件
tar zcf $DataBakName *.sql.gz
rm -rf *.sql.gz
#发送数据库到Email,如果数据库压缩后太大,请注释这行
#echo "主题:数据库备份" | mutt -a $DataBakName -s "内容:数据库备份" $MAIL_TO
#压缩网站数据
tar zcf $WebBakName $WEB_DATA
#上传到FTP空间,删除FTP空间5天前的数据
ftp -v -n $FTP_IP << END
user $FTP_USER $FTP_PASS
type binary
cd $FTP_backup
delete $OldData
delete $OldWeb
put $DataBakName
put $WebBakName
bye
END
echo =====================Ftp backup finished at [$(date +%Y-%m-%d-%H-%M)]==============================
#备份到dropbox空间
/root/bin/dropbox_sync.sh upload $DataBakName $FTP_backup/$DataBakName
/root/bin/dropbox_sync.sh upload $WebBakName $FTP_backup/$WebBakName
#Delete Old Data
/root/bin/dropbox_sync.sh delete $FTP_backup/$OldData
/root/bin/dropbox_sync.sh delete $FTP_backup/$OldWeb
echo =====================dropbox backup finished at [$(date +%Y-%m-%d-%H-%M)]==========================

3、给系统添加定时任务
如果需要将数据库文件发送到邮箱,首先需要安装sendmail和mutt,安装方法请自行google

给脚本添加执行权限:

chmod +x /root/bin/autobackup.sh
利用系统crontab实现每天自动运行:
crontab -e
输入以下内容:
00 00 * * * /root/bin/autobackup.sh
其中00 00为时间分/小时,可自行修改,例如:30 12 ***,就是每天12.30运行这个脚本。