当前位置: 首页 > news >正文

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

使用过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接入

使用过NAS(Network Attached Storage)的朋友都知道,它可以通过局域网将本地硬盘转换为局域网内的“网盘”,简单理解就是搭建自己的“私有云”,但是硬件和网络成本都太高了,有点可望而不可及的意思。Alist开源库则可以满足我们&…...

【新】华为OD机试 - 数组的中心位置(Python)| 运气好,这就是原题

数组的中心位置 题目 给你一个整数数组nums,请计算数组的中心位置。 数组中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相乘的积。 数组第一个元素的左侧积为1,最后一个元素的右侧积为1。 如果数组有多个中心位置,应该返回最靠近左边的那一个。 如果数…...

小米电视安装 Plex 打造家庭影院

背景 最近突然想重温教父,本来想着直接投屏就可以,后来看了别人搭建的基于 NAS 的家庭影院很动心,也想依葫芦画瓢做一个,跟对象申请经费的时候被拒了,理由是有这钱还不如开个会员直接看。 我寻思不同电影在不同的平台…...

Elasticsearch:Combined fields 查询

有时一个匹配项可以覆盖多个文本字段。 在这种情况下,你可以使用 combined_fields 查询来搜索多个文本字段,就好像它们的值实际上已被索引到一个组合字段中一样。 除此之外,combined_fields 的主要好处是强大且易于理解的评分算法。这种做法也…...

uart 子系统

串口硬件储备知识: uart 在Linux 应用层的体现及使用 uart 就是串口,它也是属于字符设备中的一种,众所周知 字符设备都会在/dev/ 目录下创建节点,串口所创建的节点名都是以tty* 为开头,例如下面这些节点&#xff1a…...

SpringBoot 整合EasyExcel详解

一、概述 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内…...

VScode+cuda编程:常见环境问题

VScodecuda:常见环境配置问题1、VScode终端问题(PS)2、编译问题(CUDA版本过低)3、nvcc编译问题(arch架构)1、VScode终端问题(PS) 问题描述: 在VScode下打开终端执行nvcc指令,发现执行不了,但是在外部终端powershell和cmd都可以。…...

简单实用的内网穿透实现教程

内网穿透,字面理解就是网络地址穿透,是一种比较常用的将内网地址转换成公网地址的方式。通过内网穿透,可以将本地内网局域网提供给外网公网上访问,在外网也能连接访问内网主机和应用,当用户有日常远程和异地外网访问的…...

makefile案例学习

makefile案例学习 很多时候, 我们在git clone完一个project之后,就会让我们使用make命令进行项目的构建。这个make命令的背后就是按照了Makefile文件定义的格式去完成项目构建。 因此Makefile的作用就是帮助程序员进行项目的构建,它按照项目…...

MySQL性能优化六 事物隔离级别与锁机制

概述 我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题&#…...

四数之和-力扣18-java排序+双指针

一、题目描述给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复)&#xff1a…...

操作系统开发:BIOS/MBR基础与调试

这里在实验之前需要下载 Bochs-win32-2.6.11 作者使用的是Linux版本的,在Linux写代码不太舒服,所以最好在Windows上做实验,下载好虚拟机以后还需要下载Nasm汇编器,以及GCC编译器,为了能够使用DD命令实现磁盘拷贝&#…...

华为OD机试真题JAVA实现【数组合并】真题+解题思路+代码(20222023)

🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出示例二输入输出解题思路核心知识点...

说说Real DOM和Virtual DOM的区别?优缺点?

说说Real DOM和Virtual DOM的区别&#xff1f;优缺点&#xff1f;Real DOM(真实的DOM)真实dom的优缺点&#xff1f;Virtual DOM(虚拟的DOM)虚拟dom的优缺点&#xff1f;两者的区别Real DOM(真实的DOM) 在页面渲染出的每个节点都是一个真实的DOM结构 <div class"root&…...

使用脚本以可读的 JSON 格式显示 curl 命令输出

在我们经常调试微服务或者使用 Elasticsearch API 时&#xff0c;经常会使用curl 来进行调试。但是有时我们的输出不尽如意。显示的不是一 pretty 格式进行输出的。我们有时还必须借助于其他的一些网站工具&#xff0c;比如 Best JSON Formatter and JSON Validator: Online JS…...

计算机网络9:HTTP和HTTPS的区别

1.HTTP和HTTPS的区别 &#xff08;1&#xff09;安全性 HTTP是超文本传输协议&#xff0c;信息传输存在安全问题HTTPS是安全套接字超文本传输协议&#xff0c;在TCP和HTTP之间加入了SSL/TLS安全协议&#xff0c;进行加密传输 &#xff08;2&#xff09;连接步骤HTTP建立相对简…...

Spring+SpringMVC+SpringBoot+MyBatis面试题

什么是Spring框架&#xff1f;使用Spring框架的好处是什么&#xff1f;Spring是一款开源的轻量级Java开发框架&#xff0c;可以提高开发人员的开发效率以及系统的可维护性。Spring框架是很多模块的集合&#xff0c;使用这些模块可以很方便地协助我们进行开发&#xff0c;比如说…...

ContextCapture Master 倾斜摄影测量实景三维建模技术

ContextCapture实景建模大师是一套无需人工干预&#xff0c;通过影像自动生成高分辨率的三维模型的软件解决方案。它集合了全球最先进数字影像处理、计算机虚拟现实以及计算机几何图形算法&#xff0c;在易用性、数据兼容性、运算性能、友好的人机交互及自由的硬件配置兼容性等…...

MySQL事务

文章目录MySQL事务事务的四个特性 ACID事务提交的类型事务的使用MySQL事务 事务是什么&#xff1f; 事务就是一组逻辑操作单元&#xff0c;是数据从一种状态变成另外一种状态。整个单元有一个或多个SQL语句构成&#xff0c;在这个操作单元中&#xff0c;每一个SQL语句相互依赖…...

CData Drivers for Acumatica

CData Drivers for Acumatica Acumatica的CData驱动程序为用户提供了使用AcumaticaERP数据的便捷途径&#xff0c;该数据来自商业智能、分析、定制应用程序、报告以及ETL。通过JDBC、ADO.NET和ODBC等标准驱动程序&#xff0c;以及与PowerShell、Power BI、Excel、SSIS等流行应用…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...