文章目录
📝 文章摘要
本文介绍用青龙面板结合 Playwright 自动化实现 QwenPaw Console 每日保活。方案包含登录脚本定期登录 AgentScope 并保存 localStorage,以及保活脚本每日注入 token、访问 /deploy 并点击“打开 QWENPAW”。文章还说明依赖安装、环境变量配置、定时任务设置与截图验证方法。

QwenPaw Console, 青龙, Playwright, 自动化, 保活, 登录脚本, localStorage, accessToken, AgentScope, Chromium, 环境变

原理

QwenPaw Console 长时间不打开会被回收,需要每天点一次"打开 QWENPAW"按钮保活。手动太累,用青龙 + Playwright 自动化完成任务。

两个脚本配合:

  • 登录脚本:每 20 天跑一次,登录 AgentScope 保存 localStorage(含 accessToken)
  • 保活脚本:每天跑一次,注入 localStorage → 打开 /deploy → 自动点击按钮

一、依赖

青龙面板 → 依赖管理 → Python,添加:

PHP
playwright

SSH 进容器装 Chromium:

PHP
docker exec -it qinglong bash
pip install playwright
playwright install chromium
playwright install-deps

二、环境变量

青龙 → 环境变量:

名称
AGENTSCOPE_EMAIL 你的AgentScope登录邮箱
AGENTSCOPE_PASSWORD 你的AgentScope密码
AGENTSCOPE_AUTH_FILE /ql/data/scripts/auth/agentscope_auth.json

三、脚本

先建目录:

PHP
docker exec -it qinglong bash
mkdir -p /ql/data/scripts/auth

脚本1:agentscope_login.py

青龙 → 脚本管理 → 新建文件 agentscope_login.py

PHP
#!/usr/bin/env python3
"""AgentScope 登录刷新 — 每20天执行,保存 localStorage"""
import asyncio, json, os, sys
from playwright.async_api import async_playwright

EMAIL = os.environ.get("AGENTSCOPE_EMAIL", "")
PASSWORD = os.environ.get("AGENTSCOPE_PASSWORD", "")
AUTH_FILE = os.environ.get("AGENTSCOPE_AUTH_FILE", "/ql/data/scripts/auth/agentscope_auth.json")
SCREENSHOT_DIR = os.path.dirname(AUTH_FILE)
UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

async def login():
    print("[登录] 启动浏览器...")
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True, args=["--no-sandbox", "--disable-blink-features=AutomationControlled"])
        context = await browser.new_context(viewport={"width": 1920, "height": 1080}, locale="zh-CN", user_agent=UA)
        await context.add_init_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined});")
        page = await context.new_page()

        print("[登录] 打开登录页...")
        await page.goto("https://platform.agentscope.io/login", timeout=30000)
        await page.wait_for_load_state("networkidle", timeout=15000)
        await page.wait_for_timeout(5000)

        await page.fill("#account", EMAIL)
        await page.fill("#password", PASSWORD)

        btn = await page.query_selector('button:has-text("登 录")') or await page.query_selector('button:has-text("登录")')
        if not btn:
            print("[登录] ✗ 未找到登录按钮")
            await browser.close()
            return False
        await btn.click()
        await page.wait_for_timeout(5000)

        if "login" in page.url.lower():
            print("[登录] ✗ 仍在登录页")
            await page.screenshot(path=f"{SCREENSHOT_DIR}/login_failed.png")
            await browser.close()
            return False

        ls_data = await page.evaluate("""() => {
            const data = {};
            for (let i = 0; i < localStorage.length; i++) {
                data[localStorage.key(i)] = localStorage.getItem(localStorage.key(i));
            }
            return data;
        }""")
        os.makedirs(os.path.dirname(AUTH_FILE), exist_ok=True)
        with open(AUTH_FILE, "w") as f:
            json.dump(ls_data, f, indent=2)
        print(f"[登录] ✅ localStorage 已保存 ({len(ls_data)} 个 key)")
        await page.screenshot(path=f"{SCREENSHOT_DIR}/login_success.png")
        await browser.close()
        return True

if __name__ == "__main__":
    r = asyncio.run(login())
    print(f"\n{'✅ 登录成功' if r else '❌ 登录失败'}")
    sys.exit(0 if r else 1)

脚本2:agentscope_daily.py

PHP
#!/usr/bin/env python3
"""AgentScope QwenPaw 每日保活 — 注入token → 点击按钮 → 验证Console"""
import asyncio, json, os, sys
from playwright.async_api import async_playwright

