使用过NAS(Network Attached Storage)的朋友都知道,它可以通过局域网将本地硬盘转换为局域网内的“网盘”,简单理解就是搭建自己的“私有云”,但是硬件和网络成本都太高了,有点可望而不可及的意思。Alist开源库则可以满足我们,它能将公共网盘反过来变成一种联网的本地硬盘,使用Web页面来统一挂载和管理,网盘类型包含但不限于:百度网盘、阿里云盘、迅雷网盘等等。

Alist挂载网盘的另外一个好处是可以基于WebDav协议直接播放网盘资源,虽然说网盘也支持在线播放功能,但是代价就是得充会员,没错,这符合逻辑,网盘主机厂也得盈利,但Alist技术可以帮助我们曲线救国,节省一笔开支。

此外,使用WebDAV的精髓在于WebDAV可以被挂载为一个本地(服务器)磁盘,正因为WebDAV可以被映射为一个本地目录,所以只需要调用本地播放器或者本地搭载的浏览器播放器进行播放。无论是mkv、wmv或是h.265编码方案,通过一个现代的本地播放器都能完美的播放,不存在需要转码的情况,所以,使用WebDAV协议,服务器的负担只有传输数据这一个任务。

Docker部署Alist

Alist软件可以通过多种方式进行安装和部署,但最方便的,还是通过Docker,主要是因为由于各大网盘主机厂的网盘版本更新频率很快,所以Alist的版本也会随之频繁更新,而Docker的操作最简单快捷,只需要简单的命令就可以完成部署,更适合这种频繁更新的情况。

关于Docker请移玉步至一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群,这里不作过多赘述。

首先在终端执行命令:

docker run -d --restart=always -v /etc/alist:/opt/alist/data -p 5244:5244 -e PUID=0 -e PGID=0 -e UMASK=022 --name="alist" xhofe/alist:latest

该命令会在后台生成一个Alist容器,服务运行在系统的5244端口,如果是首次运行,会拉取最新的Alist镜像:

➜  interview git:(main) docker run -d --restart=always -v /etc/alist:/opt/alist/data -p 5244:5244 -e PUID=0 -e PGID=0 -e UMASK=022 --name="alist" xhofe/alist:latest
Unable to find image 'xhofe/alist:latest' locally
latest: Pulling from xhofe/alist
b1101342f8ad: Pull complete
d9f5c37d20f9: Pull complete
5f4a1655e3cc: Pull complete
c1e599f8ce92: Pull complete
d613bea8ea45: Pull complete
Digest: sha256:520e531ddaf5732c4944d5c35ad4dbb601e2fadae14b99a81e86ea3f7e065173
Status: Downloaded newer image for xhofe/alist:latest
7bf1c7f384526bd22aa078223d548ab0c16b79c245919e8a0cf7b439e79f34d6

随后执行命令:

docker ps

就可以看到正在运行的Alist服务容器:

➜  ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7bf1c7f38452 xhofe/alist:latest "/entrypoint.sh" 3 hours ago Up 3 hours 0.0.0.0:5244->5244/tcp alist
➜ ~

Alist服务平台基于前后端分离的Gin和React,所以平台管理页面需要用户名和密码才能登入,输入命令:

docker exec -it alist ./alist admin

该命令会进入容器并展示账号和密码:

INFO[2023-02-13 22:54:17] admin user's info:
username: admin
password: 8U5js3bH

记录下来,注意这是本地的服务,所以外网是无法进行登录的。

至此,Alist的本地部署就完成了,假如Alist发了新的版本,也可以通过下面的命令进行更新操作:

docker stop alist  #停止alist容器  

docker rm -f alist  #删除alist容器,因为之前映射到了本地,所以数据不会被删除  

cp -r /root/data/docker_data/alist /root/data/docker_data/alist.bak  #可选,如果不放心,可以备份一下数据  

docker pull xhofe/alist:latest  #拉取最新的alist镜像  

docker run -d --restart=always -v /root/data/docker_data/alist:/opt/alist/data -p 5244:5244 --name="alist" xhofe/alist:latest    #运行安装命令,注意-v挂载的路径与原来相同

这里的区别就是通过挂载命令将alist的配置文件挂载到宿主机的/root/data/docker_data/alist目录,方便升级后进行使用。

挂载百度网盘

部署好Alist服务后,访问本地网址进行登录:http://localhost:5244/@manage

用户名和密码就是上文中Docker中返回的,登录成功后,选择左侧菜单中的存储,添加百度网盘:

百度云盘的操作完全基于百度云的开放API,只要给Alist授权操作接口的权限即可,进入网址:https://tool.nn.ci/baidu/callback?code=288faa8f669a3d174ea9af0bd1d72ab5 进行授权操作,记录client_id、client_secret和refresh_token,分别将三个参数填入挂载的表单中,然后挂载目录填入根目录:/,注意表单中最好把web代理选项勾选。

随后进入Alist服务首页:http://localhost:5244,就可以在线播放百度云内存储的资源:

非常方便。

挂载阿里云盘

