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

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

  当我们需要对一个网页上的某个按钮进行多次点击以求得某种“好处”的时候,例如天猫的抢红包活动,我们可能需要点击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/

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

时间: 2025-01-16 08:49:35

自己动手写工具:自动点击小插件的相关文章

【原创】自己动手写工具----随手记(最终版)

一.前面的话 在上一篇自己动手写工具----随手记中,我简单介绍了这个小玩意儿的大致界面和要实现的功能,看了一下园子里的评论,评价褒贬不一,有人说“现在那么多云笔记的工具”,“极简版evernote”,我想说的是,别人的工具再好用,终究不是自己写的,其实写这个的目的,一方面是锻炼自己的技术能力,在coding的时候,或多或少会遇到一些问题,在解决这些问题的过程中,技术能力就会有所提升:另一方面,写这个东西还有自己个人原因,可以随时记录一些繁杂的知识点,通过给这些知识点打上标签,可以实现归类,那有

【原创】自己动手写工具----XSmartNote [Beta 3.0]

一.前面的话 在动笔之前,一直很纠结到底要不要继续完成这个工具,因为上次给它码代码还是一年多之前的事情,参考自己动手写工具----XSmartNote [Beta 2.0],这篇博文里,很多园友提出了宝贵的意见.最后决定吸收园友的建议把这个工具重构一下.首先给它换了个名 称,XSmartNote.因为各种自身的原因,并没有完成这个工具的基本功能,只是实现了基本的框架.最近有点时间就搞了一下,权当做打下基础.本来想用B/S结构来重新搞一下,毕竟园子里有很多大牛都是专注于ASP.NET MVC,但仔

【原创】自己动手写工具----签到器(升级版)

一.前面的话 上一篇中基本实现了简单的签到任务,但是不够灵活.在上一篇自己动手写工具----签到器的结尾中,我设想了几个新增功能来提高工具的灵活程度,下面把新增功能点列出来看看: (1)新增其他的进程任务: (2)任务按照进程进行分类:用IE就是执行IE的任务,与其他(如资源管理器等)无关: (3)每执行完一个任务关闭任务窗口: (4)对签到性质的任务进行”已签到“过滤: (5)实现执行的任务列表自定义: (6)另外实现任务的可视化: 还是先来看看效果图: 二.签到器的改进 在上一个版本中,(自

自己动手写工具:百度图片批量下载器

开篇:在某些场景下,我们想要对百度图片搜出来的东东进行保存,但是一个一个得下载保存不仅耗时而且费劲,有木有一种方法能够简化我们的工作量呢,让我们在离线模式下也能爽爽地浏览大量的美图呢?于是,我们想到了使用网络抓取去帮我们去下载图片,并且保存到我们设定的文件夹中,现在我们就来看看如何来设计开发一个这样的图片批量下载器. 一.关于网络抓取与爬虫 网络蜘蛛的主要作用是从Internet上不停地下载网络资源.它的基本实现思想就是通过一个或多个入口网址来获取更多的URL,然后通过对这些URL所指向的网络资

【原创】自己动手写工具----随手记

一.背景 有个朋友是在他们单位的市场部,手里的策划文案以及PPT,少则数百,多则上千,多年下来也是一笔不可小觑的财富,每一次新的策划都可以从以往的文案或PPT中“拿来主义”,有着很好的借鉴意义,但是这么多的材料,如果挨个翻看还不得累死.我们知道每个Word或者PPT打开至少要4秒钟(我的电脑是这样,配置不赖),那几百个下来什么也不用做了,时间都在打开这些材料中度过了.而记录这些东西,又不需要花费专门的精力,只要想记下来,copy,paste,加上标签便于检索就OK啦~于是这个小玩意儿就产生啦~\

自己动手写一个自动登录脚本gg

1.下载一个sshpass工具 2.安装sshpass,安装到tools文件夹 3.把tools文件夹的路径加入到/etc/bashrc vim   /etc/bashrc 最后一行  : export PATH="/Users/lukairui/tools:$PATH" source   /etc/bashrc 4.切换到tools文件夹 vim  gg gg的内容如下: #!/bin/sh URL=`grep N:$1 /Users/lukairui/tools/gg_table

【原创】自己动手写控件----XSmartNote控件

一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的label扩展控件,还有包含自定义事件的含checkbox的控件.自定义控件的好处就是其灵活程度很高,不但可以扩展控件的外观,还可以扩展控件的事件,甚至从底层拦截Windows消息进行处理,这也是我喜欢自己写控件的原因.至于自定义控件的几种形式在这里就不说了,有兴趣的小伙伴可以百度一下,下面来看看这些控件的

写个js小工具自动生成博文目录

我们在写博客的时候,如果博文里面有目录,会给人结构清晰.一种一目了然的感觉,看目录就知道这篇博文要讲解的内容,并且点击目录标题就可以跳转到具体的内容,这样园友们在看博客的时候就可以很方便地浏览自己感兴趣的内容,但是遗憾的是博客园不支持博文目录的生成,好像也有园友给博客园提建议,希望能够像CSDN那样能够自动生成博文目录,但是不知道是什么原因,博客园一直都没有把这个功能加上去,既然没有,那我就自己做吧,研究了2天,总算是按照自己的设想做出来了,最终效果如下: 下面来介绍一下这个小工具的实现. 一.

动手写一个Remoting测试工具

基于.NET开发分布式系统,经常用到Remoting技术.在测试驱动开发流行的今天,如果针对分布式系统中的每个Remoting接口的每个方法都要写详细的测试脚本,无疑非常浪费时间.所以,我想写一个能自动测试remoting接口的小工具InterfaceTester.而且,当分布式系统中的某个remoting接口出现bug时,该小工具可以提交需要模拟的数据,以便在调试remoting服务的环境中,快速定位和解决bug. InterfaceTester运行起来后的效果如下图: 1.如何使用 (1)首