当前位置 : 首页 » 文章分类 :  开发  »  Hexo博客(23)弃用七牛云图床改为git仓库图床

Hexo博客(23)弃用七牛云图床改为git仓库图床

2018.9.30收到七牛邮件通知测试域名要被回收了,用七牛做图床已经2年多了吧,之前就担心可能被禁,现在果然不能用了。
如果绑定自定义域名的话还能用,但自己的域名没备案无法绑定。如果备案方便的话备一个也没问题,但备案就得有主机,我这种解析到git pages静态页面的域名没主机无法备案。

2019.12.23更新,弃用 coding 图床,改为自己的vps图床。参考 Hexo博客(27)2019博客重构


使用Coding公开repo做图床

新建一个空的公开repo,名为image,把图片上传到repo中,拿到raw链接就直接可以访问图片。

注意必须用raw链接才是直接访问图片,如果用页面预览时的blob链接访问还是一个页面,比如
图片blob链接:(2019.12现在看不到了,此仓库已删)
https://coding.net/u/masikkk/p/image/git/blob/master/blog/hexo-23-qiniu-mail.png

对应的raw链接:(2019.12现在看不到了,此仓库已删)
https://coding.net/u/masikkk/p/image/git/raw/master/blog/hexo-23-qiniu-mail.png

图片为:


raw链接图片

用自定义域名访问图床

用自定义域名访问更简短,也更一目了然。
我的解决方案是:给自己的博客域名 http://madaimeng.com/ 添加一个二级域名 image.masikkk.com 的解析,解析到图床repo,为了能够响应这个http请求,图床repo必须开启pages服务
也就相当于开了个pages专门做图床。


图床repo开启pages服务

直接在image项目“代码 - pages服务”页面上点一键开启pages即可,非常方便。
开启后即可使用默认的 http://masikkk.coding.me/image/ 域名访问此repo,当然目前根目录下什么都没有。

开启pages服务后,可以使用下面的链接访问刚才的图片:
http://masikkk.coding.me/image/blog/hexo-23-qiniu-mail.png

如何创建静态 Coding Pages?
https://coding.net/help/doc/pages/creating-pages.html


阿里云中添加域名解析

阿里云中添加一条CNAME解析,将二级域名 image.masikkk.comwww.image.masikkk.com 解析到 masikkk.coding.me,如下图,图中是我的域名 madaimeng.com 的所有解析记录


阿里云域名解析

注意:如果想带www和不带www都能访问,就需要配置两条二级域名解析

记录类型

  • A记录:将域名指向一个IPv4地址(例如:10.10.10.10),需要增加A记录
  • CNAME记录:如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录

主机记录:

  • www :将域名解析为www.example.com,填写www;
  • @ :将域名解析为example.com(不带www),填写@或者不填写;
  • 二级域名:如:abc.aliyun.com,填写abc。

绑定自定义域名

点击pages页面右上角的设置,进入pages设置页面。
在“绑定新域名”中填入自定义域名 image.masikkk.com 后点击绑定,需要注意以下几点:

1、绑定新域名之前有个提示:绑定前请在域名 DNS 设置中添加一条 CNAME 记录指向 masikkk.coding.me
之前是让把自定义域名解析到 pages.coding.me ,现在改为解析到 masikkk.coding.me了,不过之前的自定义域名解析不需要修改,他肯定是可以向前兼容的。
从这个解析目的地址的变化可以看出coding的pages服务是做了优化的,之前所有用户的自定义域名都解析到 pages.coding.me 命名空间,然后coding后台再根据项目中绑定的自定义域名去这个空间中反查域名,肯定比较耗时。现在改为不同用户的自定义域名解析到各自独立的命名空间中,反查起来肯定快很多。

2、还有个变化,我添加解析记录之前是无法绑定成功的,会提示查不到这个解析记录,我猜是点击绑定按钮时coding后台会去DNS中查将要绑定的域名是否已经解析到 masikkk.coding.me,如果没有的话无法绑定,这相当于增加了一个验证的步骤。之前是没有这个的。

