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