截止到本文发布的2-14号,阿里云盘目前挂载过程中会出现设备id的bug,但是挂载阿里云盘分享的网盘还是没问题的,由于阿里云盘操作基于客户端的token,所以必须先通过移动端登录页面来获取token:

https://passport.aliyundrive.com/mini_login.htm?lang=zh_cn&appName=aliyun_drive&appEntrance=web&styleType=auto&bizParams=¬LoadSsoView=false¬KeepLogin=false&isMobile=true&hidePhoneCode=true&rnd=0.9186864872885723

登录成功后,通过抓包,获取后端login.do接口的返回值:

将bizExt的值复制出来,然后利用Python的Base64模块进行解码操作:

import base64
coded_string = '''Q5YACgA...'''
base64.b64decode(coded_string)

解码出来的refreshToken就是我们需要的令牌:

"refreshToken":"sdfdsfsdfdsfb9fadd4f62ee4be968e"

随后在后台将token和分享的id填入表单即可:

注意这里挂载路径不能填入根目录/,因为之前我们已经挂载了百度网盘了,所以选择一个子目录share。

至此,阿里云盘分享就挂载好了,可以坐下来,犒劳自己了:

Python3.10接入

除了在线播放,我们还可以使用Python3.10直接通过WebDav协议操作Alist挂载的网盘,可谓是神乎其技了。

首先安装WebDav库:

pip3 install webdavclient3

随后编写webdav.py文件:

from webdav3.client import Client  

options = {
'webdav_hostname': "http://localhost:5244/dav",
'webdav_login': "admin",
'webdav_password': "8U5js3bH"
}
client = Client(options) client.verify = False # To not check SSL certificates (Default = True) files1 = client.list() print(files1)

这里的webdav_hostname指的是刚才用docker挂载的webdav服务路径,账号和密码是上文中docker返回的,不用担心外泄,因为是本地服务。

程序返回:

➜  gotest /opt/homebrew/bin/python3.10 "/Users/liuyue/wodfan/work/gotest/webdav.py"
['dav/', 'aliyunpan/', 'The.Last.of.Us.S01E03.1080p.WEB-DL.DDP5.1.Atmos.H.264-Q66.mkv', 'The.Last.of.Us.S01E05.1080p.WEB-DL.DDP5.1.Atmos.H.264-Q66.mkv', 'The.Last.of.Us.S01E04.1080p.WEB-DL.DDP5.1.Atmos.H.264-Q66.mkv', 'house.of.the.dragon.s01e08.1080p.web.h264-cakes.chs.eng.mp4', 'House.of.the.Dragon.S01E07.Driftmark.1080p.HMAX.WEB-DL.DDP5.1.Atmos.H.264-SMURF.chs.eng.mp4', 'House.of.the.Dragon.S01E06.The.Princess.and.the.Queen.720p.HMAX.WEB-DL.DDP5.1.H.264-NTb.chs.eng.mp4', 'House.of.the.Dragon.S01E05.We.Light.the.Way.1080p.HMAX.WEB-DL.DDP5.1.Atmos.H.264-SMURF.chs.eng.mp4', 'house.of.the.dragon.s01e04.720p.web.h264-cakes.chs.eng.mp4', 'house.of.the.dragon.s01e03.720p.web.h264-cakes.chs.eng.mp4', 'share/']

可以很方便的将挂在后的网盘文件目录进行返回。

除此之外,我们也可以针对网盘资源进行增删改查的动态操作:

# Create directory  

client.mkdir("dir1/dir2")
# Delete resource client.clean("dir1/dir2")
# Copy resource client.copy(remote_path_from="dir1/file1", remote_path_to="dir2/file1")
client.copy(remote_path_from="dir2", remote_path_to="dir3")
# Move resource client.move(remote_path_from="dir1/file1", remote_path_to="dir2/file1")
client.move(remote_path_from="dir2", remote_path_to="dir3")
# Download a resource client.download_sync(remote_path="dir1/file1", local_path="~/Downloads/file1")
client.download_sync(remote_path="dir1/dir2/", local_path="~/Downloads/dir2/")
# Upload resource client.upload_sync(remote_path="dir1/file1", local_path="~/Documents/file1")
client.upload_sync(remote_path="dir1/dir2/", local_path="~/Documents/dir2/")

也就是说,只要Alist服务已经挂载好网盘,我们甚至不需要平台界面,只编写代码就可以对网盘资源予取予求。

结语

旧时王谢堂前燕,飞入寻常百姓家。只要一台联网的电脑,就可以实现自己的“私有云”,成本低到令人发指,Alist,新时代的普罗米修斯,为我们带来了网盘自由的火种。

