故事背景:

七牛云最近一波测试域名操作真是把我坑死了!这简直和百度赠送你2T网盘,之后再限速一样骚操作。于是,痛定思痛自己买个云主机、自己搭图床应用!


1、七牛图片批量下载到本地

1.1 曲折尝试

当测试链接不能用的时候,我想依次用到下面几个方法尝试download图片:

  • 用七牛之前的传图工具qshell,看看有啥办法(行不通)
  • 找七牛图片资源处看看有没有批量打包下载(NO)
  • 自己写个前端爬虫将图片爬下来(没下载链接...)
  • 绑定一个自己的域名(需要实名认证+域名备案)

    ...

最后发现一个神器:qfetch,是根据七牛云存储API实现的一个简易命令行辅助工具。覆盖七牛云存储开发者网站包含的大部分甚至更高级的功能。开发者在对七牛云存储 API 有基本了解的情况下,此工具将会非常适用。


1.2 qfetch基本操作

-按照如下指令,输入自己七牛云的账号和密码登录

./qrstcl login <your username> <your password>

由于我之前所有图片是在七牛云对象存储中的bucket中,运行如下代码查看目前我建立的所有bucket:

./qrsctl buckets

我里面只有一个buckets:beautifulzzzz

可以用下列命令查看该buckets下的所有资源:(注意最后是两个英文单引号)

./qrsctl listprefix beautifulzzzz ''

得到资源列表后,可以调用下列命令下载一个资源:

qrsctl get <Bucket> <Key> <DestFile>
比如./qrsctl get beautifulzzzz 1.jpg ./1.jpg可以将picture中的1.jpg下载到本地机器当前路径下的1.jpg

1.3 自动化脚本

综上几步,可以写一个自动化脚本:

qiniuyun (master) ✗ cat download.sh
#!/bin/bash
imgs=`./qrsctl listprefix beautifulzzzz ''` i=0
echo $imgs | tr " " "\n" | while read line
do
if(($i>0))
then
echo $line
path=`dirname $line`
echo $path
if [ ! -d "$path" ];then
mkdir -p $path
fi ./qrsctl get beautifulzzzz $line ./$line
fi
i=$(($i+1))
done

注:该脚本相对于 chensonglu 分享的《七牛云测试域名失效导致图片外链失效的解决办法》,增加了多级目录文件下载功能。


2、python 图床服务器搭建

2.1 python3环境搭建

安装python:

sudo apt-get install python2.7-dev python3-dev
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py

安装python虚拟环境virtualenv virtualenvwrapper:(用虚拟开发环境可以为每个工程提供独立的python开发环境、独立的包、独立的版本,每个独立的环境会在~/.virtualenvs/下形成资源包~)

sudo pip install virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip

之后在~/.profile文件最后添加下面几行:

# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

之后如果想用python虚拟环境,在每次打开一个新的terminal就要执行一次source ~/.profile

$ source ~/.profile

接下来我们生成一个python虚拟环境来用于python_pic_server的开发提供环境:(这里不讲python2,强烈建议用python3)

mkvirtualenv python_pic_server -p python3

注:再次说明python虚拟环境是完全独立的,也就是说在python_pic_server的环境下安装的python包,步适用于全局;在全局安装的包,不适合python_pic_server。

如何验证你如何将python_pic_server环境生成好了呢?——新开一个terminal,执行下列命令:

$ source ~/.profile
$ workon python_pic_server

如果terminal前面的文字变成了(python_pic_server)表明成功创建了名为python_pic_server的python虚拟环境,在接下来的操作中都要保持在python_pic_server环境中!


2.2 安装Sanic

sanic 是一个比较新的,但是发展比较快的框架。其特征是速度非常快。据他们官方网站自己说,sanic 是最快的 python 框架。

Sanic is a Flask-like Python 3.5+ web server that’s written to go fast. It’s based on the work done by the amazing folks at magicstack, and was inspired by this article.

在python_pic_server中安装sanic:

pip install sanic

sanic用法比较简单,具体可以参考:[6].sanic getting started page


2.3 写图床服务器程序

在/root/App/python_pic_server目录下创建run.py:

