基于原生JS的简易投票系统设计与前端刷票脚本实现

作者:像素漫游时间:2026-10-29 08:14:13浏览:603

本文介绍如何使用原生JavaScript构建一个简易的前端投票界面,并深入解析通过浏览器控制台模拟点击事件实现刷票的技术原理。文章详细讲解了DOM元素查找、定时器控制投票频率以及监听DOM变化以维持票数优势的具体代码实现,旨在帮助开发者理解前端事件机制与脚本注入的基本逻辑。

简易投票系统设计与开发

此前曾听闻存在各类刷票脚本,针对微博投票等平台的刷票行为屡见不鲜。

出于好奇尝试实践,经过数小时的调试与探索,逐渐理清了相关实现逻辑。

(1)投票系统

实施刷票的前提是拥有一个可供操作的投票界面。

虽然可以直接利用现有的投票网站,但为了便于测试与调试,此处选择自行搭建一个简易的投票页面。

页面大致如下 或者 查看演示

简易投票系统设计与开发

界面设计力求简洁,但已具备投票功能的基本要素。

原始规则设定为:用户仅能投票一次,提交成功后按钮将变为不可用状态。

代码完全采用原生JS编写,DOM操作不熟练的开发者可借此机会进行练习;若使用jQuery则可实现更为便捷的开发。

html/css部分


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<head>
<title>投票系统 & js脚本简单刷票</title>
<style type="text/css">

  *{padding: 0;margin: 0;}
  #wrap{margin: 0 auto; width:600px; text-align: center;}
  .person{position: relative; margin: 20px; float: left;}
  .person h4,
  .person p, 
  .person button{margin-bottom: 5px;}
  .person h4{color: blue;}
  .person span{color: red;}
  .person button:hover{cursor: pointer; font-weight: bold;}
  .clear{clear: both;}
</style>

</head>
<body>

<div id="wrap">
<h3>给你的小伙伴投上一票吧</h3>
  <div class="person">
    <h4>one</h4>
    <p>总票数: <span>0</span> 票</p>
    <button>给它投票</button>
  </div>
  <div class="person">
    <h4>two</h4>
    <p>总票数: <span>0</span> 票</p>
    <button>给它投票</button>
  </div>
  <div class="person">
    <h4>three</h4>
    <p>总票数: <span>0</span> 票</p>
    <button>给它投票</button>
  </div>
  <div class="person">
    <h4>four</h4>
    <p>总票数: <span>0</span> 票</p>
    <button>给它投票</button>
  </div>
  <div class="clear"></div>
</div>

js部分


<script type="text/javascript">
function getElemensByClassName(className){  // 通过class获取
  var classArr = new Array();
  var tags = document.getElementsByTagName("*"); //获取所有节点
  for(var item in tags){ 
    if(tags[item].nodeType == 1){ 
    if(tags[item].getAttribute("class") == className){ 
      classArr.push(tags[item]); //收集class匹配的节点
    }
  }
}
  return classArr;
}

function delete_FF(element){  // 在FireFox中删除子节点为空的元素
  var childs = element.childNodes;
  for(var i=0;i<childs.length;i++){ 
    var pattern = /\s/; //模式匹配,内容为空
    if(childs[i].nodeName == "#text" && pattern.test(childs[i].nodeValue)){  //处理
      //alert(childs[i].nodeName);
      element.removeChild(childs[i]); //删除FF中获取的空节点
    }
  }
}

window.onload = function(){ 
  var persons = getElemensByClassName("person");
//  alert(persons);
  for(var item in persons){  //遍历所有person,为它们绑定投票事件
    (function(_item){    //匿名函数传入item, 防止因作用域问题导致item总为最后一个
    delete_FF(persons[_item]); //出去FF中空行代表的子节点
    persons[_item].setAttribute("id","person"+(parseInt(_item)+1)); //赋上id

    var childs = persons[_item].childNodes;
    for(var i = 0;i<childs.length;i++){ 
      //alert(childs[i].nodeName);
      if(childs[i].nodeName == "BUTTON"){  //点击按钮投票
        var oButton = childs[i];
      }
      if(childs[i].nodeName == "P"){  //投票结果更新
        var oP = childs[i];
        var oSpan = oP.getElementsByTagName("span")[0];
      }
    }
    if(oButton != null){
    oButton.onclick = function(){  //事件绑定
      var num = oSpan.innerHTML; //获取票数
      oSpan.innerHTML = (++num); //票数更新
                    // 这时一般我们可能就需要把这个票数num传送给服务器保存,更新时也是和服务器中的num同步
      this.setAttribute("disabled","true"); // 一般只能投票一次的吧
      alert("投票成功,谢谢您的支持");
    };
  }
})(item); // 传入各项person
  }
};
</script>

代码注释已尽可能清晰,这构成了一个功能简单的投票页面基础。

前端刷票脚本实现原理

(2)刷票脚本实现

所谓刷票脚本,即通过自动化程序模拟投票行为,其核心在于如何触发投票逻辑。

基于前述代码可知,常规投票流程即点击“投票”按钮,进而触发后端数据处理。

前端存在一个票数统计变量num,后端同样拥有同步的num变量,由于两者保持同步,我们无需关注后端逻辑。

当click事件被触发时,JS会自动同步num值。因此,刷票的本质即模拟触发click事件。

