diff --git a/app.py b/app.py index 2cbc414..8e96f44 100755 --- a/app.py +++ b/app.py @@ -32,20 +32,21 @@ async def mail_qq_spider(account: str,display: int) -> str: return json.dumps(data, ensure_ascii=False) @mcp.tool() -async def start_xvnc_server(display: int) -> str: +async def start_xvnc_server(display: int, password="123456") -> str: """启动XVNC服务 Args: display: VNC 显示编号 + password: VNC 密码 """ data={"display": display} try: # 调用外部 start_browser.sh 脚本,传入 index 作为参数 process = await asyncio.create_subprocess_exec( f"{SHELL_DIR}/start_browser.sh", - str("123456"), # VNC 密码 + str(password), # VNC 密码 str(5900), # VNC 端口 - str(99), # 显示编号 + str(display), # 显示编号 stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE ) diff --git a/bin/start_browser.sh b/bin/start_browser.sh index d76e2df..d9dc022 100755 --- a/bin/start_browser.sh +++ b/bin/start_browser.sh @@ -1,33 +1,36 @@ #!/bin/bash set -euo pipefail -TARGET_URL="https://www.baidu.com" # 直接打开百度 -VNC_PWD=$1 -VNC_PORT=$2 -DISPLAY_NUM=$3 -CDP_PORT=30010 -PROFILE_DIR="/tmp/chrome-profile-$$" -LOCK_FILE="/tmp/cdp.lock" - +TARGET_URL="https://www.baidu.com" +VNC_PWD=${1:-"123456"} +VNC_PORT=${2:-5900} +DISPLAY_NUM=${3:-99} +PROFILE_DIR="/tmp/chrome-profile-${DISPLAY_NUM}" +PID_FILE="/tmp/chrome-browser-${DISPLAY_NUM}.pid" +LOG_FILE="/tmp/chrome-browser-${DISPLAY_NUM}.log" GREEN='\033[0;32m'; RED='\033[0;31m'; NC='\033[0m' log() { echo -e "${GREEN}[$(date '+%H:%M:%S')]${NC} $*"; } err() { echo -e "${RED}[$(date '+%H:%M:%S')]${NC} $*" >&2; } -exec 9>"$LOCK_FILE" -flock -n 9 || { err "Another instance running"; exit 1; } +# 检查是否已在运行 +if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then + err "Instance :${DISPLAY_NUM} already running" + exit 1 +fi cleanup() { - log "Cleaning up..." + log "Cleaning up instance :${DISPLAY_NUM}..." pkill -P $$ 2>/dev/null || true - pkill -f "remote-debugging-port=${CDP_PORT}" 2>/dev/null || true pkill -f "Xvfb :${DISPLAY_NUM}" 2>/dev/null || true pkill -f "x11vnc.*${DISPLAY_NUM}" 2>/dev/null || true rm -rf "$PROFILE_DIR" 2>/dev/null || true - rm -f /tmp/login_done 2>/dev/null || true + rm -f "$PID_FILE" 2>/dev/null || true } trap cleanup EXIT INT TERM +echo $$ > "$PID_FILE" + log "Starting Xvfb :${DISPLAY_NUM}" Xvfb :${DISPLAY_NUM} -screen 0 1280x1024x24 -nolisten tcp & sleep 2 @@ -41,41 +44,25 @@ if [ -z "$CHROME_BIN" ]; then fi [ -z "$CHROME_BIN" ] && { err "Chromium not found"; exit 1; } -# 去掉 --headless=new,这样才能看到界面 "$CHROME_BIN" \ --no-sandbox \ --disable-gpu \ --disable-dev-shm-usage \ - --remote-debugging-port=${CDP_PORT} \ - --remote-debugging-address=127.0.0.1 \ - --remote-allow-origins=* \ --user-data-dir=${PROFILE_DIR} \ --window-size=1280,1024 \ "${TARGET_URL}" & CHROME_PID=$! -# 启动 x11vnc(将 Xvfb 转为 VNC 服务) log "Starting x11vnc on port ${VNC_PORT}..." x11vnc -display :${DISPLAY_NUM} -forever -shared -passwd ${VNC_PWD} -rfbport ${VNC_PORT} -bg & -log "Waiting for CDP..." -for i in {1..30}; do - curl -sf "http://127.0.0.1:${CDP_PORT}/json/version" >/dev/null 2>&1 && { log "CDP ready"; break; } - sleep 1 - [ $i -eq 30 ] && { err "CDP timeout"; exit 1; } -done - PUBLIC_HOST=$(curl -sf ifconfig.me 2>/dev/null || hostname -I | awk '{print $1}') log "==========================================" -log "✅ Browser is running!" -log "📝 CDP: http://${PUBLIC_HOST}:${CDP_PORT}" -log "🖥️ VNC: ${PUBLIC_HOST}:${VNC_PORT} (密码: ${VNC_PWD})" +log "✅ Browser started (VNC only, no CDP)" +log "🖥️ VNC: ${PUBLIC_HOST}:${VNC_PORT}" +log "🔑 Password: ${VNC_PWD}" +log "📋 Log: tail -f ${LOG_FILE}" log "==========================================" -rm -f /tmp/login_done -log "Waiting for /tmp/login_done ..." -while [ ! -f /tmp/login_done ]; do sleep 1; done -log "Login detected, automation can start" - -wait $CHROME_PID 2>/dev/null || true +wait $CHROME_PID 2>/dev/null || true \ No newline at end of file