(python_pic_server) ➜  python_pic_server cat run.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from sanic import Sanic
from sanic.log import logger
from sanic.response import json, text, file
import os, sys
import hashlib
import base64 app = Sanic()
# 图片存储目录
baseDir = sys.path[0] + '/image/'
# 校验 Token 写死就成,反正自己用的嘛
token = 'SheIsABeautifulGirl'
# 允许的域名列表
allowHost = [
'127.0.0.1:8000',
'localhost',
'pic.phage.com'
] # 成功返回方法
def ok(data):
if type(data) == list:
return json({"data": {"list": data}, "status": 0})
else:
return json({"data": data, "status": 0})
# 失败返回方法
def fail(data):
return json({"data": data, "status": 1}) # 获取图片后缀名
def getSuffix(filename):
tempArr = filename.split('.')
suffix = tempArr[-1]
fileType = ['jpg', 'jpeg', 'gif', 'png']
if len(tempArr) < 2:
return 'error name'
elif suffix not in fileType:
return 'error type'
else:
return suffix
# 检查请求地址是否授权
def checkHost(host):
for i in allowHost:
if i in host:
return True
return False # 上传图片文件接口
@app.route('/api/v1/upimg', methods=['POST'])
async def upimg(request):
# 判断用户是否具有上传权限
if request.headers.get('token') != token:
return fail('您没有使用本服务的权限')
image = request.files.get('file').body
# 判断文件是否支持
imageName = request.files.get('file').name
imageSuffix = getSuffix(imageName)
if 'error' in imageSuffix:
return fail(imageSuffix)
# 组织图片存储路径
m1 = hashlib.md5()
m1.update(image)
md5Name = m1.hexdigest() # 用 md5 的前两位来建文件夹,防止单个文件夹下图片过多,又或者根目录下建立太多的文件夹
saveDir = baseDir + md5Name[0:2] + '/'
savePath = saveDir + md5Name[2:] + '.' + imageSuffix
resPath = '/' + md5Name[0:2] + '/' + md5Name[2:] + '.' + imageSuffix # 如果文件夹不存在,就创建文件夹
if not os.path.exists(saveDir):
os.makedirs(saveDir) # 将文件写入到硬盘
tempFile = open(savePath, 'wb')
tempFile.write(image)
tempFile.close() # 给客户端返回结果
return ok({"path": resPath}) # 请求图片接口
@app.route('/', methods=['GET'])
async def img(request):
# 判断是否为网站请求,否则就加上自定义的字符串(允许本地访问)
host = request.headers.get('host') or 'no_host'
# 判断请求接口是否带参数,否则加上自定义字符串(没有这个文件夹,返回404)
args = request.args.get('path') or 'no_file'
# 拼接文件地址
path = baseDir + args
#logger.info(request.headers)
#logger.info(path)
#logger.info(host)
# 如果不在允许列表,则展示 401 图片
if not checkHost(host):
path = baseDir + '/cb/fea262f9b861c6fce14d3c3c8ba9a1.png'
# 如果文件不存在,则展示 404 图片
if not os.path.exists(path):
path = baseDir + '/b4/dcd9ad1068ae6aa41ce486fa7f2739.png'
# 返回文件
logger.info(path)
return await file(path)
# 启动服务
if __name__ == "__main__":
app.run(host="127.0.0.1", port=8000)

2.4 nginx配置

vim /etc/nginx/nginx.conf 编辑配置文件,在http模块的最后添加:

server {
listen 3000;
server_name tuchuang.beautifulzzzz.com;
location / {
proxy_pass http://127.0.0.1:8000;
}
}

修改好之后relaod一下nginx:

nginx -s reload

这样访问 tuchuang.beautifulzzzz.com:3000 就相当于访问本机的8000端口,正好是我们的图床服务器端口!

注: 别忘了在你购买域名的地方设置一下A解析!我没备案,因此就用了3000端口。


2.5 运行图床并使用

将第1步下载的七牛云图片放在image目录下,然后将run.py设置为可执行,并执行:

chmod +x run.py
./run.py

注: 想在后台执行可以用:nohup ./run.py &

此时,访问图片可以通过 (/image/20180926/flygame.png)

http://tuchuang.beautifulzzzz.com:3000/?path=/20180926/flygame.png

上传图片可以通过:

curl http://tuchuang.beautifulzzzz.com:3000/api/v1/upimg -F "file=@a.png" -H "token: SheIsABeautifulGirl" -v

3、shell脚本批量替换某文件夹下文件中的域名字串

现在,准备写一个批处理脚本进行善后。我首先想到的是用下面命令直接搞定:

sed -i "s/A/B/g" `grep -rl A`

可是发现grep出来的文件目录中带有空格,这样这条命令就处理不到!

于是自己写了一个循环查找替换的批处理脚本:

doc (master) ✗ cat change.sh
#!/bin/bash
#bash change.sh "odff1d90v.bkt.cloudd
#n.com" "tuchuang.beautifulzzzz.com:3000\/?path=" #bash change.sh "sed src string" "sed dst string"
IFS=$'\n' if [ "$1" = "" ] && [ "$2" = "" ];then
echo "params 2"
exit
fi for element in `grep -rl "$1"`
do
#echo $element
cmd="s/$1/$2/g"
echo $cmd
sed -i $cmd $element
done

注: 这里IFS=$'\n'是为了让FOR循环的时候以换行作为分割

使用的时候只要将该文件放置在对应的ROOT目录中,执行:

bash change.sh "odff1d90v.bkt.clouddn.com" "tuchuang.beautifulzzzz.com:3000\/?path="

注:change.sh的两个参数就是sed的被替换对象和替换对象,注意转译符!


LINKS

[1].七牛云测试域名失效导致图片外链失效的解决办法

[2].命令行辅助工具(qrsctl)

[3].Linux shell 之 提取文件名和目录名的一些方法

