update at 2025-10-25 23:39:25

This commit is contained in:
douboer
2025-10-25 23:39:25 +08:00
parent 3eae607591
commit bd8da1d56a
51 changed files with 4757 additions and 275 deletions

View File

@@ -1,11 +1,11 @@
# 快速开始 - 滑块验证自动化
# 快速开始 - 滑块验证自动化v1.1.0
## 🚀 5 分钟上手
### 1. 安装依赖
```bash
cd /Users/gavin/mcp/douban-login
cd /Users/gavin/douban-login
npm install
```
@@ -17,9 +17,10 @@ DOUBAN_AUTO_SLIDER=1 DOUBAN_PHONE=你的手机号 npm run login
就这么简单!脚本会自动:
- ✅ 检测滑块验证码
-计算滑动距离
-模拟真人滑动
-多次重试直到成功
-使用 AI 识别滑块和缺口位置
-计算精确的滑动距离
-模拟真人滑动轨迹
- ✅ 自动重试直到成功(最多 10 次)
### 3. 独立测试滑块功能
@@ -37,32 +38,33 @@ npm run slider
DOUBAN_AUTO_SLIDER=1 DOUBAN_PHONE=13800138000 npm run login
```
### 场景 2识别不准手动指定距离
脚本会自动完成整个登录流程,包括滑块验证。
### 场景 2查看检测过程
登录后查看生成的截图:
- `noflag/` 目录:原始验证码图片
- `output/` 目录:带红框标注的检测结果
红框标注说明:
- 左侧红框:检测到的滑块位置
- 右侧红框:检测到的缺口位置
### 场景 3调试识别准确性
如果识别总是失败,可以:
1. 查看 `output/` 目录的标注图,确认红框位置是否准确
2. 检查控制台日志中的 `scaleX` 值(应该约为 2.35
3. 确认距离计算公式:`(缺口X - 滑块X) / scaleX`
### 场景 4批量复核历史截图
```bash
DOUBAN_AUTO_SLIDER=1 \
DOUBAN_SLIDER_DISTANCE=280 \
DOUBAN_PHONE=13800138000 \
npm run login
npm run slider -- --pic-dir=noflag
```
### 场景 3调整重试偏移
```bash
DOUBAN_AUTO_SLIDER=1 \
DOUBAN_SLIDER_OFFSETS=0,-5,5,-10,10,-15,15 \
DOUBAN_PHONE=13800138000 \
npm run login
```
### 场景 4增加超时时间网络慢
```bash
DOUBAN_AUTO_SLIDER=1 \
DOUBAN_SLIDER_TIMEOUT=60000 \
DOUBAN_PHONE=13800138000 \
npm run login
```
会对 `noflag/` 目录中的所有验证码图片重新检测,并将标注结果输出到 `output/` 目录。
## 💻 在代码中使用
@@ -70,178 +72,217 @@ npm run login
```typescript
import { Page } from 'playwright';
import { waitAndHandleSlider } from './slider';
import { SliderController } from './slider';
async function myFunction(page: Page) {
// 触发可能出现滑块的操作
await page.click('#some-button');
async function login(page: Page) {
// 触发登录操作
await page.click('#login-button');
// 自动等待并处理滑块(如果出现)
await waitAndHandleSlider(page);
// 自动处理滑块验证(如果出现)
const controller = new SliderController(10);
const result = await controller.solveSlider(
page,
'.tcaptcha_drag_button', // 滑块按钮选择器
'#tcaptcha_iframe' // 验证码 iframe 选择器
);
if (result.success) {
console.log(`验证成功!尝试 ${result.attempts} 次`);
} else {
console.log('验证失败,需要手动完成');
}
}
```
### 更多控制
```typescript
import { hasSlider, autoSlide } from './slider';
import { SliderDetector, SliderController } from './slider';
async function myFunction(page: Page) {
await page.click('#some-button');
await page.waitForTimeout(1000);
// 检查是否有滑块
if (await hasSlider(page)) {
console.log('需要完成滑块验证');
// 自动完成
const success = await autoSlide(page, {
distance: 250, // 可选:手动指定距离
offsets: [0, -5, 5, -10, 10], // 可选:重试偏移
});
if (!success) {
console.log('自动验证失败,请手动完成');
// 处理失败情况
}
}
// 1. 单独使用检测器
const detector = new SliderDetector();
const boxes = await detector.detectSlider(
'captcha.png', // 输入图片路径
'output/result.png', // 标注结果保存路径
true // 是否绘制标注框
);
if (boxes && boxes.length > 0) {
console.log('检测到滑块:', boxes);
console.log('第一个滑块位置:', boxes[0].x, boxes[0].y);
console.log('第一个滑块尺寸:', boxes[0].width, boxes[0].height);
}
```
### 自定义配置(针对不同网站)
```typescript
// 腾讯防水墙
await autoSlide(page, {
handleSelector: '.tc-drag-thumb',
trackSelector: '.tc-drag-track',
bgSelector: '.tc-bg-img',
pieceSelector: '.tc-jig-img',
});
// 极验验证
await autoSlide(page, {
handleSelector: '.geetest_slider_button',
trackSelector: '.geetest_slider',
bgSelector: '.geetest_canvas_bg',
pieceSelector: '.geetest_canvas_slice',
});
// 2. 使用控制器完成整个流程
const controller = new SliderController(10);
const result = await controller.solveSlider(page);
```
## 🔧 故障排查
### 问题:不到滑块元素
### 问题:检测不到滑块
**解决**打开浏览器开发者工具,检查 HTML 结构,然后:
**症状**日志显示"未检测到滑块"或"检测到 0 个滑块"
```bash
DOUBAN_SLIDER_HANDLE_SELECTOR='.your-slider-class' npm run login
**排查步骤**
1. 检查 `noflag/` 目录下的原始截图是否正确
2. 确认验证码已完全加载(等待 iframe 和图片元素)
3. 查看 `output/` 目录的标注图,确认候选框是否被正确识别
4. 尝试多次运行,因为验证码图片质量可能不同
### 问题:滑动距离不准确
**症状**:滑块滑过头或不够远
**v1.1.0 简化算法**
- 使用公式:`距离 = (缺口X - 滑块X) / scaleX`
- scaleX 约为 2.35340px → 800px 的缩放比例)
- 基于"两只小鸟嘴尖距离"的几何原理
**排查步骤**
1. 查看控制台日志中的距离计算过程
2. 检查 `output/` 目录标注图,红框是否准确
3. 确认检测到的是双滑块模式2 个红框)
**示例日志**
```
### 问题:距离总是差一点
**解决**:调整偏移序列,重点尝试差距范围:
```bash
# 如果总是差 10 像素左右
DOUBAN_SLIDER_OFFSETS=0,10,8,12,5,15 npm run login
[SliderDetector] 检测到 2 个滑块候选框
[SliderDetector] 滑块 1: x=45, width=60, score=0.85
[SliderDetector] 滑块 2: x=195, width=55, score=0.82
[SliderController] 计算距离: (195 - 45) / 2.35 = 63.8px
```
### 问题:验证总是失败
**原因和解决**
**可能原因**
1. **图像识别不准** → 手动指定距离
```bash
DOUBAN_SLIDER_DISTANCE=250 npm run login
```
1. **图像识别不准**
- 查看 `output/` 目录检查标注准确性
- 复杂背景或低对比度图片识别率较低
- 当前准确率约 70-80%
2. **滑动太快被识别为机器人** → 修改 `slider.ts` 增加总时长
```typescript
// 在 generateTrack 函数中
const totalTime = 1500 + Math.random() * 1500; // 改为 1.5-3 秒
```
2. **反爬虫检测**
- 避免过于频繁使用
- 已集成拟人化轨迹,但仍可能被识别
3. **选择器不对** → 检查并指定正确选择器
3. **网络延迟**
- 成功标识(`.tc-success`)可能延迟出现
- 当前等待时间 1000ms可能需要延长
**解决方案**
- 使用自动重试机制(最多 10 次)
- 查看详细日志定位问题
- 必要时手动完成验证
### 问题:程序卡住不动
**检查**
- 是否在等待手动完成验证?查看终端提示
- 超时设置是否太短?增加 `DOUBAN_SLIDER_TIMEOUT`
- 网络是否正常?
- 是否在等待 iframe 加载?查看日志 "等待验证码 iframe 加载..."
- 是否在等待图片加载?查看日志 "等待滑块背景图加载..."
- 网络是否正常?尝试增加超时时间
### 视觉调试技巧
**查看检测结果**
1. 运行登录后,打开 `output/` 目录
2. 找到最新的 `*-detected.png` 文件
3. 检查红框是否准确标注了滑块和缺口
4. 对比 `noflag/` 目录的原始图
**理想的标注结果**
- 左侧滑块:红框紧贴滑块边缘
- 右侧缺口:红框框住缺口区域
- 两个红框高度基本一致y 坐标偏差 < 25px
- 红框宽度接近滑块实际宽度 50-70px
## 📚 深入了解
- [SLIDER.md](./SLIDER.md) - 详细功能文档
- [IMPLEMENTATION.md](./IMPLEMENTATION.md) - 实现原理
- [src/examples.ts](./src/examples.ts) - 更多使用示例
- [README.md](./README.md) - 项目总览和功能介绍
- [src/slider/README.md](./src/slider/README.md) - 滑块模块详细文档
- [CHANGELOG.md](./CHANGELOG.md) - 版本更新日志
- [release.md](./release.md) - 发布说明
## 🎯 核心 API
```typescript
// 检测是否存在滑块
hasSlider(page: Page, config?: SliderConfig): Promise<boolean>
// 自动完成滑块验证
autoSlide(page: Page, config?: SliderConfig): Promise<boolean>
// 等待并处理滑块(推荐)
waitAndHandleSlider(page: Page, config?: SliderConfig): Promise<boolean>
```
## ⚙️ 配置选项
```typescript
interface SliderConfig {
handleSelector?: string; // 滑块按钮选择器
trackSelector?: string; // 滑块轨道选择器
bgSelector?: string; // 背景图选择器
pieceSelector?: string; // 缺口图选择器
timeout?: number; // 超时时间(毫秒)
distance?: number; // 手动指定距离(像素)
offsets?: number[]; // 偏移尝试序列
// 滑块检测器
class SliderDetector {
async detectSlider(
imagePath: string,
outputPath: string,
drawBoxes: boolean = true
): Promise<BoundingBox[] | null>
}
```
## 🎉 运行示例
// 滑块控制器
class SliderController {
constructor(maxAttempts: number = 10)
async solveSlider(
page: Page,
sliderSelector?: string,
captchaSelector?: string
): Promise<SliderSolveResult>
}
查看 6 个详细示例:
// 返回结果
interface SliderSolveResult {
success: boolean; // 是否成功
attempts: number; // 尝试次数
distance?: number; // 滑动距离(像素)
}
```bash
# 基础使用
npm run ts-node src/examples.ts 1
# 手动检测
npm run ts-node src/examples.ts 2
# 自定义配置
npm run ts-node src/examples.ts 3
# 登录流程集成
npm run ts-node src/examples.ts 4
# 批量处理
npm run ts-node src/examples.ts 5
# 环境变量配置
npm run ts-node src/examples.ts 6
// 边界框
interface BoundingBox {
x: number;
y: number;
width: number;
height: number;
}
```
## 💡 提示
1. **首次使用建议先不开启自动验证**,观察滑块行为
2. **记录成功的参数配置**,后续重复使用
3. **避免过于频繁使用**,可能触发更严格验证
4. **定期检查更新**,验证码可能会变化
1. **首次使用**
- 建议先运行一次观察完整流程
- 查看 `output/` `noflag/` 目录的输出
- 了解红框标注的含义
2. **提高成功率**
- 依赖自动重试机制最多 10
- 每次验证码图片不同识别难度也不同
- 当前成功率约 50%已经可以应对日常使用
3. **调试建议**
- 查看控制台日志了解检测过程
- 检查 `output/` 目录的标注图验证准确性
- 使用 CLI 工具批量测试`npm run slider -- --pic-dir=noflag`
4. **避免滥用**
- 不要过于频繁使用可能触发更严格验证
- 遵守网站服务条款
- 仅用于个人学习研究
## ⚠️ 重要提示
- 本功能仅用于学习研究
- 使用时请遵守网站服务条款
- 图像识别准确率约 70-80%
- 需配合偏移重试提高成功率
- **本功能仅用于学习研究**
- **使用时请遵守网站服务条款**
- **图像识别准确率约 70-80%**
- **验证成功率约 50%含重试**
- **不保证 100% 成功请做好手动完成的准备**
## 📊 性能指标
- **检测耗时** 2-3 /含截图检测标注
- **平均尝试次数**1-3
- **最大尝试次数**10
- **图像缩放比例**340px 800pxscaleX 2.35
## 🤝 需要帮助?
查看详细文档或运行示例代码了解更多用法
查看详细文档或提交 Issue 了解更多用法
---
**v1.1.0** - 2025-10-25
引入 AI 驱动的滑块验证码自动破解功能 🎉