236 lines
6.2 KiB
Markdown
236 lines
6.2 KiB
Markdown
# 人类化输入包装器 (HumanTypingWrapper)
|
|
|
|
## 概述
|
|
|
|
`HumanTypingWrapper` 是一个基于 Playwright 的人类化输入包装器,旨在模拟真实人类的打字行为。它提供了随机时间间隔输入、可变输入速度、偶尔的错误修正以及其他人类特征的模拟。
|
|
|
|
## 主要特性
|
|
|
|
### 🎯 核心功能
|
|
- **随机输入速度**:模拟人类不同的打字速度
|
|
- **思考停顿**:随机的停顿,模拟思考过程
|
|
- **错误修正**:偶尔输入错误字符并及时修正
|
|
- **疲劳效应**:长时间输入后速度逐渐减慢
|
|
- **分段输入**:长文本自动分段输入,更自然
|
|
|
|
### 🛡️ 反检测特性
|
|
- **键盘邻键错误**:基于真实键盘布局的错误模拟
|
|
- **退格重输**:偶尔删除并重新输入字符
|
|
- **自然停顿**:在标点符号后适当停顿
|
|
- **点击延迟**:点击前后的随机延迟
|
|
|
|
### 🔧 高度可配置
|
|
- 所有参数都可以自定义
|
|
- 支持不同场景的预设配置
|
|
- 运行时动态调整配置
|
|
|
|
## 快速开始
|
|
|
|
### 基础使用
|
|
|
|
```python
|
|
from playwright.async_api import async_playwright
|
|
from utils.human_typing_wrapper import create_human_typer
|
|
|
|
async def basic_example():
|
|
async with async_playwright() as p:
|
|
browser = await p.chromium.launch(headless=False)
|
|
page = await browser.new_page()
|
|
|
|
# 创建人类化输入器
|
|
typer = create_human_typer(page)
|
|
|
|
# 访问目标页面
|
|
await page.goto("https://example.com")
|
|
|
|
# 人类化输入文本
|
|
await typer.type_text_human("#username", "我的用户名")
|
|
await typer.type_text_human("#password", "我的密码")
|
|
|
|
# 人类化点击
|
|
await typer.human_click("#login-button")
|
|
|
|
await browser.close()
|
|
```
|
|
|
|
### 自定义配置
|
|
|
|
```python
|
|
from utils.human_typing_wrapper import HumanTypingWrapper
|
|
|
|
# 自定义配置
|
|
custom_config = {
|
|
'min_typing_speed': 2, # 最小输入速度 (字符/秒)
|
|
'max_typing_speed': 6, # 最大输入速度 (字符/秒)
|
|
'pause_probability': 0.20, # 停顿概率 (20%)
|
|
'correction_probability': 0.15, # 错误修正概率 (15%)
|
|
'fatigue_effect': True, # 启用疲劳效应
|
|
}
|
|
|
|
# 使用自定义配置
|
|
typer = HumanTypingWrapper(page, custom_config)
|
|
```
|
|
|
|
## 配置选项
|
|
|
|
### 输入速度设置
|
|
```python
|
|
{
|
|
'min_typing_speed': 2, # 最小打字速度 (字符/秒)
|
|
'max_typing_speed': 10, # 最大打字速度 (字符/秒)
|
|
}
|
|
```
|
|
|
|
### 思考停顿设置
|
|
```python
|
|
{
|
|
'pause_probability': 0.15, # 停顿概率 (15%)
|
|
'min_pause_duration': 0.3, # 最小停顿时长 (秒)
|
|
'max_pause_duration': 2.5, # 最大停顿时长 (秒)
|
|
}
|
|
```
|
|
|
|
### 错误修正设置
|
|
```python
|
|
{
|
|
'correction_probability': 0.10, # 错误修正概率 (10%)
|
|
'backspace_probability': 0.05, # 退格重输概率 (5%)
|
|
}
|
|
```
|
|
|
|
### 点击延迟设置
|
|
```python
|
|
{
|
|
'click_delay_before': (0.1, 0.4), # 点击前延迟范围
|
|
'click_delay_after': (0.2, 0.6), # 点击后延迟范围
|
|
}
|
|
```
|
|
|
|
### 分段输入设置
|
|
```python
|
|
{
|
|
'chunk_input': True, # 启用分段输入
|
|
'max_chunk_length': 50, # 每段最大长度
|
|
'chunk_pause_duration': (0.5, 1.5), # 段落间停顿时长
|
|
}
|
|
```
|
|
|
|
### 疲劳效应设置
|
|
```python
|
|
{
|
|
'fatigue_effect': True, # 启用疲劳效应
|
|
'fatigue_threshold': 100, # 疲劳阈值 (字符数)
|
|
'fatigue_slowdown': 0.3, # 疲劳减慢比例 (30%)
|
|
}
|
|
```
|
|
|
|
## API 参考
|
|
|
|
### 主要方法
|
|
|
|
#### `type_text_human(selector, text, clear_first=True)`
|
|
在指定元素中人类化输入文本
|
|
- `selector`: CSS选择器
|
|
- `text`: 要输入的文本
|
|
- `clear_first`: 是否先清空现有内容
|
|
|
|
#### `human_click(selector, wait_after=True)`
|
|
人类化点击元素
|
|
- `selector`: CSS选择器
|
|
- `wait_after`: 点击后是否等待
|
|
|
|
#### `human_scroll(direction="down", amount=3)`
|
|
人类化滚动页面
|
|
- `direction`: 滚动方向 ("up" 或 "down")
|
|
- `amount`: 滚动次数
|
|
|
|
#### `click_and_type(selector, text, **kwargs)`
|
|
点击元素并输入文本的便捷方法
|
|
|
|
#### `update_config(new_config)`
|
|
更新配置参数
|
|
|
|
## 使用场景
|
|
|
|
### 1. 微信公众号自动发布
|
|
```python
|
|
# 微信公众号专用配置
|
|
wechat_config = {
|
|
'min_typing_speed': 3,
|
|
'max_typing_speed': 7,
|
|
'pause_probability': 0.20,
|
|
'correction_probability': 0.08,
|
|
'chunk_input': True,
|
|
'max_chunk_length': 30,
|
|
}
|
|
|
|
typer = create_human_typer(page, wechat_config)
|
|
await typer.type_text_human("#title", "文章标题")
|
|
await typer.type_text_human(".ProseMirror", "文章内容...")
|
|
```
|
|
|
|
### 2. 表单填写
|
|
```python
|
|
# 表单填写配置
|
|
form_config = {
|
|
'min_typing_speed': 4,
|
|
'max_typing_speed': 8,
|
|
'pause_probability': 0.10,
|
|
'correction_probability': 0.05,
|
|
}
|
|
|
|
typer = create_human_typer(page, form_config)
|
|
await typer.type_text_human("#name", "张三")
|
|
await typer.type_text_human("#email", "zhangsan@example.com")
|
|
await typer.type_text_human("#phone", "13800138000")
|
|
```
|
|
|
|
### 3. 搜索查询
|
|
```python
|
|
# 搜索查询配置
|
|
search_config = {
|
|
'min_typing_speed': 5,
|
|
'max_typing_speed': 12,
|
|
'pause_probability': 0.05,
|
|
'correction_probability': 0.12,
|
|
}
|
|
|
|
typer = create_human_typer(page, search_config)
|
|
await typer.type_text_human("#search-box", "人工智能发展趋势")
|
|
await typer.human_click("#search-button")
|
|
```
|
|
|
|
## 最佳实践
|
|
|
|
### 1. 配置选择
|
|
- **谨慎场景**(银行、支付):低错误率,慢速输入
|
|
- **一般场景**(社交媒体):中等错误率,正常速度
|
|
- **测试场景**:高错误率,观察效果
|
|
|
|
### 2. 性能优化
|
|
- 对于长文本,启用分段输入
|
|
- 根据网站响应速度调整延迟
|
|
- 在无头模式下适当提高速度
|
|
|
|
### 3. 反检测策略
|
|
- 避免过于规律的操作模式
|
|
- 在关键操作前增加适当停顿
|
|
- 模拟真实的浏览行为
|
|
|
|
## 注意事项
|
|
|
|
1. **兼容性**:支持同步和异步 Playwright 页面
|
|
2. **性能影响**:人类化操作会显著增加执行时间
|
|
3. **检测规避**:合理配置参数以避免被反爬虫系统识别
|
|
4. **错误处理**:所有方法都包含异常处理,返回成功/失败状态
|
|
|
|
## 示例文件
|
|
|
|
- `examples/human_typing_example.py` - 基础使用示例
|
|
- `examples/wechat_human_typing_integration.py` - 微信公众号集成示例
|
|
|
|
## 许可证
|
|
|
|
此项目遵循与主项目相同的许可证。
|
|
|