很多网站在用户进行某次点击,比如在线购物确认购买时,会要求用户输入验证码,这在一般情况下也没啥问题,但在用户需要频繁购买或是抢购时就很讨厌了。其实网站的验证码一般是由JS脚本生成的,因此也可以通过编写自己的JS脚本来实现验证码自动输入。

  大致原理如下,首先观察原网页弹出的验证码图片,这里给出两个示例:,它们都是前景黑白,背景彩色,宽100高20的图片,进一步把图片放到PS里打开可以发现每个数字所占的都是一个宽8高10的矩形,且这5个矩形的位置和相对距离都是固定的。因此,原理就很简单了,事先为每个数字和字母做一个唯一的编码表,每个码都是长为80维的0-1编码,0代表当前数字(字母)在这个小矩形里是背景,1则代表是前景,这样所有数字和字母都有自己唯一的编码。每次随机生成一幅新的验证码图后,只要把这5个数字(字母)对应的小矩形取出来,然后依次遍历那80个像素,得到一个长为80的编码,再去与编码表一一匹配,就知道具体是哪个数字(字母)了。代码如下:

 var captcha = ''; /* 验证码 */
 var canvas = document.createElement('canvas');
 canvas.width = '100'; /* 验证码图片宽度 */
 canvas.height = '20'; /* 验证码图片高度 */
 canvas.style.display = 'none';
 document.body.appendChild(canvas); /* 将这一部分也加入到网页代码中 */
 var context = canvas.getContext('2d');
 var image = new Image();
 image.src = document.getElementById('coderefresh').src;
 image.onload = function() {
     context.drawImage(image, 0, 0);
     for (var i = 0; i ; i++) { /* 5位验证码,依次处理 */
         var dbString = '';
         var canvasData = context.getImageData(27 + 9 * i, 5, 8, 10); /* 上面的例子第一个小矩形左上角的坐标是(27,5),然后依次偏移9就是下一个小矩形 */
         for (var j = 0; j < canvasData.data.length; j += 4) {
             var r = canvasData.data[j + 0];
             var g = canvasData.data[j + 1];
             var b = canvasData.data[j + 2];
             /* 验证码字符只有黑白两种纯色, 背景色均为其它RGB值 */
             if (!((r == 0 && g == 0 && b == 0) || (r == 255 && g == 255 && b == 255)))
                 dbString += '0';
             else
                 dbString += '1';
         }
         for (var k = 0; k < 36; k++) { /* 去编码表进行匹配 */
             if (dbString == characters[0][k]) /* 匹配成功 */
                 break;
         }
         captcha += characters[1][k];
     }
     /* 加入购物车 */
     var reslut_list = new Array();
     reslut_list.push(window.location.pathname.match(/\d+/)[0]);
     reslut_list.push(captcha);
     addToCart(reslut_list);
 }

通过JavaScript脚本实现验证码自动输入的更多相关文章

  1. javascript脚本实现浏览器自动点击(阿里员工秒杀月饼)

    原文地址https://blog.csdn.net/ani521smile/article/details/52575063 秒杀活动页面 <!DOCTYPE HTML> <html ...

  2. JavaScript脚本语言基础(一)

    导读: JavaScript代码嵌入HTML文档 JavaScript代码运行方式 第一个实例 JavaScript的三种对话框 定义JavaScript变量 JavaScript运算符和操作符 Ja ...

  3. C#中让WebBrowser运行Javascript脚本

    C#中可以让Webbrowser运行Javascript脚本来实现各种自动化操作,比如点击网页上的按钮,输入用户名密码等等.代码也很简单: >>>>>>>&g ...

  4. 2017.9.22 HTML学习总结--JavaScript脚本语言

    接上: 1.JavaScript脚本语言 定义:javascript是一种简单的脚本语言,可以在浏览器中直接运行, 是一种在浏览器端实现网页与客户交互的技术javascript代码可 以直接运行在ht ...

  5. 【按键精灵篇】如何做一个自动打开APP进入注册页面自动输入自己手机号

    按键精灵,虽然很早听过,但是一直没有真正使用过,所以最近有点时间也简单试一下,通过脚本自动清理APP缓存,打开百家号并自动进入注册页面输入自己的手机号. 软件清单 1. 雷电手机模拟器:https:/ ...

  6. MongoDB学习笔记-06 数据库命令、固定集合、GridFS、javascript脚本

    介绍MongoDB支持的一些高级功能: 数据库命令 固定大小的集合 GridFS存储大文件 MongoDB对服务端JavaScript的支持 数据库命令 命令的原理 MongoDB中的命令其实是作为一 ...

  7. JavaScript脚本语言基础(四)

    导读: JavaScript和DOM DOM文档对象常用方法和属性 DOW文档对象运用 JSON数据交换格式 正则表达式 1.JavaScript和DOM [返回] 文档对象模型(Document O ...

  8. Ajax实现提交表单时验证码自动验证(原创自Zjmainstay)

    本文通过源码展示如何实现表单提交前,验证码先检测正确性,不正确则不提交表单,更新验证码. 1.前端代码 index.html <!DOCTYPE html> <html> &l ...

  9. JavaScript脚本语言基础(三)

    导读: 数学对象(Math) 数组对象(Array) 字符串对象(String) 日期对象(Date) js对象是属性和方法的集合.JavaScript中的所有事物都是对象,如:字符串.数值.数组.函 ...

随机推荐

  1. linux shell 去重 uniq和sort的区别

    sort -u 和 uniq都能起到删除重复信息的功能,那么他们的区别究竟在哪呢?$ cat test              jasonjasonjasonfffffjason 下面分别执行三个命 ...

  2. RabbitMQ 学习记录

    rabbit mq知识点:1.消费时可以通过acknowledge设定消费是否成功,消费不成功时在server端requeue2.需要注意两个持久化:queue持久化和消息持久化(通过代码设定,默认即 ...

  3. eclipse的ssh框架详解

    1.创建项目 2.导包 1.1:导入Struts2可能用到的包: 先从网站下载 再这里找出,打开它把WEB-INF/lib/下的所有包导入项目   1.2:导入spring可能用到的包: 先从网站下载 ...

  4. C# DataSet和DataTable详解

    1.C# DataSet和DataTable详解:http://www.cnblogs.com/top5/archive/2009/04/23/1441765.html 2.DataSet和DataT ...

  5. docker--wekan安装

    最近因为搭建开源看板网站的需要,玩了下docker 一开始在redhat上安装docker wget http://mirrors.163.com/.help/CentOS7-Base-163.rep ...

  6. Two Sum & Add Two Numbers

    Two Sum 题目:https://leetcode.com/problems/two-sum/ class Solution(object): def twoSum(self, nums, tar ...

  7. 【Maven】使用Maven构建多模块项目

    Maven多模块项目 Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理.尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定 ...

  8. 转-C#让枚举返回字符串

    下面的手段是使用给枚举项打标签的方式,来返回字符串 下面分别定义一个属性类,和一个枚举帮助类 [AttributeUsage(AttributeTargets.Field,AllowMultiple  ...

  9. Til the Cows Come Home

    Description Bessie is out in the field and wants to get back to the barn to get as much sleep as pos ...

  10. [MySQL]load data local infile向MySQL数据库中导入数据时,无法导入和字段不分离问题。

    利用load data将文件中的数据导入数据库表中的时候,遇到了两个问题. 首先是load data命令无法执行的问题: 命令行下输入load data local infile "path ...