AirDisk NAS Viewer 通过 HTTP 服务或 Windows 网络驱动器
通过 HTTP 服务或 Windows 网络驱动器,直接访问 AirDisk NAS 上的 Tools/index.html 文件,便于在浏览器中查看 NAS 中的网页工具。
功能特点
-
Python 服务器方式:使用
smbprotocol通过 SMB 协议读取文件,无需映射网络驱动器,跨平台运行。 -
Windows 批处理方式:直接映射 NAS 为网络驱动器,然后打开本地文件 URL,适合快速测试。
环境要求
Python 服务器方式
-
Python 3.7+
-
网络能访问 NAS 的 SMB 端口(445)
Windows 批处理方式
-
Windows 操作系统
-
已开启网络发现和文件共享支持
快速开始
1. 克隆或下载代码
将 main.py 和 start.bat(或自行命名 .bat 文件)保存到同一目录。
2. 修改配置
打开 main.py 和 .bat 文件,根据你的 NAS 实际情况修改以下参数:
| 参数 | 说明 | 示例值 |
|---|---|---|
NAS_HOST |
NAS 主机名或 IP | airdisk_xxx 或 192.168.1.100 |
NAS_SHARE |
共享目录名 | USB-DISK-A |
NAS_USER |
SMB 用户名 | Airdisk |
NAS_PASS |
SMB 密码 | 123456 |
ENTRY_FILE |
要展示的入口文件(相对路径) | Tools/index.html |
.bat文件中set NAS=...和set USER=...、set PASS=...也要同步修改。
3. 运行
方式 A:Python 服务器(推荐)
# 安装依赖 pip install fastapi uvicorn smbprotocol # 启动服务 python main.py
启动成功后,控制台会显示:
✅ 已连接 airdisk_xxx 🌐 http://localhost:8000
打开浏览器访问 http://localhost:8000 即可看到 Tools/index.html 页面,所有相对路径的资源(CSS、JS、图片等)会自动通过 /r/ 路由从 NAS 读取。
方式 B:Windows 批处理
双击运行 .bat 文件,会自动映射网络驱动器并打开 file://airdisk_xxx/USB-DISK-A/Tools/index.html。
注意:该方式依赖 Windows 的
net use命令,且文件以file://协议打开,可能会遇到浏览器跨域或安全限制。
常见问题
Q1: Python 启动时报 ModuleNotFoundError: No module named 'smbclient'
A: 请运行 pip install smbprotocol,它包含了 smbclient 模块。如果仍然报错,尝试:
pip uninstall smbprotocol pysmbc pip install smbprotocol
Q2: 连接 NAS 失败,提示 STATUS_LOGON_FAILURE
A: 检查用户名、密码是否正确,NAS 是否允许该用户访问共享,以及主机名/IP 是否可解析(可尝试改用 IP 地址)。
Q3: 入口 HTML 页面加载后,图片/脚本 404
A: 检查 HTML 中引用的资源路径是否相对于 Tools/ 目录。服务器已自动添加 <base href="/r/Tools/">,通常可以解决。如果资源放在更深目录,请确保路径正确。
Q4: 批处理方式提示“找不到网络路径”
A: 确认 NAS 主机名可被 ping 通,或者在 C:\Windows\System32\drivers\etc\hosts 中添加主机名解析。也可以将 NAS 变量直接改为 \\192.168.x.x\USB-DISK-A。
Q5: 批处理方式打开的页面空白或样式丢失
A: 因为 file:// 协议下,许多现代浏览器禁止加载跨驱动器的资源。建议使用 Python 服务器方式以获得完整支持。
文件结构说明
. ├── main.py # FastAPI 服务端程序 ├── start.bat # Windows 批处理脚本(可选)
开发与定制
-
修改监听端口:编辑
main.py最后一行port=8000。 -
修改资源路由前缀:目前所有资源通过
/r/{path:path}访问,可自行调整。 -
添加 MIME 类型支持:
mimetypes.guess_type()已自动处理常见类型。
代码:
main.py
"""
AirDisk NAS Viewer
连接 NAS SMB 共享,直接展示 Tools/index.html
运行: pip install fastapi uvicorn smbprotocol && python main.py
"""
try:
import smbclient
except ImportError:
raise SystemExit("\n[!] pip install smbprotocol\n")
from fastapi import FastAPI, HTTPException
from fastapi.responses import HTMLResponse, Response
import mimetypes
app = FastAPI()
# ━━━━━━━ 配置 ━━━━━━━
NAS_HOST = "airdisk_xxx"
NAS_SHARE = "USB-DISK-A"
NAS_USER = "Airdisk"
NAS_PASS = "123456"
ENTRY_FILE = "Tools/index.html"
# ━━━━━━━━━━━━━━━━━━━━
def smb_path(rel: str) -> str:
rel = rel.strip("/").replace("/", "\\")
return f"\\\\{NAS_HOST}\\{NAS_SHARE}\\{rel}" if rel else f"\\\\{NAS_HOST}\\{NAS_SHARE}"
def safe_path(p: str) -> str:
parts = [x for x in p.replace("\\", "/").split("/") if x and x not in ("", "..")]
return "/".join(parts)
@app.on_event("startup")
def startup():
smbclient.register_session(NAS_HOST, username=NAS_USER, password=NAS_PASS)
print(f"\n ✅ 已连接 {NAS_HOST}")
print(f" 🌐 http://localhost:8000\n")
@app.get("/", response_class=HTMLResponse)
def index():
try:
with smbclient.open_file(smb_path(ENTRY_FILE), mode="rb") as f:
content = f.read().decode("utf-8", errors="replace")
content = content.replace("</head>", '<base href="/r/Tools/"></head>', 1)
return HTMLResponse(content)
except Exception as e:
raise HTTPException(500, f"读取 {ENTRY_FILE} 失败: {e}")
@app.get("/r/{path:path}")
def resource(path: str):
path = safe_path(path)
try:
with smbclient.open_file(smb_path(path), mode="rb") as f:
content = f.read()
mime, _ = mimetypes.guess_type(path)
return Response(content, media_type=mime or "application/octet-stream")
except Exception as e:
raise HTTPException(404, f"找不到: {path}")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
start.bat
@echo off
chcp 65001 >nul 2>&1
set NAS=\\airdisk_xxx\USB-DISK-A
set USER=Airdisk
set PASS=123456
set URL=file://airdisk_xxx/USB-DISK-A/Tools/index.html
net use "%NAS%" /delete /y >nul 2>&1
net use "%NAS%" "%PASS%" /user:"%USER%" /persistent:no
if errorlevel 1 (
echo Connection failed.
pause
exit /b 1
)
echo Connected. Opening...
start "" "%URL%"
exit /b
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)