3、解释一下他这个绑定到底是干什么用的?
上一步中我们已经将自定义的二级域名 image.masikkk.com 解析到了 masikkk.coding.me,也就是路由到了coding中的我的用户名下(之前是路由到pages.coding.me,更宽泛),但我用户名下有好几个项目,他怎么知道再往下该路由到哪个项目呢?答案就是绑定,我们在项目的pages中设置绑定 image.masikkk.com 域名,也就是将此子域名和这个项目绑定到了一起,之后所有到达 masikkk.coding.me 的http请求流量,如果源地址是 image.masikkk.com 就自动转发给 image 项目的pages服务,相当于coding后台做的一个软dns解析。

4、如果想带www和不带www都能访问,就需要配置两个自定义域名绑定,我将不带www的设为首选,其他的都自动跳转到首选。


自定义域名绑定

绑定后,便可以用自定义域名访问图片了:
http://image.masikkk.com/blog/hexo-23-qiniu-mail.png
http://www.image.masikkk.com/blog/hexo-23-qiniu-mail.png

如何绑定自定义域名?
https://coding.net/help/doc/pages/domain.html


python批量下载七牛云图片

想把七牛云存储空间中的400多张图片批量下载下来,但页面上没有批量下载功能,发现官方提供了sdk可以实现批量下载。

七牛云提供了各种语言的sdk,为了方便用Python。
https://developer.qiniu.com/kodo/sdk/1242/python

pip安装qiniu依赖

pip install qiniu

授权初始化

在使用SDK 前,您需要一对有效的 AccessKey 和 SecretKey 签名授权。
在 个人中心 - 密钥管理 中查看AK和SK
https://portal.qiniu.com/user/key

获取Access Key 和 Secret Key 后,调用如下两行代码进行初始化对接:

from qiniu import Auth
q = Auth(access_key, secret_key)

https://developer.qiniu.com/kodo/sdk/1242/python#1


python批量下载脚本

七牛官方提供的 批量下载与空间备份 脚本
https://developer.qiniu.com/kodo/kb/3744/batch-download-and-backup-space

调用list接口,遍历空间,获得空间内的文件信息,然后下载。代码逻辑是先调用list接口获得文件名的集合,再与空间域名拼接成url,循环调用download方法下载文件。

# -*- coding: utf-8 -*-
from qiniu import Auth
from qiniu import BucketManager
import requests
import os

# 填入自己的ak和sk
access_key = ''
secret_key = ''

q = Auth(access_key, secret_key)
bucket = BucketManager(q)

# 填入自己的存储空间(bucket)名
bucket_name = 'your_bucket_name'
# 前缀
prefix = None
# 列举条目
limit = 200
# 列举出除'/'的所有文件以及以'/'为分隔的所有前缀
delimiter = None
# 标记
marker = None

# 下载目标文件夹
path = '/somedir/'

ret, eof, info = bucket.list(bucket_name, prefix, marker, limit, delimiter)
for i in ret['items']:
    print(i['key'])
    base_url = 'your_bucket_domain/'+i['key']
    print(base_url)

    #如果空间有时间戳防盗链或是私有空间,可以调用该方法生成私有链接
    private_url = q.private_download_url(base_url, expires=100)
    print(private_url)

    r = requests.get(private_url)

    if r.content:
        if not os.path.exists(path):
            os.makedirs(path)
        file = open(path + i['key'], "wb")
        file.write(r.content)
        file.flush()
        file.close()

注意:
1、your_bucket_domain 变量填入系统给bucket分配的 外链默认域名。七牛会给每个 bucket 分配一个测试域名,但由于 测试域名的访问限制,生产环境需要 绑定自定义域名 访问。
key可理解为文件名,但可包含文件分隔符等其它字符。

2、这个脚本无法处理中文文件名,中文在 private_download_url 函数中会出现编码错误:

File "batch_download.py", line 35, in <module>
   private_url = q.private_download_url(base_url, expires=100)
 File "/usr/local/lib/python2.7/site-packages/qiniu/auth.py", line 122, in private_download_url
   url = '{0}e={1}'.format(url, str(deadline))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 56-58: ordinal not in range(128)