EMAIL = os.environ.get("AGENTSCOPE_EMAIL", "")
PASSWORD = os.environ.get("AGENTSCOPE_PASSWORD", "")
AUTH_FILE = os.environ.get("AGENTSCOPE_AUTH_FILE", "/ql/data/scripts/auth/agentscope_auth.json")
SCREENSHOT_DIR = os.path.dirname(AUTH_FILE)
BASE_URL = "https://platform.agentscope.io"
UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

async def relogin():
    """token过期时重新登录"""
    print("[保活] token 过期,重新登录...")
    from agentscope_login import login
    return await login()

async def daily():
    print("[保活] 启动浏览器...")
    if not os.path.exists(AUTH_FILE):
        print("[保活] 无 auth 文件,先登录...")
        return await relogin()

    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True, args=["--no-sandbox", "--disable-blink-features=AutomationControlled"])
        context = await browser.new_context(viewport={"width": 1920, "height": 1080}, locale="zh-CN", user_agent=UA)
        await context.add_init_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined});")
        page = await context.new_page()

        # 先访问主页再注入
        await page.goto(BASE_URL + "/", timeout=30000)
        await page.wait_for_timeout(3000)

        with open(AUTH_FILE, "r") as f:
            ls_data = json.load(f)
        for k, v in ls_data.items():
            await page.evaluate(f"localStorage.setItem('{k}', '{v}')")
        print(f"[保活] 注入 {len(ls_data)} 个 key")

        # 跳转 deploy 页
        await page.goto(BASE_URL + "/deploy", timeout=30000)
        await page.wait_for_load_state("networkidle", timeout=15000)
        await page.wait_for_timeout(5000)

        if "login" in page.url.lower():
            await browser.close()
            return await relogin()

        print(f"[保活] 当前: {page.url}")

        # 找按钮
        btn = await page.query_selector('button:has-text("打开 QWENPAW")')
        if not btn:
            btn = await page.query_selector('button:has-text("QwenPaw")')
        if not btn:
            btn = await page.query_selector('button:has-text("打开")')

        if not btn:
            body = await page.inner_text("body")
            print(f"[保活] ✗ 未找到按钮,页面: {body[:150]}")
            await page.screenshot(path=f"{SCREENSHOT_DIR}/daily_no_btn.png")
            await browser.close()
            return False

        print("[保活] 找到按钮,点击...")
        new_page_promise = context.wait_for_event("page", timeout=15000)
        await btn.click()

        try:
            new_page = await new_page_promise
            await new_page.wait_for_load_state("networkidle", timeout=20000)
            await new_page.wait_for_timeout(5000)
            title = await new_page.title()
            print(f"[保活] ✅ QwenPaw Console 打开成功!")
            print(f"  URL: {new_page.url}")
            print(f"  标题: {title}")
            await new_page.screenshot(path=f"{SCREENSHOT_DIR}/qwenpaw_daily.png")
            await browser.close()
            return True
        except Exception as e:
            print(f"[保活] ✗ 新标签异常: {e}")
            await browser.close()
            return False

if __name__ == "__main__":
    r = asyncio.run(daily())
    print(f"\n{'✅ 保活成功' if r else '❌ 保活失败'}")
    sys.exit(0 if r else 1)

四、配定时任务

青龙 → 定时任务 → 新建两条:

名称 命令 Cron 说明
AgentScope 登录刷新 task agentscope_login.py 0 8 */20 * * 每20天8点登录
QwenPaw 每日保活 task agentscope_daily.py 30 8 * * * 每天8:30保活

五、验证

先手动跑一次登录:

PHP
docker exec -it qinglong bash
cd /ql/data/scripts && python3 agentscope_login.py

再手动跑一次保活:

PHP
python3 agentscope_daily.py

看到 ✅ QwenPaw Console 打开成功! 就成功了。

截图在 /ql/data/scripts/auth/ 下,有问题可以看截图排查。

本文最后更新于2026年7月11日,若涉及的内容可能已经失效,直接留言反馈补链即可,我们会处理,谢谢
声明:本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿用于任何商业目的与商业用途,如需商用请支持正版!如亲下载后改变其用途与使用方式,与本站无任何关系,本站已经进行告知义务!我们只做安全认证测试如果资源侵犯了您的版权利益,请联系站长邮箱:17606723350@163.com