利用JS最真实的模拟鼠标点击

为了破解永乐票务登录验证码问题

http://www.228.com.cn/auth/login?logout

当然,打码的过程自然依赖第三方平台,但问题是,哪怕平台给了你需要点击的(相对)坐标。你又如何进行点击呢?

在 C# 中,我本想利用控件 WebBrowser 来解决这个问题。结果翻了一大圈也没有找到什么有用的API。就连查找元素的方式也只有getElementByTag 和 getElementById。其次是 click() 方法。

但如果仅仅提供如此,我还不如直接往页面中使用 js 更轻快。

1、通过 chrome 控制台的Event Listeners。我们查看该img的绑定click事件,得知实际绑定click事件的元素是 .geetest_item.geetest_big_item

2、我们试着往控制台执行: $(".geetest_item.geetest_big_item").click(); 

发现图片什么变化也没有,然而等我们再次点击图片时,我们看到了变化:

点击的时候,居然是2,为什么不是1呢?

这说明我们的js起了效果,说明我们确确实实触发了图片的click事件。那么为什么执行js的时候,图片一点反应都没有?

click() 和 真实点击的区别到底在哪里?答案就是 event 的不同。我们可以通过一个实验来证明一下,新建一个index.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <button id="fuck">fuck</button>
</body>
<script src="https://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script>
<script>
    $("#fuck").click(function (e) {
        console.log(e);
    })
</script>
</html>

打开这个页面,先是手动点击一下 “fuck” 按钮,然后再到控制台中输入 : $("#fuck").click();  我们来对比两者的区别:

我们发现,通过 click() 而产生的 event 参数较比真实点击的e参数非常匮乏。这可能就是原因,并且我们发现一个关键的参数 clientX , clientY 。

那么,我们结合之前click() 会导致 +1 的现象,猜测对方的代码可能是这样的:

var i =0;
$(".geetest_item.geetest_big_item").click(function (e) {
    i++;
    if (e.clientX && e.clientY) {
        $(".geetest_item.geetest_big_item").append("<div>" + i + "</div>")
    }
})

根据这个,我们只想办法在 click() 的时候,加入参数clientX , clientY 。应该就可以了。当然click是没有参数的。所以我们需要手动创建 Event

var ev = document.createEvent('HTMLEvents'); 
ev.clientX = 625
ev.clientY = 356
ev.initEvent('click', false, true); 
$(".geetest_item.geetest_big_item")[0].dispatchEvent(ev)

结果发现,是可行的

至此、破解了这个验证码点击问题。

其他传送门:

# 宝哥教你#查看jquery绑定的事件函数
http://sudodev.cn/detect-jquery-event-function-define/

# 图片还原和滑块位置求解
http://blog.csdn.net/qew110123/article/details/53068098
原文地址:https://www.cnblogs.com/CyLee/p/7513342.html