[4].逐行处理文本文件-一点心青-cnblog

[5].shell中的特殊变量IFS- __Cheny-csdn

[6].sanic getting started page

[7].Python3 初学实践案例(14)打造一个私人图床服务器-FungLeo-csdn

[8].Python 打造自己的图床升级篇 - PIL 为图片添加水印-FungLeo-csdn

[9].nohup和&后台运行,进程查看及终止-弥尘-cnblog


@beautifulzzzz
智能硬件、物联网,热爱技术,关注产品
博客:http://blog.beautifulzzzz.com
园友交流群:414948975

[python] 溜了,溜了,七牛云图片资源批量下载 && 自建图床服务器的更多相关文章

  1. Java 七牛云存储与下载

    七牛云的文件上传和下载(私有空间) 1.本篇博客参考网址 https://blog.csdn.net/peaceful000/article/details/53171578 https://blog ...

  2. Python编程快速上手(七)Unsplash批量下载器

    首发于个人博客:http://rhinoc.top/post/python_7.html 程序描述 V1.0输入关键字搜索图片,模拟页面下拉获取更多图片,页面加载完成后获取图片链接并下载至指定文件夹. ...

  3. 七牛云整合Ueditor的ThinkPHP版本

    首先去七牛云官网下载phpSDK工具放在Think/library/Vendor下. ueditor后台调用方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  4. 【PHP】Thinkphp 七牛云API对接

    访问一个网站,图片的流量占的比例是非常高的!在你的服务器硬盘上,图片占的容量也是非常高的. 如果要搞一个图片非常多,用户量又很庞大的网站,那么,得花多少钱烧在服务器上? 这种时候,当然要用第三方图片存 ...

  5. 七牛云图床和Markdown使用

    七牛云图床和Markdown使用 1.图床是什么? 图床一般是指储存图片的服务器,有国内和国外之分.国外的图床由于有空间距离等因素决定访问速度很慢影响图片显示速度.国内也分为单线空间.多线空间和cdn ...

  6. 七牛云图床及MPIC工具使用

    考虑到图片更容易被人接受,但是大量图片又会延迟博客加载速度.因此,个人感觉可以把静态文件资源托管在云端,这样加载的话就不至于太慢. 注册七牛云 实名验证通过 创建文件存储 内容管理-上传图片 下载Mp ...

  7. 图床工具PicGO实现七牛云图片上传

    图床工具PicGO实现七牛云图片上传 我们在写博客或者网络文章时经常需要上传图片.目前最有名气的图床工具就是PicGO. 简单的界面,完整的功能,在相册里也能直接复制markdown图片链接.一直深受 ...

  8. django之集成七牛云对象存储

    Python3 + Django2.0 集成 "七牛云" 对象存储 (SDK文档地址:http://developer.qiniu.com/kodo/api/3928/error- ...

  9. Lrc歌词批量下载助手 MP3歌词批量下载助手

    Lrc歌词批量下载助手  MP3歌词批量下载助手   易歌词的服务器已经挂掉,各个主流播放器已不提供明确的下载Lrc服务,当上G的MP3文件遇上苦逼的播放器,二缺就诞生了!本软件就是在这种背景下诞生的 ...

随机推荐

  1. VUE环境项目搭建以及简单的运行例子

    1.打开cmd命令窗口,node-v和npm-v可以查看相应的安装版本信息. 2.使用一下命令全局安装vue-cli. 1)npm install  -g  vue-cli 2)如果使用淘宝镜像,则是 ...

  2. shutil&shelve

    https://www.cnblogs.com/xiangsikai/p/7787101.html http://www.cnblogs.com/wupeiqi/articles/4963027.ht ...

  3. web.xml 各版本的 Schema 头部声明

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "- ...

  4. Java 基本语法,标识符,修饰符,关键字

    基本语法 编写 Java 程序时,应注意以下几点: 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的. 类名:对于所有的类来说,类名的首字母应该大写.如果类 ...

  5. https请求之绕过证书安全校验工具类(原)

    package com.isoftstone.core.util; import java.io.BufferedReader; import java.io.ByteArrayOutputStrea ...

  6. elsticsearch在kibanna中的操作

    #建立索引 PUT /es_note_tel{ "settings": { "number_of_shards": 1 }, "mappings&qu ...

  7. centos7 安装Mysql8.0笔记

    下载MySQL yum源 wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm 安装yum源 yum lo ...

  8. Build 2019 彩蛋

    N久没写过博客了… 最近在玩 APEX 但是手残党表示打到15级了,至今杀敌 4 人… 当快递员是越来越顺手了… 今年巨硬的 Build 大会会在 5 月 6-8 号召开 新发布的 Hololens ...

  9. oracle数据库学习

    trunc(number[,decimals])--number 待做截取处理的数值:decimals 指明需保留小数点后面的位数     CREATE PUBLIC DATABASE LINK Co ...

  10. CyclicBarrier介绍

    应用场景 在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了. 实例分析 我们需要统计全国的 ...