Logo

site iconZiShu | 子舒

本RSS包含了奇趣周刊。前端程序员,骑行爱好者,摄影爱好者,INFJ 。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

ZiShu | 子舒 RSS 预览

AI 驱动的验证码自动识别之旅:从困扰到解放

2025-07-07 08:00:00

在当今互联网世界,验证码作为人机验证的重要工具无处不在。然而,频繁输入验证码对用户体验造成了不小的困扰。今天,我想分享一个名为 “CAPTCHA-automatic-recognition” 的开源项目,它巧妙地运用 AI 技术,实现了网页验证码的自动识别与填充。

1. 解决日常痛点

作为一名经常需要在不同网站注册和登录的开发者,我深受验证码困扰。有时仅仅是查询一个信息,就需要输入验证码;有时验证码字符扭曲到难以辨认,需要多次尝试才能通过。

这些小小的摩擦积累起来,浪费了大量时间。我想:既然现代 AI 视觉模型已经如此强大,为什么不利用它们来自动识别验证码,节省我们的时间和精力呢?

于是,“CAPTCHA-automatic-recognition” 项目诞生了。

我选择了以油猴脚本的形式实现这个功能,因为它可以轻松地集成到各种网站上,无需修改网站源码。

CAPTCHA-automatic-recognition
CAPTCHA-automatic-recognition

2. 迭代与优化

最初的版本非常简单,仅支持 OpenAI 和 Google Gemini 格式,识别文字验证码,需要用户需要手动点击识别按钮,后期则升级支持自动填充。

关键问题是如何准确获取网页中的验证码图片,我简单做了一套图像检测程序,通过选择器找到可能是验证码的图片元素,比如:

captchaSelectors: [
  'img[src*="captcha"]',
  'img[src*="verify"]',
  // ...
],

随着用户的反馈,我加入了对阿里云通义千问的 API 支持,用户可以根据自己的需求和偏好选择不同的 AI 模型。

并且我加强了对 prompt 的优化,根据网友的建议升级了 prompt,让模型更加准确地识别验证码。

来源:https://linux.do/t/topic/756503/135

