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

原理
QwenPaw Console 长时间不打开会被回收,需要每天点一次"打开 QWENPAW"按钮保活。手动太累,用青龙 + Playwright 自动化完成任务。
两个脚本配合:
- 登录脚本:每 20 天跑一次,登录 AgentScope 保存 localStorage(含 accessToken)
- 保活脚本:每天跑一次,注入 localStorage → 打开 /deploy → 自动点击按钮
一、依赖
青龙面板 → 依赖管理 → Python,添加:
PHP
playwrightSSH 进容器装 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

评论(0)