3、后来我发现能够直接获取 外链的都是公开空间,根本不需要通过 private_download_url 函数来生成私有外链,直接用 requests.get 访问即可,图片名中有中文也可以get成功。
注释掉private_url = q.private_download_url(base_url, expires=100),直接 r = requests.get(base_url)下载,成功下载400多个图片到本地。


python获取指定bucket中的文件列表

获取指定前缀文件列表
https://developer.qiniu.com/kodo/sdk/1242/python#rs-list

# -*- coding: utf-8 -*-
# flake8: noqa
from qiniu import Auth
from qiniu import BucketManager
access_key = '...'
secret_key = '...'
q = Auth(access_key, secret_key)
bucket = BucketManager(q)
bucket_name = 'Bucket_Name'
# 前缀
prefix = None
# 列举条目
limit = 10
# 列举出除'/'的所有文件以及以'/'为分隔的所有前缀
delimiter = None
# 标记
marker = None
ret, eof, info = bucket.list(bucket_name, prefix, marker, limit, delimiter)
print(info)
assert len(ret.get('items')) is not None

这个脚本没问题,可以获得自己空间中的图片名列表。


python私有空间下载

私有空间下载
https://developer.qiniu.com/kodo/sdk/1242/python#download-private

# -*- coding: utf-8 -*-
# flake8: noqa
import requests
from qiniu import Auth
access_key = 'AK'
secret_key = 'SK'
q = Auth(access_key, secret_key)
#有两种方式构造base_url的形式
base_url = 'http://%s/%s' % (bucket_domain, key)
#或者直接输入url的方式下载
base_url = 'http://bucket_domain/key'
#可以设置token过期时间
private_url = q.private_download_url(base_url, expires=3600)
print(private_url)
r = requests.get(private_url)
assert r.status_code == 200

注意:bucket_domain 表示 系统给bucket分配的 外链默认域名。一开始我以为是存储空间名,怎么也下载不了。
key可理解为文件名,但可包含文件分隔符等其它字符。

后来我发现能够直接获取 外链的都是公开空间,根本不需要通过 private_download_url 函数来生成私有外链,直接用 requests.get 访问即可。
https://developer.qiniu.com/kodo/kb/1321/how-to-acquire-the-outside-storage-file-links


总结和收尾

1、通过上面的python脚本将七牛中的400多个图片下载到 image 项目中,push到远程仓库。
会有点儿担心repo满了怎么办,看了下coding的仓库容量,免费的银牌会员有512M空间,尽量少传大照片的话能用个几年吧,以后写博客和笔记也尽量少用图片,尽量用文字表达。
最后还是满了的话,就再开个repo分流,或者升级会员。

2、全局搜索替换原来七牛的测试url,改为自己git图床的自定义域名。
改起来太方便了,只需要搜索 7xt40n.com1.z0.glb.clouddn.com ,全局替换为 image.masikkk.com/blog 即可。
之前有些图片使用了七牛云的瘦身和自动旋正,瘦身是url后加 ?imageslim 参数,自动旋正是加?imageMogr2/auto-orient参数,我整体替换为自己的图床域名后不需要做任何改动,因为url中?后的查询参数是可以被自动忽略的,太秒了。
当初我也很有远见的,给所有带图片的文章加了有图标签 http://madaimeng.com/tags/WithPicture/ ,所以直接通过这个标签就能列出所有包含图片的文章,当时也是考虑到图床不稳定以后肯定会有变动,方便自己标识出来哪些文章中引入了图片。

要替换的时候才发现,Atom在replace界面自动把替换前后的结果对比都给列出来了,这也太贴心了吧:


Atom全局替换

3、不好的地方是不能享受七牛云的图片自动瘦身了。以后上传手机拍的两三兆的大图片前都先自己压缩下。

4、我发现改用git仓库做图床后插入图片方便多了,截图完成后就丢到 image 项目中并push到远程仓库(通过命令行操作或Git客户端或Atom),然后在文章中引用即可。之前插入图片时,还得登录七牛云页面去上传图片,现在简单多了。


上一篇 Spring-Test

下一篇 博客项目方案

阅读
评论
3.1k
阅读预计12分钟
创建日期 2018-10-01
修改日期 2018-10-01
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论