影片自由,丝滑流畅,Docker容器基于WebDav协议通过Alist挂载(百度网盘/阿里云盘)Python3.10接入的更多相关文章

  1. 闻其声而知雅意,基于Pytorch(mps/cpu/cuda)的人工智能AI本地语音识别库Whisper(Python3.10)

    前文回溯,之前一篇:含辞未吐,声若幽兰,史上最强免费人工智能AI语音合成TTS服务微软Azure(Python3.10接入),利用AI技术将文本合成语音,现在反过来,利用开源库Whisper再将语音转 ...

  2. 让视频丝滑流畅——N/A通用补帧傻瓜解决方案

    补帧就是字面意思,把24帧的视频通过算法即时补偿到更高的帧数,获得更优秀的观感体验 索尼大法brivia电视的中高端产品线中的motionflow技术,都可以实现硬件补帧,只需要把动态打开,相应的画面 ...

  3. 细数阿里云在使用 Docker 过程中踩过的那些坑

    昨天下午道哥在微信上丢给我一条新闻,看看,我们阿里云支持 Docker 企业版了.我打开一看,果然,阿里云发布了飞天敏捷版,开始支持企业级的 Docker 容器. 美国中部时间4月19日,阿里云在容器 ...

  4. 给一个正在运行的Docker容器动态添加Volume

    给一个正在运行的Docker容器动态添加Volume本文转自:http://dockone.io/article/149 [编者的话]之前有人问我Docker容器启动之后还能否再挂载卷,考虑到mnt命 ...

  5. linux --- 9. docker 容器 和 rabbitmq 队列

    一. docker 容器 1.docker是什么? .linux下容器技术有很多,docker是做的最杰出的一款 .docker能够支撑阿里双十一,京东618的业务,说明,性能,安全性不得差 .doc ...

  6. 初学Docker容器网络不得不看的学习笔记

    一.关于Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...

  7. docker容器的学习笔记

    目录 Docker入门学习笔记(一) 1. 什么是Docker? 2. Docke的目标 3. Docker通常应用场景 4. Docker的基本组成 补:Docker容器相关技术简介 安装Docke ...

  8. Linux高级运维 第八章 部署docker容器虚拟化平台

    8.1  Docker概述 实验环境: CENTOS7.4-63 64位 Dcoker概述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到 ...

  9. Docker容器化技术(上)

    目录 Docker容器化技术 一.介绍 二.Docker的发展 三.Docker安装 四.阿里云Docker镜像加速 五.Docker的基本概念 六.命令 七.Docker宿主机与容器通信 八.容器内 ...

  10. Docker 容器简介与部署

    关于Docker容器技术 参考文献:<docker 从入门到精通> Docker容器简介 Docker的构想是要实现 "Build,Ship and Run Any App,An ...

随机推荐

  1. linux如何删除多余网卡

    ifconfig tunl0 down ip link delete tunl0

  2. mysql 在连接表中的要点

    思路:分析需求,分析字段来自哪些表 (连接查询)            确定使用哪种连接查询?  确定交叉点(这两个表中哪些数据是相同的)            判断条件 such as  学生表中的 ...

  3. 为什么Linux需要虚拟内存 [转载好文]

    操作系统中的 CPU 和主内存(Main memory)都是稀缺资源,所有运行在当前操作系统的进程会共享系统中的 CPU 和内存资源,操作系统会使用 CPU 调度器分配 CPU 时间1并引入虚拟内存系 ...

  4. 前端项目通过‘URL 重写’部署在 IIS 中,访问 WebAPI 接口

    〇.前言 在前端项目开发时,我们可以通过配置代理 proxy 来访问本地或者是远程接口,但是部署后代理就失效了.如果项目部署在 IIS 上,就没法去对应到指定接口,此时就需要 IIS 中的'URL重写 ...

  5. Git同步操作

    同步github数据 先要进入仓库文件夹 新建仓库文件夹要初始化或将远程仓库clone下来 git init或git clone https://github.com/用户名称/仓库名称.git 新建 ...

  6. 关于led蓝牙控制器ble通信分析

    前言 前几天在网上买了一个led蓝牙控制器,可以用手机app通过蓝牙连接控制rgb led灯,当然这个也是属于ble通信.之前我写过一篇体重称蓝牙通信的,不过那个较为简单,数据也是靠分析出来的. 这次 ...

  7. 前后端分离开发工具YAPI部署记录

    之前公司说要建立起前后端分离开发模式,而我只是刚毕业,让我负责建立起这个规范 ,虽然刚毕业还没去大厂待过,对我来说是个挑战,只能按我理解和网上的方案进行建立.在 Google 和 github 搜了好 ...

  8. Android ViewPager2 + Fragment 联动

    Android ViewPager2 + Fragment 联动 本篇主要介绍一下 ViewPager2 + Fragment , 上篇中简单使用了ViewPager2 实现了一个图片的滑动效果, 那 ...

  9. 【LeetCode】剑指 Offer 30. 包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 思路 最初看到O(1)复杂度的时候,就想 ...

  10. MySQL字符编码、存储引擎、严格模式、字段类型之浮点 字符串 枚举与集合 日期类型

    目录 字符编码与配置文件 数据路储存引擎 创建表的完整语法 字段类型之整型 严格模式 字段类型之浮点型 字段类型之字符串类型 数字的含义 字段类型之枚举与集合 字段类型之日期类型 字符编码与配置文件 ...