bak
This commit is contained in:
parent
2446292869
commit
ab2be68181
7
app.py
7
app.py
|
|
@ -32,20 +32,21 @@ async def mail_qq_spider(account: str,display: int) -> str:
|
||||||
return json.dumps(data, ensure_ascii=False)
|
return json.dumps(data, ensure_ascii=False)
|
||||||
|
|
||||||
@mcp.tool()
|
@mcp.tool()
|
||||||
async def start_xvnc_server(display: int) -> str:
|
async def start_xvnc_server(display: int, password="123456") -> str:
|
||||||
"""启动XVNC服务
|
"""启动XVNC服务
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
display: VNC 显示编号
|
display: VNC 显示编号
|
||||||
|
password: VNC 密码
|
||||||
"""
|
"""
|
||||||
data={"display": display}
|
data={"display": display}
|
||||||
try:
|
try:
|
||||||
# 调用外部 start_browser.sh 脚本,传入 index 作为参数
|
# 调用外部 start_browser.sh 脚本,传入 index 作为参数
|
||||||
process = await asyncio.create_subprocess_exec(
|
process = await asyncio.create_subprocess_exec(
|
||||||
f"{SHELL_DIR}/start_browser.sh",
|
f"{SHELL_DIR}/start_browser.sh",
|
||||||
str("123456"), # VNC 密码
|
str(password), # VNC 密码
|
||||||
str(5900), # VNC 端口
|
str(5900), # VNC 端口
|
||||||
str(99), # 显示编号
|
str(display), # 显示编号
|
||||||
stdout=asyncio.subprocess.PIPE,
|
stdout=asyncio.subprocess.PIPE,
|
||||||
stderr=asyncio.subprocess.PIPE
|
stderr=asyncio.subprocess.PIPE
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,33 +1,36 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
TARGET_URL="https://www.baidu.com" # 直接打开百度
|
TARGET_URL="https://www.baidu.com"
|
||||||
VNC_PWD=$1
|
VNC_PWD=${1:-"123456"}
|
||||||
VNC_PORT=$2
|
VNC_PORT=${2:-5900}
|
||||||
DISPLAY_NUM=$3
|
DISPLAY_NUM=${3:-99}
|
||||||
CDP_PORT=30010
|
PROFILE_DIR="/tmp/chrome-profile-${DISPLAY_NUM}"
|
||||||
PROFILE_DIR="/tmp/chrome-profile-$$"
|
PID_FILE="/tmp/chrome-browser-${DISPLAY_NUM}.pid"
|
||||||
LOCK_FILE="/tmp/cdp.lock"
|
LOG_FILE="/tmp/chrome-browser-${DISPLAY_NUM}.log"
|
||||||
|
|
||||||
|
|
||||||
GREEN='\033[0;32m'; RED='\033[0;31m'; NC='\033[0m'
|
GREEN='\033[0;32m'; RED='\033[0;31m'; NC='\033[0m'
|
||||||
log() { echo -e "${GREEN}[$(date '+%H:%M:%S')]${NC} $*"; }
|
log() { echo -e "${GREEN}[$(date '+%H:%M:%S')]${NC} $*"; }
|
||||||
err() { echo -e "${RED}[$(date '+%H:%M:%S')]${NC} $*" >&2; }
|
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() {
|
cleanup() {
|
||||||
log "Cleaning up..."
|
log "Cleaning up instance :${DISPLAY_NUM}..."
|
||||||
pkill -P $$ 2>/dev/null || true
|
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 "Xvfb :${DISPLAY_NUM}" 2>/dev/null || true
|
||||||
pkill -f "x11vnc.*${DISPLAY_NUM}" 2>/dev/null || true
|
pkill -f "x11vnc.*${DISPLAY_NUM}" 2>/dev/null || true
|
||||||
rm -rf "$PROFILE_DIR" 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
|
trap cleanup EXIT INT TERM
|
||||||
|
|
||||||
|
echo $$ > "$PID_FILE"
|
||||||
|
|
||||||
log "Starting Xvfb :${DISPLAY_NUM}"
|
log "Starting Xvfb :${DISPLAY_NUM}"
|
||||||
Xvfb :${DISPLAY_NUM} -screen 0 1280x1024x24 -nolisten tcp &
|
Xvfb :${DISPLAY_NUM} -screen 0 1280x1024x24 -nolisten tcp &
|
||||||
sleep 2
|
sleep 2
|
||||||
|
|
@ -41,41 +44,25 @@ if [ -z "$CHROME_BIN" ]; then
|
||||||
fi
|
fi
|
||||||
[ -z "$CHROME_BIN" ] && { err "Chromium not found"; exit 1; }
|
[ -z "$CHROME_BIN" ] && { err "Chromium not found"; exit 1; }
|
||||||
|
|
||||||
# 去掉 --headless=new,这样才能看到界面
|
|
||||||
"$CHROME_BIN" \
|
"$CHROME_BIN" \
|
||||||
--no-sandbox \
|
--no-sandbox \
|
||||||
--disable-gpu \
|
--disable-gpu \
|
||||||
--disable-dev-shm-usage \
|
--disable-dev-shm-usage \
|
||||||
--remote-debugging-port=${CDP_PORT} \
|
|
||||||
--remote-debugging-address=127.0.0.1 \
|
|
||||||
--remote-allow-origins=* \
|
|
||||||
--user-data-dir=${PROFILE_DIR} \
|
--user-data-dir=${PROFILE_DIR} \
|
||||||
--window-size=1280,1024 \
|
--window-size=1280,1024 \
|
||||||
"${TARGET_URL}" &
|
"${TARGET_URL}" &
|
||||||
|
|
||||||
CHROME_PID=$!
|
CHROME_PID=$!
|
||||||
|
|
||||||
# 启动 x11vnc(将 Xvfb 转为 VNC 服务)
|
|
||||||
log "Starting x11vnc on port ${VNC_PORT}..."
|
log "Starting x11vnc on port ${VNC_PORT}..."
|
||||||
x11vnc -display :${DISPLAY_NUM} -forever -shared -passwd ${VNC_PWD} -rfbport ${VNC_PORT} -bg &
|
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}')
|
PUBLIC_HOST=$(curl -sf ifconfig.me 2>/dev/null || hostname -I | awk '{print $1}')
|
||||||
log "=========================================="
|
log "=========================================="
|
||||||
log "✅ Browser is running!"
|
log "✅ Browser started (VNC only, no CDP)"
|
||||||
log "📝 CDP: http://${PUBLIC_HOST}:${CDP_PORT}"
|
log "🖥️ VNC: ${PUBLIC_HOST}:${VNC_PORT}"
|
||||||
log "🖥️ VNC: ${PUBLIC_HOST}:${VNC_PORT} (密码: ${VNC_PWD})"
|
log "🔑 Password: ${VNC_PWD}"
|
||||||
|
log "📋 Log: tail -f ${LOG_FILE}"
|
||||||
log "=========================================="
|
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
|
||||||
Loading…
Reference in New Issue