需求背景

最近刚搭了个markdown静态博客,想把博客的图片放到云存储中。

经过调研觉得七牛可以满足我个人的需求,就选它了。

博客要引用图片就要先将图片上传到云上。

虽然七牛网站后台可以上传文件,但每次上传都需要先登录,然后选择图片,设置连接地址,才能上传。

这个过程有些繁琐,所以我便想用七牛云提供的SDK写个一同步工具,方便增量同步文件。

有了这个想法,就马上行动。花了大概一个上午的时间,总算把这个工具给写出来,

并放到GitOSCgithub上。

实现

(博客园的markdown代码区显示不友好,可以到我的个人博客中浏览)

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#
# AUTHOR = "heqingpan"
# AUTHOR_EMAIL = "heqingpan@126.com"
# URL = "http://git.oschina.net/hqp/qiniu_sync" import qiniu
from qiniu import Auth
from qiniu import BucketManager
import os
import re access_key = ''
secret_key = ''
bucket_name = ''
bucket_domain = '' q = Auth(access_key, secret_key)
bucket = BucketManager(q)
basedir=os.path.realpath(os.path.dirname(__file__))
filename=__file__
ignore_paths=[filename,"{0}c".format(filename)]
ignore_names=[".DS_Store",".git",".gitignore"]
charset="utf8"
diff_time=2*60 def list_all(bucket_name, bucket=None, prefix="", limit=100):
rlist=[]
if bucket is None:
bucket = BucketManager(q)
marker = None
eof = False
while eof is False:
ret, eof, info = bucket.list(bucket_name, prefix=prefix, marker=marker, limit=limit)
marker = ret.get('marker', None)
for item in ret['items']:
rlist.append(item["key"])
if eof is not True:
# 错误处理
#print "error"
pass
return rlist def get_files(basedir="",fix="",rlist=None,ignore_paths=[],ignore_names=[]):
if rlist is None:
rlist=[]
for subfile in os.listdir(basedir):
temp_path=os.path.join(basedir,subfile)
tp=os.path.join(fix,subfile)
if tp in ignore_names:
continue
if tp in ignore_paths:
continue
if os.path.isfile(temp_path):
rlist.append(tp)
elif os.path.isdir(temp_path):
get_files(temp_path,tp,rlist,ignore_paths,ignore_names)
return rlist def get_valid_key_files(subdir=""):
basedir=subdir or basedir
files = get_files(basedir=basedir,ignore_paths=ignore_paths,ignore_names=ignore_names)
return map(lambda f:(f.replace("\\","/"),f),files) def sync():
qn_keys=list_all(bucket_name,bucket)
qn_set=set(qn_keys)
l_key_files=get_valid_key_files(basedir)
k2f={}
update_keys=[]
u_count=500
u_index=0
for k,f in l_key_files:
k2f[k]=f
str_k=k
if isinstance(k,str):
k=k.decode(charset)
if k in qn_set:
update_keys.append(str_k)
u_index+=1
if u_index > u_count:
u_index-=u_count
update_file(k2f,update_keys)
update_keys=[]
else:
# upload
upload_file(k,os.path.join(basedir,f))
if update_keys:
update_file(k2f,update_keys)
print "sync end" def update_file(k2f,ulist):
ops=qiniu.build_batch_stat(bucket_name,ulist)
rets,infos = bucket.batch(ops)
for i in xrange(len(ulist)):
k=ulist[i]
f=k2f.get(k)
ret=rets[i]["data"]
size=ret.get("fsize",None)
put_time = int(ret.get("putTime")/10000000)
local_size=os.path.getsize(f)
local_time=int(os.path.getatime(f))
if local_size==size:
continue
if put_time >= local_time - diff_time:
# is new
continue
# update
upload_file(k,os.path.join(basedir,f)) def upload_file(key,localfile):
print "upload_file:"
print key
token = q.upload_token(bucket_name, key)
mime_type = get_mime_type(localfile)
params = {'x:a': 'a'}
progress_handler = lambda progress, total: progress
ret, info = qiniu.put_file(token, key, localfile, params, mime_type, progress_handler=progress_handler) def get_mime_type(path):
mime_type = "text/plain"
return mime_type def main():
sync() if __name__=="__main__":
main()

这个同步脚本支持批量比较文件,差异增量更新、批量更新。

使用方式

  • 安装七牛Python SDK

    pip install qiniu

  • 填写脚本文件(qiniusync.py)的配置信息

access_key = ''
secret_key = ''
bucket_name = ''

注册后可以拿到对应的信息

  • 将脚本文件(qiniusync.py)拷贝到待同步根目录

  • 运行脚本

python qiniusync.py

后记

写完提交之后才发现,七牛已经提供相应的工具,我这个算是重复造轮子吧。

既然已经写,就发出来,当做熟悉一下七牛的SDK也不错,说不定以后还能用的上。

