自己动手写工具:自动点击小插件

一、 模拟点击操作应用场景

  当我们需要对一个网页上的某个按钮进行多次点击以求得某种“好处”的时候,例如天猫的抢红包活动,我们可能需要点击N次之后才有可能获得一个红包,但是这个N是一个未知数,有可能我们要不停地点击半个小时甚至一个小时都还无法获得,自己估计也会点鼠标点得醉了。因此,针对这种情况,我们希望自己写一个小工具来让计算机帮我们做这件事。

  既然是让计算机模拟我们的点击操作,其思路自然是找到指定的按钮或图片,循环对其执行click事件。于是,我们开始对其做一个最简单的实现来看看其基本思路。首先,我们准备一个网站,这里我是用ASP.NET开发了一个网页,其中有一张图片作为抢红包的按钮图片,然后写了一个一般处理程序。

  (1)前端网页的HTML代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>测试页面</title>
    <script src="Resource/Js/jquery-1.5.1.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#btnGetMoney").bind("click", function () {
                $.ajax({
                    type: "GET",
                    url: "MyServiceHandler.ashx?action=GetRedEnvelope",
                    dataType: "json",
                    success: function (data) {
                        if (data.success) {
                            alert("恭喜!您已获得红包:" + data.message + " 元");
                        }
                        else {
                            alert("您的手气不好,下次再来抢吧");
                        }
                    },
                    error: function () {
                        alert('服务器未响应!');
                    }
                });
            });
        });
    </script>
</head>
<body>
    <div style="text-align:center;">
        <hr />
            <img id="btnGetMoney" src="Resource/Image/red2014.png" alt="抢红包" style="cursor:pointer;" />
        <hr />
    </div>
</body>
</html>

  其显示效果如下图所示:

  (2)后端一般处理程序代码:

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Buffer = true;
            context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
            context.Response.AddHeader("pragma", "no-cache");
            context.Response.AddHeader("cache-control", "");
            context.Response.CacheControl = "no-cache";
            context.Response.ContentType = "text/plain";

            string returnJson = null;
            if (!string.IsNullOrEmpty(context.Request["action"]))
            {
                switch (context.Request["action"].ToString())
                {
                    case "GetRedEnvelope":
                        context.Response.ContentType = "text/XML";
                        returnJson = GetRedEnvelope(context);
                        break;
                }
            }

            context.Response.Write(returnJson);
            context.Response.End();
        }

        private static Random ran = new Random();

        private string GetRedEnvelope(HttpContext context)
        {
            JsonObject json = new JsonObject();
            int number = ran.Next(1, 100);
            if (number > 95)
            {
                // 5%的几率获得红包
                json.success = true;
            }
            else
            {
                json.success = false;
            }
            json.message = number.ToString();
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            return serializer.Serialize(json);
        }

  当用户点击前端网页中的图片时,会发出一个AJAX请求到服务端,服务端会生成一个1到100之间的随机数来模拟概率,只有在随机生成的数字达到95以上(即5%的概率)才给用户返回获得红包的效果。

  ①没有获得红包的点击后的效果:

  ②获得红包的点击后的效果:

二、借助WebBrowser控件实现自动点击

  2.1 强大的控件—WebBrowser

    新建一个WindowsForm项目,拖入一个GroupPanel、TextBox、Button以及WebBrowser控件构成下面的界面效果:

  2.2 借助HtmlElement.InvokeMember方法模拟点击

PS:这里假设我们已经通过查看HTML代码知道了要模拟点击的按钮的id,不要告诉我说你不会查看网页的源代码哦。

        void btnGetMoney_Click(object sender, EventArgs e)
        {
            AutoClick(10);
        }

        void AutoClick(int count = 1)
        {
            HtmlDocument dom = webBrowser.Document;
            if(dom == null)
            {
                return;
            }

            var btn = dom.GetElementById("btnGetMoney");
            for (int i = 0; i < count; i++)
            {
                btn.InvokeMember("click");
            }
        }

  在C#中封装了针对DOM树的类:HtmlDocument,每一个Html标签都被封装为HtmlElement。这里我们首先通过DOM操作(GetElementById)找到要点击的button按钮,然后一个循环操作,通过封装的InvokeMember方法执行click事件。默认情况下,这个方法只会执行一次,当然这里我们模拟了10次。

  2.3 简单模拟自动点击的效果演示

三、借助Google浏览器扩展插件实现自动点击

3.1 关于Google浏览器扩展插件

  Chrome是什么在此就不做赘述了,想必看到这篇文章的人对其都非常熟悉。Chrome一个突出的特点就是允许用户开发第三方插件以扩展浏览器功能。虽然IE、火狐也都支持第三方插件对浏览器功能进行拓展,但对其开发远没有Chrome浏览器插件方便,加之Chrome浏览器市场占有率持续增长,大家对Chrome浏览器插件的开发更加感兴趣。下图是迅雷针对Chrome浏览器开发的扩展插件。