export const DEFAULT_PROMPT = `# Role: 验证码识别专家

## Profile
- language: 中文
- description: 一个专为高精度识别验证码而设计的AI模型。能够快速、准确地从复杂的图像中提取字符或计算数学表达式的结果,并能有效对抗常见的干扰元素。
- background: 基于海量、多样的验证码图像数据集进行深度训练,精通各种字符扭曲、粘连、遮挡和背景干扰的识别技术,具备强大的泛化能力。
- personality: 精确、高效、客观、直接。只关注任务本身,不产生任何与结果无关的额外信息。
- expertise: 计算机视觉、高级光学字符识别(OCR)、图像预处理与去噪、模式识别、基础算术逻辑。
- target_audience: 需要自动化处理验证码的开发者、自动化测试工程师、数据科学家。

## Skills

1. 核心识别能力
   - 高精度字符识别: 准确识别大小写英文字母、数字,并能精确区分外形相似的字符(如:0和O,1和l,g和9)。
   - 数学运算处理: 识别并解析图片中的数学算式(如:3+5*2),并计算出最终的数值结果。
   - 强抗干扰能力: 自动过滤和忽略图像中的干扰线、噪点、斑块、背景纹理等非关键信息。
   - 字符分割技术: 即使在字符粘连、重叠或间距不等的情况下,也能有效地将其分离以便独立识别。

2. 辅助处理能力
   - 图像预处理: 自动对输入图像进行灰度化、二值化、去噪等操作,以提升识别的准确率。
   - 快速响应: 以极低的延迟返回识别结果,满足实时性要求。
   - 结果格式化: 严格按照指定的格式输出,确保输出的纯净性,便于程序调用。
   - 鲁棒性: 对于不同字体、大小、颜色、角度的字符组合均有较高的识别成功率。

## Rules

1. 基本原则:
   - 结果唯一: 输出内容必须是且仅是验证码的识别结果。
   - 绝对精确: 尽最大努力确保字符识别的大小写和数值计算的准确性。
   - 任务聚焦: 仅处理验证码内容,忽略图像中的任何其他元素。
   - 保持静默: 除最终结果外,不输出任何提示、标签、解释或说明。

2. 行为准则:
   - 直接输出结果: 若为字符型验证码,直接返回字符串;若为计算题,直接返回计算后的数字。
   - 严格区分大小写: 必须准确识别并返回字符的原始大小写形式(例如'W'和'w'是不同字符)。
   - 精准区分易混淆字符: 必须对数字“0”和字母“O”、数字“1”和字母“l”等易混淆字符进行准确区分。
   - 自动执行运算: 遇到数学表达式时,必须完成计算并仅返回最终的阿拉伯数字结果。

3. 限制条件:
   - 禁止任何解释: 不得对识别过程、结果的置信度或遇到的困难进行任何说明。
   - 禁止附加文本: 返回的最终结果前后不能有任何空格、引号、标签或“答案是:”等引导性词语。
   - 禁止互动: 不得向用户提问或请求更清晰的图片。
   - 禁止失败提示: 即使无法完全识别,也应根据已识别内容尽力输出,而不是返回“无法识别”之类的自然语言。

## Workflows

- 目标: 接收一张验证码图片,精准、快速地返回其内容或计算结果。
- 步骤 1: 接收图像并进行分析,判断验证码类型(字符型或数学计算型)。
- 步骤 2: 应用图像预处理技术,对图像进行降噪、增强和二值化,以凸显关键字符,消除干扰线和背景。
- 步骤 3: 对处理后的图像进行字符分割,然后逐一识别。对于数学题,则识别数字和运算符。
- 步骤 4: 整合识别结果。如果是字符,则按顺序拼接成字符串;如果是数学题,则执行运算。
- 步骤 5: 输出最终结果。确保输出内容绝对纯净,符合Rules中的所有规定。
- 预期结果: 一个不包含任何多余信息的字符串(如“aB5fG”)或一个数字(如“28”)。


## Initialization
作为验证码识别专家,你必须遵守上述Rules,按照Workflows执行任务。

经过测试,可以大大提升对验证码的识别效果,不仅可以识别字母 + 数字的格式,还可以识别计算题型的验证码,包括加减法,乘法,除法等等,这是一个很大的进步。

有用户反馈不知道模型是否可用,因此我加入了 “连通性检测” 的功能,可以帮助用户检查模型的可用性。

在开发的后期,由于人力的因素,虽然内置的验证码识别程序足够满足很多网站使用,但依然有网友反馈识别失败。

我意识到,这不是一个人可以完善的事情。因此我开发了高级设置功能,允许用户自定义验证码选择器和输入框选择器。这解决了不同网站验证码实现差异导致的兼容性问题。

高级设置
高级设置

并且简单写了一个教程,帮助用户使用这个功能。

3. 遇到的问题

跨域图片访问问题

很多网站的验证码图片设置了跨域限制,无法直接获取图像数据。为解决这个问题,我实现了一套图像处理流程,通过 Canvas 间接获取图像数据,然后处理为 base64 格式传输给 AI 模型。

AI 模型选择与优化

不同 AI 模型各有优缺点:

  • OpenAI 模型精度高,但响应较慢
  • Gemini 模型(特别是 gemini-2.5-flash-lite)速度快,平衡了性能和准确率
  • 通义千问适合中文环境

经过反复测试,我发现 gemini-2.5-flash-lite 模型在验证码识别任务上表现最佳,因此成为我的首选。

4. 项目现状与未来规划

目前,这个项目已经在 GitHub 和 Greasyfork 上发布,获得了不少用户的好评。投稿到阮一峰周刊,也收录了该项目。

来源:https://github.com/ruanyf/weekly/blob/master/docs/issue-355.md

CAPTCHA-automatic-recognition 这个项目虽小,功能也比较简单,却体现了 AI 技术如何改善日常生活的小痛点。从最初的想法到如今功能完善的工具,这个过程既有技术上的挑战,也有解决问题带来的成就感。

如果你也经常被验证码困扰,不妨试试这个工具。它可能不是最复杂的 AI 应用,但一定是最实用的 AI 辅助工具之一。

如果你觉得这个功能不错,欢迎点个 star 支持一下~

Obsidian:移动端同步笔记

2025-06-11 08:00:00

前景提示:Obsidian:如何使用坚果云进行多端同步?

时隔三年,终于完成了这个系列,Obsidian 多端同步坚果云之移动端同步。这依赖于坚果云的官方插件 — Nutstore Sync,这个插件支持通过 Webdav 协议将坚果云与 Obsidian 本地笔记进行链接。

Github: https://github.com/nutstore/Obsidian-nutstore-sync

由于该插件还未通过 Obsidian 插件商店审核的原因,需要借助另外一个已上架的插件 – BRAT,可在官方商店直接搜索下载。

需要在 PC 端和移动端同时安装以下两个插件才能进行同步,安装流程都是一样的,我暂以移动端为例。

1. 安装插件

下面是图示流程;

下载安装完成之后,在 BRAT 的设置页面找到 Add beta plugin 按钮点击它。

在添加插件窗口中输入 Nutstore Sync 的 GitHub 地址,点击 Add plugin 安装,即可完成安装。

这一步完成之后,这个插件就已经存在于你的 Obsidian 设置中,下次打开 Obsidian 就可以直接使用了。

2. 使用插件

PC 端和移动端使用方法都是一致的,我暂以 PC 端为例进行截图说明。

Nutstore Sync 中我建议以账号密码进行登录,这样 webdav 的权限更稳定一些,有尝试过使用单点登录,但是容易掉登录权限。

设置面板
设置面板

账号密码就是你的坚果云密码,注意不是登录密码,需要在坚果云网页设置中进行操作。

https://www.jianguoyun.com/

坚果云密钥获取演示
坚果云密钥获取演示

3. 配置推荐

可以参考一下我的设置。

  • 远程目录就是存储数据的地方,PC 端和移动端选择同一目录即可
  • 冲突策略选择推荐即可
  • 开启使用 Git 语法标记冲突(程序员比较习惯)
  • 同步前确认,可以检查一下文件对不对,二次保险
  • 自动同步关掉(推荐),个人用着不太适应,偶尔会出现同步冲突的情况,更喜欢手动操作
  • 同步模式宽松,速度更快

过滤规则:过滤一些不想同步的文件,由于 .Obsidian 很多配置文件,我不想在手机上同步,就过滤掉了。

端午节包粽子

2025-05-31 08:00:00

昨天周五下班后,准备食材包粽子,迎接端午节的到来。

主材料:粽叶、糯米 馅料:五花肉、豆沙、咸蛋黄、蜜枣

由于是第一次包,我跟女朋友一边看教程一边学习,刚开始用的一张叶子,总包不好,后面换成两张叶子,发现越来越得心应手。

模样不算太好看,但是都是真材实料,且没有露馅。但是好像是酱油加的有点少了,所以导致不够咸,总体偏淡,但是口感也是可圈可点,是我喜欢的馅。

后面还有一盆糯米,准备改进一下,多加点酱油,手法上也有所进步了,再接再厉!

分享几张图。

食材
食材

炖锅的五花肉
炖锅的五花肉

下锅的粽子
下锅的粽子

两天一夜象山赶海之旅

2025-05-08 08:00:00

五一刚回来有些忙,推迟了好几天,终于可以闲下来写写游记了。

五一出去象山玩了几天,出发前一周已经做好了攻略,包括路线、时间、住宿哦、饮食等个各方面,但计划赶不上变化。最开始预估的最多三个小时就能到达目的地,结果硬是在高速跑了五六个小时,基本 2/3 的时间都在堵,特别是宁波嘉兴段高速,走走停停,不过还好带了小零食,跟对象说说笑笑就过去了,也不会枯燥。

点赞余姚服务区,跑一半小累下去休息一下,超市价格跟杭州差不多,没有额外涨价,短暂休整后继续驾车前行。一个小插曲,中间大概有几十公里的路程,高速播报允许小汽车在应急车道通行,我犹豫了一下然后果断走了应急通道,非常爽很畅通,虽然车道有些略窄,但是走的很爽没有停下来过,看旁边堵的熙熙攘攘,这也是我第一次走应急通道,不错的体验。

越靠近海边环境越好,空气也很舒服,同时也感叹临海城市天气莫测,刚下象山收费站下起了大雨,然后走了一两公里后,又是大晴天,烈日当空,打开窗户吹吹风,小小的享受了一下。

入岛
入岛

第一站打算去山顶看看大风车,路途经过一个小村庄,整洁的街边道路两旁,一栋栋精致的民居让人向往,羡慕浙江本地人了,家家户户都盖着小别墅,门前几乎都自己修建了小花园,可以养养花逗逗鸟。

到半山腰发现一个露营地,稍作休息,顺便放出无人机看看周围的情况,发现风景也就一般,跟对象商量直接去下一个景点,当时已经是下午三点多了。

沿着公路一直前行,路过有“小赛里木”之称的湖泊,其实就是一个人工湖,看到有很多人在露营烧烤,然后中间有一段管控,不让开车进,很多人都把车停在门口,我带着对象下来散散步、拍拍照,湛蓝的天空伴着习习微风,令人心旷神怡。

短暂休息后,我们决定前往沙滩游玩,就继续出发一路边走边玩,有说有笑,最后导航来到白沙湾沙滩,路两边也是停满了车,一下车女朋友就很兴奋,我也换上了短裤和人字拖,沙滩度假标配,瞅了一下,人不多还挺宽敞的,沙子也比较干净,基本都是一家三口带着小孩来玩,我们俩也去海水泡泡脚,不过傍晚那段时间海水挺黄的,也正好快赶上涨潮。

夕阳和沙滩
夕阳和沙滩
海边的风景
海边的风景

简单玩了一会,我们又去把帐篷从车上拉下来,带了不少东西,因为是第一次露营过夜,也是尽量准备周全一点,准备了防潮垫之类的东西,然后带了一个空调被,事实证明这远远不够,靠近海边还是有点冷,温度不高,比正常睡觉偏凉一些。晚上的话就使用自己带的食材美美的吃了一顿,有火锅底料、毛肚、肥牛、金针菇等,刚好吃饭的时候对面还放起了烟花,非常享受。

露营火锅
露营火锅

出去露营一定要收集好自己的垃圾,我专门准备了几个袋子收拾垃圾使用,打包好扔到附近的垃圾桶,之后就是洗漱完躺着享受夜晚,第一次在帐篷过夜,体验很不错。

本来打算第二天下午就回去的,但是早上起来发现空气很好,天空很蓝,海水很清,和傍晚完全不同,就决定多住一夜。早餐就热一下来之前准备的三明治,又是一顿美美的早餐,之后就是常规的拍照打卡环节,早上八九点几乎没什么人,和女朋友漫步在海边,看着照样吹吹清晨的海风,颇有一番滋味。

海边日出
海边日出

还在美团下单了一些小铲子等,挖挖贝壳,堆堆沙子,彷佛回到了童年。累了就躺帐篷里休息,休息好了继续出去玩,除了太阳有点大,其他并无不适,还好带了防晒喷雾,这两天下来也没有晒黑,不过忽略了一件事,身上防晒做好了,但是忽略了脚,因为穿着人字拖,一天下来好像有些晒伤,还好缓了几天就缓过来了,下次一点要注意这点。

堆沙子游戏
堆沙子游戏

不过等到晚上的时候,倒是发生了一些突然状态,没有看天气预报,入夜的时候风越来越大,因为在海边有些担心,就跟对象商量了一下放弃过夜的想法,收拾了一下行李装车离开,和来时完全不同,路上几乎没有一辆车,打开窗户慢慢开,注意到了之前没有注意的一些东西,象山的路边交通很像之前看过的台湾偶像剧里面的建筑,可能因为都毗邻海边的缘故,建筑风格也很像,和对象嘻嘻笑笑的踏上了回杭的旅程。

总结下来,对这次旅行还是比较满意的,除了开始的时候在高速堵车,其他时候还是很畅通的,风景吃喝都没有委屈自己,非常棒!完结撒花!

开心的下午茶时光
开心的下午茶时光

第一个 Github 千星项目

2025-04-20 08:00:00

今天中午吃完饭闲来无事,准备上 GitHub Explore 看看有没有新的开源项目推荐。

发现我的一个项目,居然成功达到了 1k star,记录一下,虽然是一个很简单的工具,但也算解决了部分用户的痛点。

已经迭代了 170+ 个 releases 版本,功能不断更新,解决了 110+ Issues,合并了 20+ Pull requests。

GitHub: https://github.com/ezyshu/linuxdo-scripts

LinuxDo Scripts
LinuxDo Scripts