开启WebDAV
在坚果云网页端可以找到WebDAV的管理界面,开启后就可以得到一个密钥。
有图形界面的操作系统坚果云都提供客户端了,现在我希望添加到坚果云的某个目录的文件能够自动checkin到github,从而实现随时写博客之类的功能。
cURL读取 WebDAV 目录文件
1
curl -X PROPFIND --user 'user@xxx.com:password' 'https://dav.jianguoyun.com/dav/Blog/@TODO'
以上命令会返回这个目录里所有的信息,不过是xml的,不太好处理。
Python 读取 WebDAV目录文件
只要能找到合适的包,Python 做什么都很容易,读取 WebDAV 目前我发现 fs.webdavfs 相对好用一点。
1
pip3 install fs.webdavfs
读取目录的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
# jg_sync.py
from webdavfs.webdavfs import WebDAVFS
url = 'https://dav.jianguoyun.com/dav'
options = {
'login': 'user@xxx.com',
'password': 'password',
'root': '/Blog/@TODO'
}
fs = WebDAVFS(url, **options)
files = fs.listdir('.')[1:]
print('\n'.join(files))
下载 WebDAV 文件
推荐用 cCURL 而不是 Python,Python 下载文件会有各种异常,中文编码或者路径什么的很不灵光,折腾了我半天都没弄好,还是 cURL 简单粗暴。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
echo "Update from jianguoyun..."
cd "$(dirname "$0")"
files=$(python3 jg_sync.py)
urlencode() {
echo $(python3 -c "import urllib.parse; print (urllib.parse.quote('''$1'''))")
}
download_file() {
cmd="curl -u 'user:pass' 'https://dav.jianguoyun.com/dav/Blog/@TODO/_remote_' -o '@TODO/_local_'"
cmd="${cmd/_local_/$1}"
cmd="${cmd/_remote_/$2}"
eval $cmd
}
delete_remote_file() {
cmd="curl -X DELETE -u 'user:pass' 'https://dav.jianguoyun.com/dav/Blog/@TODO/_remote_'"
cmd="${cmd/_remote_/$1}"
eval $cmd
}
IFS='
'
for file in $files; do
echo "Download $file"
encoded_name=$(urlencode "$file")
download_file "$file" "$encoded_name"
delete_remote_file "$encoded_name"
done
在脚本开始部分先通过 Python 获取 WebDAV 的目录中的文件,然后用cURL把文件拉到本地,接着从远端目录删掉这个文件。
上面步骤完成后文件就会被下载到本地的 @TODO 目录,再把这个目录里的文件稍作加工,就可以发布了。
上传文件到 WebDAV
从简单而言,还是用cURL:
1
2
3
4
5
6
upload_file() {
cmd="curl --user 'user:pass' -T '_local_' 'https://dav.jianguoyun.com/dav/Blog/_remote_'"
cmd="${cmd/_local_/$1}"
cmd="${cmd/_remote_/$2}"
eval $cmd
}
有了这个方法,就可以实现反向从git同步文件到坚果云。
其他一些心得
其实还可以通过百度云做中转,使用 bypy 这个包,纯 Python 实现。
1
2
3
4
pip insall bypy
bypy info
bypy upload ...
bypy download ...
同步脚本写完后,可以用crontab在你的云主机上定时执行,比如没10分钟去坚果云查询一下,如果有就做后续操作。
Python 操作 WebDAV的包不是特别多,好用的更少。
使用cURL操作WebDAV是也要注意文件名中编码的问题,比如中文,空格,特殊字符都需要转义。
更多cURL的操作可以google或者看这篇文档。
还有一个办法是把 WebDAV 挂载到Linux上,大概搜索了一下 davfs2 发现也挺折腾的,不去弄了。