86 lines
3.5 KiB
Python
86 lines
3.5 KiB
Python
"""
|
||||
|
|
探测元宝页面的生成状态特征
|
|||
|
|
运行后,请在元宝页面发送一条消息,观察输出
|
|||
|
|
"""
|
|||
|
|
import asyncio
|
|||
|
|
from playwright.async_api import async_playwright
|
|||
|
|
from pathlib import Path
|
|||
|
|
|
|||
|
|
YUANBAO_URL = "https://yuanbao.tencent.com/chat"
|
|||
|
|
|
|||
|
|
async def detect():
|
|||
|
|
async with async_playwright() as p:
|
|||
|
|
user_data = str(Path.home() / ".yuanbao_chat_profile")
|
|||
|
|
context = await p.chromium.launch_persistent_context(
|
|||
|
|
user_data, channel="chrome", headless=False,
|
|||
|
|
args=["--start-maximized"], no_viewport=True
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
page = context.pages[0] if context.pages else await context.new_page()
|
|||
|
|
await page.goto(YUANBAO_URL)
|
|||
|
|
|
|||
|
|
print("=" * 60)
|
|||
|
|
print("元宝生成状态探测器")
|
|||
|
|
print("=" * 60)
|
|||
|
|
print("\n1. 请在元宝页面登录并创建新对话")
|
|||
|
|
print("2. 在元宝页面发送一条消息(比如'你好')")
|
|||
|
|
print("3. 观察生成过程中和生成完成后的输出差异")
|
|||
|
|
print("4. 按 Ctrl+C 退出")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
input("\n准备好后按回车开始探测...")
|
|||
|
|
|
|||
|
|
# 持续探测
|
|||
|
|
prev_state = None
|
|||
|
|
counter = 0
|
|||
|
|
|
|||
|
|
while True:
|
|||
|
|
try:
|
|||
|
|
# 获取最后一条AI消息的完整信息
|
|||
|
|
result = await page.evaluate("""
|
|||
|
|
() => {
|
|||
|
|
const aiMessages = document.querySelectorAll(
|
|||
|
|
'.agent-chat__list__item--ai, [class*="agent-chat"][class*="ai"], [class*="message"][class*="ai"]'
|
|||
|
|
);
|
|||
|
|
if (aiMessages.length === 0) return null;
|
|||
|
|
|
|||
|
|
const lastMsg = aiMessages[aiMessages.length - 1];
|
|||
|
|
const textEl = lastMsg.querySelector('.agent-chat__speech-text, [class*="text"], [class*="content"]');
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
className: lastMsg.className,
|
|||
|
|
innerHTML: lastMsg.innerHTML.substring(0, 500),
|
|||
|
|
textContent: textEl ? textEl.innerText.substring(0, 200) : '',
|
|||
|
|
hasCursor: lastMsg.innerHTML.includes('cursor') || lastMsg.innerHTML.includes('blink'),
|
|||
|
|
childElements: Array.from(lastMsg.children).map(c => c.tagName + '.' + c.className).slice(0, 5)
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
""")
|
|||
|
|
|
|||
|
|
if result:
|
|||
|
|
state_hash = f"{result['className']}_{result['hasCursor']}"
|
|||
|
|
|
|||
|
|
if state_hash != prev_state:
|
|||
|
|
prev_state = state_hash
|
|||
|
|
counter += 1
|
|||
|
|
print(f"\n--- 探测 #{counter} ---")
|
|||
|
|
print(f"Class: {result['className']}")
|
|||
|
|
print(f"Has Cursor: {result['hasCursor']}")
|
|||
|
|
print(f"Child Elements: {result['childElements']}")
|
|||
|
|
print(f"Text Preview: {result['textContent'][:100]}...")
|
|||
|
|
print(f"HTML Snippet: {result['innerHTML'][:200]}...")
|
|||
|
|
|
|||
|
|
await asyncio.sleep(0.5)
|
|||
|
|
|
|||
|
|
except KeyboardInterrupt:
|
|||
|
|
break
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"Error: {e}")
|
|||
|
|
await asyncio.sleep(1)
|
|||
|
|
|
|||
|
|
await context.close()
|
|||
|
|
print("\n探测结束")
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
asyncio.run(detect())
|