博客园的markdown代码区显示不友好,可以到我的个人博客中浏览

基于七牛Python SDK写的一个同步脚本的更多相关文章

  1. 基于七牛Python SDK写的一个批量下载脚本

    前言 上一篇基于七牛Python SDK写的一个同步脚本所写的脚本只支持上传,不支持文件下载. 虽然这个需求不太强烈,但有可能有人(在备份.迁移时)需要,而官方有没提供对应的工具,所以我就把这个功能也 ...

  2. Async Cow Python 七牛异步SDK

    # Async Cow Python 七牛异步SDK > gitee链接 >github链接本SDK基于官方SDK改造而成,但又对其进行了进一步封装,简化了相关操作例如:- 1.不需要使用 ...

  3. 用Python 3写的一个Spider小爬虫(使用内置urllib模块and正则表达式)

    用Python写了一个Spider小爬虫,爬一爬斗鱼“王者荣耀”在线直播的主播及人气

  4. 七牛 python

    Python SDK使用指南 上传策略 变量 对象存储 API 参考手册 多媒体数据处理 API 参考手册

  5. [原创]基于html5新标签canvas写的一个小画板

    最近刚学了canvas,写个小应用练习下 源代码 <!DOCTYPE> <html> <head> <meta http-equiv="Conten ...

  6. python+imageMagick写的一个压缩图片脚本

    !/usr/bin/python import os import cPickle as p import re import Image def imageCompre(imagedir = '.' ...

  7. 七牛php sdk 生成上传凭证时出现 undefined function Qiniu_SetKeys()

    将qiniu/http.php文件改名即可,原因是xampp等集成环境会安装pear存在了http.php

  8. [Python][自己写的杀病毒脚本]

    电脑里的HTML都插入了一段VB病毒代码..只能自己手动清除了..发现Python确实好用 import os import re; Root = ["H:"]; for root ...

  9. 今天看了shell大神的写的一个统计脚本

    通过nginx日志统计接口耗时排行 grep '/bigbox?' access_log | awk '{print $7"&process="$NF}'| sed -r ...

随机推荐

  1. linux下端口被占用

    1.查看端口 netstat -ano 参数含义: -a, --all  显示监听或非监听状态的接口 Show  both listening and non-listening (for TCP t ...

  2. apk系统签名命令

    java -jar signapk.jar platform.x509.pem platform.pk8 D:/ClockSetting.apk D:/ClockSettingSigned.apk 需 ...

  3. FreeMarker自定义TemplateDirectiveModel

    [参考:http://blog.csdn.net/fangzhangsc2006/article/details/8687371] 在采用FreeMarker做前台视图模板的情况下,我们可以通过< ...

  4. linux自学(三)之开启虚拟机

    上一篇:linux自学(二)之centos7镜像安装 前面都已经铺垫好了,下面就是开始安装镜像了,真正的开启一台linux机器. 点击开启此虚拟机,如图: 之后就是等待了,然后就是开始配置,首先如下图 ...

  5. 基于 task 为 VSCode 添加自定义的外部命令

    我们有很多全局的工具能在各处使用命令行调用,针对某个仓库特定的命令可以放到仓库中.不过,如果能够直接为顺手的文本编辑器添加自定义的外部命令,那么执行命令只需要简单的快捷键即可,不需要再手工敲了.   ...

  6. 在 GitHub 公开仓库中隐藏自己的私人邮箱地址

    GitHub 重点在开方源代码,其本身还是非常注重隐私的.这一点与面向企业的 GitLab 很不一样. 不过,你依然可能在 GitHub 上泄露隐私信息,例如企业内部所用的电子邮箱. GitHub 对 ...

  7. 实用且堪称神器的Chrome插件推荐

    前言 相信很多人都在使用 Chrome 浏览器,其流畅的浏览体验得到了不少用户的偏爱,但流畅只是一方面, Chrome 最大的优势还是其支持众多强大好用的扩展程序(Extensions).最近为了更好 ...

  8. cacti监控linux主机时iptables阻碍了udp161端口造成无法监控解

    由于在添加linux主机时,有防火墙启用,造成无法监控linux主机,现有两种方法解决无法监控linux主机问题:可以通过在监控主机执行该命令: snmpwalk -c public -v 2c 19 ...

  9. ORACLE11g 没有控制文件如何通过rman备份恢复数据的详细实战过程

    1.副总裁需要裸恢复的严峻现实 集团总部的信息部负责人给我打电话说为了找一年前的记录,所以需要对一年前2015年5月1日的数据进行恢复.而2016年初因为进行迁移,所以有些文件可能丢失,手上只有rma ...

  10. MongoDB在windows平台分片集群部署

    本文转载自:https://www.cnblogs.com/hx764208769/p/4260177.html 前言-为什么我要使用mongodb 最近我公司要开发一个日志系统,这个日志系统包括很多 ...