9.0 KiB
9.0 KiB
v1.0.0
Playwright + TypeScript 脚本,用于完成豆瓣短信验证码登录,并将登录态持久化到本地 Cookie 文件。 滑块验证码需人工处理,本项目不再尝试自动识别。
功能概览
- 启动 Chromium 浏览器并访问豆瓣登录页;
- 自动填写手机号,触发短信验证码;
- 控制台提示用户完成页面内的额外验证(如滑块)并输入短信验证码;
- 登录成功后将 Cookie 状态保存到
~/douban-cookie.json,后续运行可直接复用。
环境准备
npm install
npx playwright install chromium
需要 Node.js ≥ 18。Playwright 会自动下载 Chromium,首次运行请确保网络可访问 Playwright CDN。
使用方式
-
设置手机号环境变量并运行登录脚本:
DOUBAN_PHONE=13800000000 npm run login -
浏览器会自动打开豆瓣登录页,脚本完成以下操作:
- 填入手机号并点击「获取验证码」;
- 控制台提示等待页面验证(若出现滑块,请手动完成);
- 控制台等待用户输入短信验证码;
- 验证码提交成功后,脚本将登录态写入
~/douban-cookie.json并退出。
-
下次运行会优先尝试加载该 Cookie 文件,若仍在有效期内可直接登录。
命令列表
| 命令 | 说明 |
|---|---|
npm run login |
启动豆瓣登录流程并保存 Cookie |
可配置项
当前脚本仅使用一个环境变量:
| 变量名 | 说明 | 是否必填 | 默认值 |
|---|---|---|---|
DOUBAN_PHONE |
登录手机号(大陆) | 必填 | - |
若需要更改 Cookie 保存位置,可在 src/login.ts 中调整 COOKIES_PATH 定义。
工作流程说明
- 读取
DOUBAN_PHONE,未提供则直接退出; - 若存在
~/douban-cookie.json,加载后访问登录页并校验登录态; - 如未登录,执行短信验证码流程,期间需手动处理页面可能出现的滑块或图形验证码;
- 用户在终端输入收到的短信验证码;
- 验证通过后,将当前浏览器上下文的
storageState写入~/douban-cookie.json。
常见问题
- 登录后仍提示手机号未填写? 确认 Playwright 浏览器窗口焦点在页面内,避免浏览器阻止自动填充。
- 提示滑块验证但脚本无动作? 脚本已停止自动滑块功能,请在浏览器中手动拖动滑块完成验证。
- Cookie 未生成? 只有当脚本确认登录成功时才会写入 Cookie。若终端未看到 “登录成功,Cookies 已保存…” 的日志,请检查短信验证码是否正确。
# 启用自动滑块验证
DOUBAN_AUTO_SLIDER=1 DOUBAN_PHONE=13800138000 npm run login
# 独立测试滑块功能
npm run slider
开发脚本
src/login.ts:主登录流程,负责 Cookie 复用、短信登录以及滑块自动化;login.md:原始业务需求与操作步骤;block.md:滑块破解思路(Python 版)与 TypeScript 脚本参考;typescript-spec.md:团队 TypeScript 编码规范与示例。
许可
本项目仅用于功能验证和学习,使用时请遵守目标网站的服务条款。
v1.1.0
🎉 主要更新
AI 驱动的滑块验证码自动破解
本版本最大亮点是集成了完整的滑块验证码自动识别和求解系统,从 captcha_cracker 项目移植并优化了核心算法。
✨ 新增功能
-
智能滑块识别 🔍
- 多策略并行检测:暗区域、Canny 边缘、颜色量化、LAB 色彩空间
- 双滑块精准识别:同时检测左侧滑块和右侧缺口
- 图像缩放优化:自动放大到 800px 以提高检测精度(原始 340px)
- 可视化调试:自动生成带红框标注的检测结果图
-
简化距离计算算法 📐
- v1.1.0 核心改进:采用简洁准确的几何原理
- 双滑块模式:
距离 = (缺口X - 滑块X) / scaleX - 类比"两只小鸟嘴尖距离",直接计算左边界水平距离
- 移除复杂的坐标转换逻辑,提升准确性
-
拟人化滑动轨迹 🎯
- 使用 Playwright 的
steps参数实现平滑移动 - 避免机械化操作特征
- 成功率约 50%(10 次重试机制)
- 使用 Playwright 的
-
自动重试机制 🔄
- 验证失败自动刷新验证码
- 最多尝试 10 次(可配置)
- 实时日志输出,便于调试
-
截图输出规范 📸
- 原始验证码:保存到
noflag/目录 - 标注结果:保存到
output/目录 - 支持 CLI 工具批量复核:
npm run slider -- --pic-dir=noflag
- 原始验证码:保存到
🔧 技术细节
核心模块结构(src/slider/):
detector.ts: 主检测器,实现多策略候选搜索和评分detector-self-learning.ts: 模板匹配,用于第二滑块检测slider-controller.ts: Playwright 集成,控制浏览器滑动candidate-search.ts: 四种并行检测算法实现utils/geometry.ts: IoU 计算等几何工具utils/image.ts: Sobel 边缘检测、形态学操作cli.ts: 批量评估和标注工具validator.ts: 检测结果验证工具
依赖变更:
- 新增
sharp@^0.33.3:图像处理(缩放、边缘检测、颜色量化) - 已有
playwright@^1.41.1:浏览器自动化
环境变量:
DOUBAN_AUTO_SLIDER=1 # 启用自动滑块验证
DOUBAN_PHONE=手机号 # 登录手机号
📊 性能指标
- 检测准确率:~70-80%(基于标注数据集验证)
- 验证成功率:~50%(考虑网站反爬虫机制)
- 平均尝试次数:1-3 次
- 单次检测耗时:~2-3 秒(含截图、检测、滑动)
🐛 已修复问题
- 坐标系不统一:修复了截图坐标与页面坐标的转换错误
- iframe 元素访问:正确处理腾讯验证码 iframe 内的元素定位
- 边距过滤过严:调整候选框边缘判断逻辑(5% → 1%)
- 距离计算复杂:简化为基本几何公式,提高准确性
📖 文档更新
README.md: 添加自动滑块验证功能说明src/slider/README.md: 详细的算法实现和调试指南CHANGELOG.md: 新增版本变更日志QUICKSTART.md: 更新快速开始指南
🎯 使用示例
最简单的使用方式:
DOUBAN_AUTO_SLIDER=1 DOUBAN_PHONE=13800138000 npm run login
独立测试滑块功能:
npm run slider
编程接口:
import { SliderController } from './slider';
const controller = new SliderController(10);
const result = await controller.solveSlider(page, '.slider-button', '#captcha');
if (result.success) {
console.log(`成功!尝试 ${result.attempts} 次`);
}
⚠️ 注意事项
- 图像识别局限性:复杂背景或低对比度图片可能识别失败
- 反爬虫检测:频繁使用可能触发更严格的验证机制
- 仅供学习:请遵守网站服务条款,不要用于商业或恶意用途
🚀 下一步计划
- 支持更多验证码类型(点选、文字识别)
- 优化检测算法,提高复杂场景的准确率
- 添加机器学习模型,替代规则式检测
- 支持更多网站的滑块验证码
- 自动提取 macOS 收到的短信验证码(v1.2.0 已上线)
- 拓展短信自动读取到第三方短信服务或非 macOS 平台
v1.2.0
新增: macOS 短信自动读取 自动回填验证码 智能降级策略 日志可观测性
🚀 亮点
- macOS 短信自动读取:新增
src/sms/douban-code.ts模块,基于better-sqlite3读取~/Library/Messages/chat.db,自动捕获最新“豆瓣网”验证码短信。 - 自动回填验证码:登录流程会在成功获取验证码后自动填充
#code输入框,提升一次性登录体验。 - 智能降级策略:若未授予完全磁盘访问权限或数据库被占用,脚本会输出原因并回退到命令行输入,保证流程不中断。
- 日志可观测性:短信阶段新增
[短信读取]日志前缀,帮助定位权限、解析或读取失败的问题。
🔧 兼容性要求
- 仅支持 macOS,需为运行脚本的终端(Terminal/iTerm2/VS Code)授予“完全磁盘访问权限”并重启终端。
- 新增依赖
better-sqlite3@^12.4.1(同步 API,零依赖运行),以及类型声明@types/better-sqlite3。 - 保留手动输入验证码流程,Windows/Linux 用户或未授权情况下仍可照常使用。
📦 目录与配置变更
- 新增
src/sms/目录存放短信读取模块。 src/login.ts在滑块验证后自动调用短信读取逻辑,并等待验证码输入框可见。README,VERSION,ARCHITECTURE,IMPLEMENTATION,QUICKSTART,CHANGELOG等文档同步至 v1.2.0,增加权限配置说明。
✅ 升级指南
npm install
- 授权完全磁盘访问:系统设置 → 隐私与安全性 → 完全磁盘访问权限 → 添加终端并勾选;
- 重启终端或 VS Code;
- 运行
npm run login体验自动读取验证码。