3.2 开发自动点击插件AutoClickDemo

  (1)插件的总目录:manifest.json

  每个Chrome插件都包含一个manifest.json的文件,这是Chrome插件的总目录,里面定义了每个资源都是做什么的。manifest.json文件里是一个json类型的数据。

  按chrome开发规范,我们首先建一个文件夹,如D:\AutoClickDemo\,在该文件夹下新建一个名为manifest.json的文本文件,并按实际情况放一个图片文件,作为插件的图标。然后新建一个名为myscript.js的js脚本文件,作为我们需要自定义模拟点击的脚本文件。最后,如果需要用到jQuery,还需要把jQuery放到文件夹目录中:

  该manifest.json文件的内容和解释如下:

  具体代码为:

{ 
  "name": "刷红包(演示)",
  "version": "1.0",
  "manifest_version":2,
  "description": "This is a auto click plug-in, you can use it in the web site",
  "icons":{"16":"16.png","48":"48.png","128":"128.png"},
  "permissions": ["http://*/*"],
  "browser_action": {
        "default_icon": "16.png"
  }, 
  "content_scripts":[
  {
      "matches":["http://localhost:4351/*"],
      "js":["jquery-1.7.1.min.js","myscript.js"]
  }
  ]
}

  (2)自定义的脚本:myscript.js

   刚刚manifest.json只是帮我们生成了一个目录给Chrome浏览器,具体的操作还得自定义一个js脚本来生成。代码很简单,就是每隔1秒钟点击一次按钮。写好自定义脚本后,在Chrome浏览器中添加这个扩展插件,以后在打开指定网页时都会加载我们的自定义脚本来完成我们想要的操作。

function autoClick(){
    $("#btnGetMoney").click();
}

setInterval(autoClick,1000);

$(function(){
    
});

  (3)为Chrome添加扩展插件

  在Chrome菜单中,选择 工具-扩展程序 ,进入以下界面。然后勾选住 开发者模式,然后加载正在开发的扩展程序。

  (4)打开指定网页体验模拟点击效果

四、小结

  本次的小插件开发以模拟点击一个“抢红包”按钮为场景,以两种方式实现了一个简单得不能再简单的刷红包效果,但是其基本思路都我们都已经了解了。以后再面对这种应用,可以自己写一些功能丰富的插件或者程序来实现了。

作者:周旭龙

出处:http://edisonchou.cnblogs.com/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰童鞋骚年

《大型网站技术架构》读书笔记之八:固若金汤之网站的安全性架构

此篇已收录至《大型网站技术架构》读书笔记系列目录贴,点击访问该目录可获取更多内容。

9130
来自专栏角落的白板报

将 ASP.NET Core 2.0 项目升级至 ASP.NET Core 2.1.3X

项目的例子直接使用https://github.com/52ABP/52ABP.School 作为对象,毕竟他正好是.NET CORE 2.0的版本。

9210
来自专栏码农阿宇

利用Asp.Net Core的MiddleWare思想处理复杂业务流程

最近利用Asp.Net Core 的MiddleWare思想对公司的古老代码进行重构,在这里把我的设计思路分享出来,希望对大家处理复杂的流程业务能有所帮助。

10710
来自专栏恰童鞋骚年

Key/Value之王Memcached初探:一、掀起Memcached的盖头来

  在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。但是ASP.NET中的HttpRu...

11520
来自专栏大内老A

依赖注入[6]: .NET Core DI框架[编程体验]

毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动时构建请求处理管道过程中,以及利用该管道处理每个请求过程中使用到的服务...

9310
来自专栏Java后端技术

ASP.Net后台 实现先弹出对话框,再跳转到另一个网页的实现方法

15310
来自专栏IT派

C# 200行代码实现区块链

原始文章是通过 Go 语言来实现自己的区块链的,这里我们参照该文章来使用 C# + Asp.Net Core 实现自己的区块链。

17210
来自专栏NetCore

Asp.Net Core SignalR 与微信小程序交互笔记

Asp.Net Core SignalR 是微软开发的一套基于Asp.Net Core的与Web进行实时交互的类库,它使我们的应用能够实时的把数据推送给Web客...

34020
来自专栏恰童鞋骚年

ASP.Net开发基础温故知新学习笔记

申明:本文是学习2014版ASP.Net视频教程的学习笔记,仅供本人复习之用,也没有发布到博客园首页。

28210
来自专栏大内老A

依赖注入[8]: .NET Core DI框架[服务消费]

包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IServiceProvider对象。当需要消费某个服务实例的时候,我们只...

12220

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励