Files
douban-login/slider.md
2025-10-24 22:20:23 +08:00

245 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 滑块验证自动化说明
## 功能概述
本项目实现了滑块验证码的自动识别和破解功能,参考了 [crack-slide-captcha](https://github.com/omigo/crack-slide-captcha) 项目的思路。
## 核心原理
### 1. 计算滑动距离
- 使用 `sharp` 库进行图像处理
- 将背景图转换为灰度图
- 通过边缘检测找到缺口位置
- 计算滑块需要移动的距离
### 2. 模拟人类滑动行为
为了避免被识别为机器人,实现了以下特性:
#### 真实的速度曲线
- **加速阶段** (30%距离, 25%时间):开始较慢,逐渐加快
- **匀速阶段** (50%距离, 50%时间):保持中等速度
- **减速阶段** (20%距离, 25%时间):接近目标时减速
#### 轨迹随机化
- 垂直方向有微小抖动±1-3px
- 非完全直线移动
- 总耗时随机在 1-2 秒之间
#### 随机反应时间
- 鼠标移动到滑块前有 100-300ms 的反应延迟
- 按下和松开鼠标时有 50-100ms 的随机延迟
### 3. 多次尝试机制
由于图像识别不能保证 100% 准确,实现了偏移重试机制:
- 默认尝试偏移: `[0, -2, 2, -5, 5, -10, 10]`
- 每次失败后使用不同偏移值重试
- 直到验证成功或尝试完所有偏移
## 使用方法
### 在登录流程中使用
启用自动滑块验证:
```bash
DOUBAN_AUTO_SLIDER=1 DOUBAN_PHONE=13800138000 npm run login
```
### 高级配置
通过环境变量自定义行为:
```bash
# 启用自动滑块
DOUBAN_AUTO_SLIDER=1 \
# 手动指定滑动距离(像素)
DOUBAN_SLIDER_DISTANCE=250 \
# 自定义偏移尝试序列
DOUBAN_SLIDER_OFFSETS=0,-3,3,-8,8 \
# 超时时间(毫秒)
DOUBAN_SLIDER_TIMEOUT=30000 \
npm run login
```
### 独立测试滑块功能
```bash
npm run slider
```
这会启动一个测试模式,给你 30 秒时间手动导航到包含滑块的页面,然后自动尝试完成滑块验证。
### 在代码中调用
```typescript
import { autoSlide, waitAndHandleSlider, hasSlider } from './slider';
// 检查是否存在滑块
if (await hasSlider(page)) {
console.log('发现滑块验证码');
}
// 自动完成滑块验证
const success = await autoSlide(page, {
distance: 250, // 可选:手动指定距离
offsets: [0, -5, 5], // 可选:自定义偏移序列
timeout: 20000, // 可选:超时时间
});
// 或者等待并处理滑块(如果出现)
await waitAndHandleSlider(page);
```
## 配置选项
### SliderConfig 接口
```typescript
interface SliderConfig {
// 滑块按钮选择器
handleSelector?: string;
// 滑块轨道选择器
trackSelector?: string;
// 背景图选择器
bgSelector?: string;
// 缺口小图选择器
pieceSelector?: string;
// 等待超时(毫秒)
timeout?: number;
// 手动指定距离(像素)
distance?: number;
// 偏移尝试序列
offsets?: number[];
}
```
### 默认选择器
```typescript
{
handleSelector: '.tc-drag-thumb, .slide-verify-slider-mask-item, .slider-button',
trackSelector: '.tc-drag-track, .slide-verify-slider, .slider-track',
bgSelector: '.tc-bg-img, .slide-verify-block-bg, .captcha-bg',
pieceSelector: '.tc-jig-img, .slide-verify-block, .captcha-piece',
timeout: 20000,
offsets: [0, -2, 2, -5, 5, -10, 10]
}
```
## 针对不同验证码调整
### 腾讯防水墙
```typescript
await autoSlide(page, {
handleSelector: '.tc-drag-thumb',
trackSelector: '.tc-drag-track',
bgSelector: '.tc-bg-img',
pieceSelector: '.tc-jig-img',
});
```
### 极验验证
```typescript
await autoSlide(page, {
handleSelector: '.geetest_slider_button',
trackSelector: '.geetest_slider',
bgSelector: '.geetest_canvas_bg',
pieceSelector: '.geetest_canvas_slice',
});
```
### 网易易盾
```typescript
await autoSlide(page, {
handleSelector: '.yidun_slider',
trackSelector: '.yidun_slider_track',
bgSelector: '.yidun_bg-img',
pieceSelector: '.yidun_jigsaw',
});
```
## 提高成功率的技巧
### 1. 调整偏移序列
根据实际测试结果调整偏移值:
```bash
# 如果发现总是差 5-10 像素,可以重点尝试这个范围
DOUBAN_SLIDER_OFFSETS=0,5,10,15,-5,-10 npm run login
```
### 2. 手动指定距离
如果能通过人工观察确定距离:
```bash
DOUBAN_SLIDER_DISTANCE=280 npm run login
```
### 3. 自定义选择器
查看页面 HTML 结构,使用更精确的选择器:
```bash
DOUBAN_SLIDER_HANDLE_SELECTOR='.custom-slider-btn' npm run login
```
### 4. 增加超时时间
网络较慢时:
```bash
DOUBAN_SLIDER_TIMEOUT=60000 npm run login
```
## 注意事项
1. **识别准确率**:图像识别方法的准确率约 70-80%,需要配合偏移重试
2. **反爬策略**:频繁使用可能触发更严格的验证,建议:
- 控制使用频率
- 随机化行为参数
- 使用代理 IP
3. **维护成本**:验证码提供商可能更新策略,需要相应调整选择器和算法
4. **合规使用**:仅用于学习研究,实际使用请遵守目标网站的服务条款
## 故障排查
### 问题:找不到滑块元素
**解决方案**
1. 打开浏览器开发者工具,检查实际的 HTML 结构
2. 使用 `DOUBAN_SLIDER_HANDLE_SELECTOR` 等环境变量指定正确的选择器
### 问题:滑动后验证失败
**可能原因**
1. 距离计算不准确 → 调整 `DOUBAN_SLIDER_OFFSETS`
2. 滑动速度过快 → 修改 `generateTrack` 函数增加总时长
3. 轨迹不够真实 → 增加抖动幅度
### 问题:图像处理失败
**可能原因**
1. 图片格式不支持 → 检查 `getImageBuffer` 函数
2. 选择器不正确 → 调整 `bgSelector``pieceSelector`
3. 使用默认距离 → 手动指定 `DOUBAN_SLIDER_DISTANCE`
## 参考资料
- [crack-slide-captcha](https://github.com/omigo/crack-slide-captcha) - 原始参考项目
- [Sharp 文档](https://sharp.pixelplumbing.com/) - 图像处理库
- [Playwright 文档](https://playwright.dev/) - 浏览器自动化