#!/usr/bin/env python3
"""
环境检查脚本 - 验证 anything-to-notebooklm skill 所有依赖
"""
import sys
import os
import json
from pathlib import Path
# 颜色输出
RED = '\033[0;31m'
GREEN = '\033[0;32m'
YELLOW = '\033[1;33m'
BLUE = '\033[0;34m'
NC = '\033[0m'
def print_status(status, message):
"""打印状态信息"""
if status == "ok":
print(f"{GREEN}✅ {message}{NC}")
elif status == "warning":
print(f"{YELLOW}⚠️ {message}{NC}")
elif status == "error":
print(f"{RED}❌ {message}{NC}")
else:
print(f"{BLUE}ℹ️ {message}{NC}")
def check_python_version():
"""检查 Python 版本"""
version = sys.version_info
version_str = f"{version.major}.{version.minor}.{version.micro}"
if version.major >= 3 and version.minor >= 9:
print_status("ok", f"Python {version_str}")
return True
else:
print_status("error", f"Python {version_str} (需要 3.9+)")
return False
def check_module(module_name, import_name=None):
"""检查 Python 模块是否已安装"""
if import_name is None:
import_name = module_name
try:
__import__(import_name)
print_status("ok", f"{module_name} 已安装")
return True
except ImportError:
print_status("error", f"{module_name} 未安装")
return False
def check_command(cmd):
"""检查命令是否可用"""
import shutil
if shutil.which(cmd):
# 尝试获取版本
import subprocess
try:
result = subprocess.run([cmd, "--version"],
capture_output=True,
text=True,
timeout=5)
version = result.stdout.split('\n')[0] if result.stdout else "unknown"
print_status("ok", f"{cmd} 已安装 ({version})")
except:
print_status("ok", f"{cmd} 已安装")
return True
else:
print_status("error", f"{cmd} 未找到")
return False
def check_mcp_config():
"""检查 MCP 配置"""
config_path = Path.home() / ".claude" / "config.json"
if not config_path.exists():
print_status("error", f"未找到 Claude 配置文件: {config_path}")
return False
try:
with open(config_path, 'r') as f:
config = json.load(f)
if "mcpServers" in config and "weixin-reader" in config["mcpServers"]:
print_status("ok", "MCP 服务器已配置")
return True
else:
print_status("warning", "MCP 服务器未配置(需要手动添加)")
return False
except Exception as e:
print_status("error", f"无法读取配置文件: {e}")
return False
def check_mcp_server():
"""检查 MCP 服务器文件"""
skill_dir = Path(__file__).parent
mcp_server = skill_dir / "wexin-read-mcp" / "src" / "server.py"
if mcp_server.exists():
print_status("ok", f"MCP 服务器文件存在")
return True
else:
print_status("error", f"MCP 服务器文件不存在: {mcp_server}")
return False
def check_notebooklm_auth():
"""检查 NotebookLM 认证状态"""
import subprocess
try:
result = subprocess.run(["notebooklm", "list"],
capture_output=True,
text=True,
timeout=10)
if result.returncode == 0:
print_status("ok", "NotebookLM 已认证")
return True
else:
print_status("warning", "NotebookLM 未认证(请运行 notebooklm login)")
return False
except subprocess.TimeoutExpired:
print_status("warning", "NotebookLM 认证检查超时")
return False
except Exception as e:
print_status("error", f"NotebookLM 认证检查失败: {e}")
return False
def main():
print(f"\n{BLUE}========================================{NC}")
print(f"{BLUE} 环境检查 - anything-to-notebooklm{NC}")
print(f"{BLUE}========================================{NC}\n")
results = []
# 1. Python 版本
print(f"{YELLOW}[1/8] Python 版本{NC}")
results.append(check_python_version())
print()
# 2. 核心依赖
print(f"{YELLOW}[2/9] 核心 Python 依赖{NC}")
results.append(check_module("fastmcp"))
results.append(check_module("playwright"))
results.append(check_module("beautifulsoup4", "bs4"))
results.append(check_module("lxml"))
results.append(check_module("markitdown"))
print()
# 3. Playwright 浏览器
print(f"{YELLOW}[3/9] Playwright 可导入性{NC}")
try:
from playwright.sync_api import sync_playwright
print_status("ok", "Playwright 可以正常导入")
results.append(True)
except Exception as e:
print_status("error", f"Playwright 导入失败: {e}")
results.append(False)
print()
# 4. NotebookLM CLI
print(f"{YELLOW}[4/9] NotebookLM CLI{NC}")
results.append(check_command("notebooklm"))
print()
# 5. markitdown CLI
print(f"{YELLOW}[5/9] markitdown CLI{NC}")
results.append(check_command("markitdown"))
print()
# 6. Git 命令
print(f"{YELLOW}[6/9] Git 命令{NC}")
results.append(check_command("git"))
print()
# 7. MCP 服务器文件
print(f"{YELLOW}[7/9] MCP 服务器文件{NC}")
results.append(check_mcp_server())
print()
# 8. MCP 配置
print(f"{YELLOW}[8/9] MCP 配置{NC}")
results.append(check_mcp_config())
print()
# 9. NotebookLM 认证
print(f"{YELLOW}[9/9] NotebookLM 认证{NC}")
results.append(check_notebooklm_auth())
print()
# 总结
print(f"{BLUE}========================================{NC}")
passed = sum(results)
total = len(results)
if passed == total:
print(f"{GREEN}✅ 所有检查通过 ({passed}/{total})!环境配置完整。{NC}")
elif passed >= total * 0.8:
print(f"{YELLOW}⚠️ 大部分检查通过 ({passed}/{total}),但有些问题需要修复。{NC}")
else:
print(f"{RED}❌ 检查失败 ({passed}/{total}),请运行 install.sh 重新安装。{NC}")
print(f"{BLUE}========================================{NC}\n")
if passed < total:
print("💡 修复建议:")
print(" 1. 运行安装脚本:./install.sh")
print(" 2. 配置 MCP:编辑 ~/.claude/config.json")
print(" 3. 认证 NotebookLM:notebooklm login")
print()
sys.exit(0 if passed == total else 1)
if __name__ == "__main__":
main()