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

5.8 KiB
Raw Blame History

滑块验证自动化说明

功能概述

本项目实现了滑块验证码的自动识别和破解功能,参考了 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]
  • 每次失败后使用不同偏移值重试
  • 直到验证成功或尝试完所有偏移

使用方法

在登录流程中使用

启用自动滑块验证:

DOUBAN_AUTO_SLIDER=1 DOUBAN_PHONE=13800138000 npm run login

高级配置

通过环境变量自定义行为:

# 启用自动滑块
DOUBAN_AUTO_SLIDER=1 \
# 手动指定滑动距离(像素)
DOUBAN_SLIDER_DISTANCE=250 \
# 自定义偏移尝试序列
DOUBAN_SLIDER_OFFSETS=0,-3,3,-8,8 \
# 超时时间(毫秒)
DOUBAN_SLIDER_TIMEOUT=30000 \
npm run login

独立测试滑块功能

npm run slider

这会启动一个测试模式,给你 30 秒时间手动导航到包含滑块的页面,然后自动尝试完成滑块验证。

在代码中调用

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 接口

interface SliderConfig {
  // 滑块按钮选择器
  handleSelector?: string;
  
  // 滑块轨道选择器
  trackSelector?: string;
  
  // 背景图选择器
  bgSelector?: string;
  
  // 缺口小图选择器
  pieceSelector?: string;
  
  // 等待超时(毫秒)
  timeout?: number;
  
  // 手动指定距离(像素)
  distance?: number;
  
  // 偏移尝试序列
  offsets?: number[];
}

默认选择器

{
  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]
}

针对不同验证码调整

腾讯防水墙

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',
});

网易易盾

await autoSlide(page, {
  handleSelector: '.yidun_slider',
  trackSelector: '.yidun_slider_track',
  bgSelector: '.yidun_bg-img',
  pieceSelector: '.yidun_jigsaw',
});

提高成功率的技巧

1. 调整偏移序列

根据实际测试结果调整偏移值:

# 如果发现总是差 5-10 像素,可以重点尝试这个范围
DOUBAN_SLIDER_OFFSETS=0,5,10,15,-5,-10 npm run login

2. 手动指定距离

如果能通过人工观察确定距离:

DOUBAN_SLIDER_DISTANCE=280 npm run login

3. 自定义选择器

查看页面 HTML 结构,使用更精确的选择器:

DOUBAN_SLIDER_HANDLE_SELECTOR='.custom-slider-btn' npm run login

4. 增加超时时间

网络较慢时:

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. 选择器不正确 → 调整 bgSelectorpieceSelector
  3. 使用默认距离 → 手动指定 DOUBAN_SLIDER_DISTANCE

参考资料