【问题标题】:Detect synthetic clicks on a webpage检测网页上的合成点击
【发布时间】:2015-02-11 02:19:03
【问题描述】:

是否可以通过 Javascript 检测合成点击(不是人工生成的点击,而是使用 JS 或其他自动化工具生成的点击)?

【问题讨论】:

    标签: javascript events click


    【解决方案1】:

    您可能希望观察 mousemove 事件和 click 事件。如果您正在捕捉点击事件,但没有 mousemove 事件,我认为可以肯定地说机器人正在点击您的网站。

    【讨论】:

      【解决方案2】:

      也许我们可以这样做:

      document.onmousedown = function(e) {
           if (typeof(e.pageX) !== 'undefined' && e.pageX != 0)
            {
              alert ('human');
            }else{
                alert ('else');
            }
          }
      

      或类似的方法:

       document.onmousedown = function(e) {
                   if(e.screenX && e.screenX != 0 && e.screenY && e.screenY != 0){
                       alert("real button click");
                     }else{
                     alert("something else");
                     }
               }
      

      请看这里:Detect if button click real user or triggered by a script

      注意:如果您需要 jquery 解决方案,请访问: Check if event is triggered by a human

      【讨论】:

      • 这种方式无法检查 e.originalEvent。使用 document.onmousedown.e 时参数 e dosent 包含 originalEvent。e 包含鼠标点击位置的坐标。
      【解决方案3】:

      您可以像在其他 anwsers 中一样使用 vanilla Javascript,也可以考虑使用 jquery,以便轻松检测非人工点击。

      1.使用jquery定义一个全局的点击事件处理程序。这样你就可以捕捉到页面元素上的所有点击。

       $(document).click(function(event) {
        });
      

      2.如果 event.originalEvent 存在,则检查是否存在单击是由人执行的。 More info

      鼠标点击

       $(document).click(function(event) {
          if (event.originalEvent === undefined) {
              alert('not human')
          } else {
              alert(' human');
          }
       });
      

      按键

      $(document).keypress(function(event) {
      
          if (event.originalEvent === undefined) {
              alert('not human')
          } else {
              alert(' human');
          }
      });
      

      这是一个示例代码。

      <!DOCTYPE html>
      <html>
      <head>
      <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
      <script>
      $(document).ready(function(){
       $(document).click(function(event) {
          if (event.originalEvent === undefined) {
              alert('not human')
          } else {
              alert(' human');
          }
      });
      $(document).keypress(function(event) {
      
          if (event.originalEvent === undefined) {
              alert('not human')
          } else {
              alert(' human');
          }
      });
         $(document).click();
         $(document).keypress();
      });
      </script>
      </head>
      <body>
      <p>Click me !</p>
      </body>
      </html>
      

      【讨论】:

      • 他没有标记 jquery。在有人反对你之前纠正它。
      【解决方案4】:

      仅通过检查页面事件没有可靠的方法来做到这一点。

      您当然可以判断一个事件是由代码触发还是由“鼠标点击”触发的,但是无法确定是否真的有人点击了鼠标,我相信这就是您要问的。

      您可能可以观察鼠标移动并对其进行分析,以查看它们是否包含足够的人类肌肉运动伪影(非线性运动),但如果这确实有效,我预计它不会持续很长时间,直到广告欺诈的人流行起来并添加一些随机性。

      这就是为什么 Google 和其他公司采用 CAPTCHA 和其他图灵类型测试的原因。

      【讨论】:

        【解决方案5】:

        这是一个老问题,但接受的答案使用 jQuery,我相信这里的很多访问者都在寻找一个普通的 JS 解决方案。如果不需要支持IE,可以使用Event.isTrusted

        document.querySelector('a').onclick = function(event) {
            if('isTrusted' in event) {
                if(event.isTrusted === true) {
                    console.log('clicked on by a human');
                } else if(event.isTrusted === false) {
                    console.log('click was triggered by a script');
                }
            }
        };
        

        https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted

        在 IE 中,除createEvent 创建的事件外,所有事件都是可信的:

        https://technet.microsoft.com/en-us/windows/ff974948(v=vs.60)

        【讨论】:

          【解决方案6】:

          我知道这个问题很老,但正确的方法是使用event.isTrusted,如果用户用鼠标单击,则为真,如果由脚本调度,则为假。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-12
            • 2017-05-03
            • 1970-01-01
            • 1970-01-01
            • 2016-10-04
            相关资源
            最近更新 更多