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

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.pystart.bat(或自行命名.bat文件)保存到同一目录。

2. 修改配置

打开main.py.bat文件,根据你的 NAS 实际情况修改以下参数:

参数说明示例值
NAS_HOSTNAS 主机名或 IPairdisk_xxx192.168.1.100
NAS_SHARE共享目录名USB-DISK-A
NAS_USERSMB 用户名Airdisk
NAS_PASSSMB 密码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
http://www.cnnetsun.cn/news/2775703.html

相关文章:

  • 如何免费搭建专业数字标牌系统?LibreSignage开源方案终极指南
  • Kotlin MVVM 实战入门:从分层到状态闭环
  • 黑洞冕区湍流等离子体特性与粒子加速机制研究
  • 从网表文件到仿真曲线:HSPICE新手入门,手把手教你跑通第一个TFT仿真
  • 【AI工具TCO精准压降术】:从License拆分、用量归因到跨平台套利,实测年省$186,400
  • 用OpenCV3.14复现经典Snake算法:从能量函数到代码实现的保姆级教程
  • NanaZip:重新定义Windows文件压缩体验的7个突破性功能
  • 硬件设计避坑:为什么你算的基极电阻总让三极管关不断?从MMBT3904实测曲线说起
  • spaCy实战指南:构建稳定可解释的NLP生产流水线
  • Delta Lake删除向量(Deletion Vectors)原理与实战指南
  • Dell服务器S系列软RAID管理:除了创建,你更该知道的磁盘交换与状态监控技巧
  • 斯坦福 AI Agent Harness Engineering 研究再突破:自主学习能力接近人类水平
  • 从地铁换乘到算法设计:如何用DFS模拟现实出行规划(以PAT‘周游世界’题为例)
  • M2.7国产大模型:开箱即用的工程化推理实践
  • 别再混用了!手把手教你用STM32CubeMX搞定DHT11和DHT22(附代码避坑)
  • 如何快速掌握Detect-It-Easy:安全研究者的终极文件分析指南
  • 宽温大功率输出,LDMN-GM7 助力矿区雷达性能验收工作
  • Inter字体:免费开源字体为现代数字界面设计的完整指南
  • 实战演练:利用Cursor设计+快马实现,快速打造一个可用的天气查询应用
  • aifei学习前置基础:全套完整教程:Anaconda 安装→环境配置→YOLOv8+OpenCV 安装 + OpenCV 实操 + 标注→训练→导出→部署
  • 3个理由告诉你为什么MegSpot是跨平台视觉分析的最佳选择
  • OpenGL深度测试与光照开启后,模型视图变换为啥‘失灵’了?一个茶壶程序的调试笔记
  • Typora插件终极指南:62个免费功能让Markdown写作效率提升300%
  • 从2层板到10层板:手把手教你规划KiCad多层PCB的叠层结构与命名(附常用方案)
  • 别再只用OpenMV识别人脸了!手把手教你将OpenCV的Haar Cascade模型(.xml)转成OpenMV能用的.cascade文件
  • Claude 3.5 Sonnet深度解析:架构演进与企业级RAG实战
  • 新版佳能清零软件,5B00,5B01,5B02,1700,1701,1702,1704,P07,E08,废墨收集器将满报错,TS3380,MG3640S,g3000,g3800亲测完美
  • Beyond Compare 5密钥生成器终极指南:3种简单激活方案详解
  • 终极指南:用ncmdump免费解锁网易云音乐加密文件,实现音乐自由播放
  • 文心大模型5.0正式版:从技术参数到服务契约的范式跃迁