import asyncio import random from playwright.async_api import async_playwright from utils.enhanced_human_typing import EnhancedHumanTypingSimulator from utils.paste_typing import PasteTypingSimulator async def xhs_tag_input(page, tags: list, selector: str): """模拟小红书的标签输入逻辑""" element = await page.wait_for_selector(selector) await element.click() for i, tag in enumerate(tags): # 输入#号 await page.keyboard.press("Shift") await asyncio.sleep(random.uniform(0.1, 0.2)) await page.keyboard.press("3") await page.keyboard.up("Shift") await asyncio.sleep(random.uniform(0.2, 0.4)) # 输入标签文本 for char in tag: await page.keyboard.type(char, delay=random.randint(300, 500)) await asyncio.sleep(random.uniform(0.1, 0.2)) # 输入回车并等待 await page.keyboard.press("Enter") await asyncio.sleep(random.uniform(0.5, 0.8)) # 标签间额外停顿 if i < len(tags) - 1: await asyncio.sleep(random.uniform(0.8, 1.2)) async def xhs_type_text(page, text: str, selector: str): """模拟小红书的文本输入逻辑""" # 定位元素 element = await page.wait_for_selector(selector) await element.click() # 按段落分割 paragraphs = text.split('\n\n') for i, paragraph in enumerate(paragraphs): if not paragraph.strip(): continue # 逐字符输入 for j, char in enumerate(paragraph): # 特殊字符处理 if char in ',。!?、': # 中文标点输入稍慢 await page.keyboard.type(char, delay=random.randint(200, 300)) await asyncio.sleep(random.uniform(0.1, 0.2)) elif char in ',.!?': # 英文标点输入较快 await page.keyboard.type(char, delay=random.randint(150, 250)) await asyncio.sleep(random.uniform(0.08, 0.15)) else: # 普通字符正常速度 await page.keyboard.type(char, delay=random.randint(100, 200)) await asyncio.sleep(random.uniform(0.05, 0.1)) # 每输入15-25个字符后可能停顿思考 if j > 0 and j % random.randint(15, 25) == 0: await asyncio.sleep(random.uniform(0.3, 0.8)) # 段落间添加换行和思考时间 if i < len(paragraphs) - 1: # 段落结束,停顿思考 await asyncio.sleep(random.uniform(0.5, 1.0)) # 输入两个换行 await page.keyboard.press("Enter") await asyncio.sleep(random.uniform(0.1, 0.2)) await page.keyboard.press("Enter") # 准备输入下一段 await asyncio.sleep(random.uniform(0.8, 1.5)) async def test_typing(): test_text = """这是一段测试文本,用来展示人类化输入效果。 这是第二段落,包含一些标点符号:,。!? 以及一些英文字符和数字 Hello World 123。 最后一段用来测试段落之间的停顿效果。 ✨【交通指南】 ✅7号线直达施园站,步行5分钟入园 ✅自驾导航「北京环球城市大道」,停车场直通园区 ⏰建议早9点开园前排队,热门项目可节省1小时等待 🎢【必玩项目清单】 🔥哈利波特:对角巷买黄油啤酒,探索霍格沃茨城堡内部奥秘(需提前线上预约) 🔥侏罗纪世界:大冒险激流勇进必玩,恐龙特效超震撼 🔥变形金刚:霸天虎过山车速度与激情现场版 🔥小黄人乐园:适合带娃拍照,旋转扫把项目萌趣满分 🍽️【美食玄学】 ✔️好莱坞街区「霓虹街市集」汉堡配奶昔 ✔️功夫熊猫「平先生面馆」云吞面地道 ⚠️景区内餐标偏高,建议自带水杯续水 """ async with async_playwright() as playwright: # 启动浏览器,添加剪贴板权限 browser = await playwright.chromium.launch(headless=False) # 设置为False以便观察 context = await browser.new_context(permissions=['clipboard-read', 'clipboard-write']) page = await context.new_page() # 创建一个简单的HTML页面 await page.set_content(''' 输入测试对比

正文输入测试

优化版输入

使用jieba分词的智能输入

小红书版输入

模拟小红书的输入逻辑

复制粘贴版输入

模拟用户复制粘贴行为
''') # 创建输入模拟器实例 enhanced_typer = EnhancedHumanTypingSimulator(page) paste_typer = PasteTypingSimulator(page) # 执行正文输入测试 print("\n=== 开始正文输入测试 ===") print("1. 开始复制粘贴版输入测试...") # 找到目标输入框并聚焦 text_area = await page.wait_for_selector("#paste-area") await text_area.click() # 使用 keyboard API 直接模拟输入 # 先全选当前内容(如果有的话) await page.keyboard.press("Control+A") await asyncio.sleep(random.uniform(0.1, 0.2)) # 输入文本 await page.keyboard.type(test_text) print("复制粘贴版输入完成!") await asyncio.sleep(2) print("\n2. 开始优化版输入测试...") await enhanced_typer.type_text(test_text, "#enhanced-area") print("优化版输入完成!") await asyncio.sleep(2) print("\n3. 开始小红书版输入测试...") await xhs_type_text(page, test_text, "#xhs-area") print("小红书版输入完成!") await asyncio.sleep(2) # 关闭浏览器 await browser.close() if __name__ == "__main__": asyncio.run(test_typing())