鉴于投票页面属于第三方,我们无法直接修改其源码,所能做的仅是通过JS模拟事件的发生。

脚本编写完成后,应如何调用执行?

通常采用控制台模式,例如Firefox或Chrome浏览器的开发者工具控制台,将编写的脚本粘贴其中,浏览器会自动解析并执行以处理页面数据。

例如在FireBug的控制台中,左侧用于展示信息,右侧为代码输入区。

简易投票系统设计与开发

或者使用Chrome的控制台,在内部输入JS代码并按回车执行即可。

简易投票系统设计与开发

若尚未熟悉此类工具,建议搜索相关教程学习基础知识。

刷票脚本代码编写与测试

接下来编写一个基础的刷票脚本。

首先假设投票页面并非由我们开发,我们需要确定刷票的关键切入点。

必须识别出投票操作的核心要素。

利用浏览器审查元素功能定位,通常目标即为投票按钮。

简易投票系统设计与开发

简易投票系统设计与开发

点击该按钮后,将鼠标悬停在投票页面的按钮上,在页面中搜寻其他标签信息,如id、class等,以便后续脚本调用。

简易投票系统设计与开发

确认相关信息,包括id、标签类型等属性。

假设目标是给“two”选项刷票,设定每两秒执行一次投票,目的是使“two”的总票数始终高于“three”(具体策略可根据需求调整)。

开始编写代码,若习惯使用jQuery,在控制台中可直接调用。

简易投票系统设计与开发

若目标页面未引入jQuery或版本过低,需在代码中动态加载:


javascript:(function(url) {
  var s = document.createElement('script');
  s.src = url;
  (document.getElementsByTagName('head')[0] ||
    document.getElementsByTagName('body')[0]).appendChild(s);
})('http://code.jquery.com/jquery-2.1.3.js');

简易投票系统设计与开发

正式开始

1.编写通用刷票函数


function brushVotes(){  //刷票函数
var t = setInterval(function(){
 var three_num = $("#person3>p>span").text(); //three票数
 var two_num  = $("#person2>p>span").text();  // two票数
 console.info(two_num+" "+three_num);
 
 if(two_num - three_num < 5){  //要保持领先5票的优势
  $("#person2>button").click().attr("disabled",false); //触发投票的事件click,投完后记得把投票权限拿回来
 }
 if(two_num - three_num == 5){ //5票领先了就此打住
  clearInterval(t);
 }
 
},2000);
}

利用定时器,设定每两秒执行一次投票事件,当领先优势达到5票时暂停执行。

2.调用刷票函数

初始调用一次,点击运行时脚本即开始执行。

随后监听“three”票数变化,并绑定相应处理逻辑。

普通的change事件仅支持表单相关标签元素,虽然可将票数显示的span改为input以支持onchange事件。

但页面属于他人,我们无法修改其HTML结构。

经过排查,最终找到检测div、span等非表单标签内容变化的方法。若需深入理解此机制,可参考相关文档。


brushVotes(); // 刷票
$("#person3>p>span").bind('DOMNodeInserted', function(e) { //three改变则 触发
 brushVotes(); //继续刷票
});

如此,当“three”票数发生变化时,即可自动触发继续刷票的逻辑。

完整脚本


javascript:(function(url) {
  var s = document.createElement('script');
  s.src = url;
  (document.getElementsByTagName('head')[0] ||
    document.getElementsByTagName('body')[0]).appendChild(s);
})('http://code.jquery.com/jquery-2.1.3.js');


brushVotes(); // 刷票
$("#person3>p>span").bind('DOMNodeInserted', function(e) { //three改变则 触发
 brushVotes(); //继续刷票
});

function brushVotes(){  //刷票函数
var t = setInterval(function(){
 var three_num = $("#person3>p>span").text(); //three票数
 var two_num  = $("#person2>p>span").text();  // two票数
 console.info(two_num+" "+three_num);
 
 if(two_num - three_num < 5){  //要保持领先5票的优势
  $("#person2>button").click().attr("disabled",false); //触发投票的事件click,投完后记得把投票权限拿回来
 }
 if(two_num - three_num == 5){ //5票领先了就此打住
  clearInterval(t);
 }
 
},2000);
}

最后进行模拟测试。

1.进入投票页面,调出Firebug,在控制台右侧代码输入区粘贴完整代码。

简易投票系统设计与开发

2.点击左上角运行按钮,使“two”从零开始刷票至5票,即比“three”领先5票。

此过程将触发5次alert提示。

简易投票系统设计与开发

3.模拟其他用户给“three”投一票,点击“three”的按钮。

简易投票系统设计与开发

4.检测到“three”票数变化后,“two”继续自动刷票。

简易投票系统设计与开发

5.最终当“two”达到6票时再次暂停。

简易投票系统设计与开发

------------------------------------------------------------------------------------------------------

这便是简易刷票脚本的实现过程。

通过此案例,核心在于掌握如何利用脚本操作第三方页面,这与常见的恶意脚本注入有所区别。

我们所做的是模拟正常页面的事件交互,由人工触发这些事件。

利用此机制,除投票系统外,还可用于暴力破解登录验证等场景,但遇到验证码则效果受限;此外也可用于火车票抢票脚本,但这涉及更复杂的技术知识。

作者最新文章
相关文章
更多