利用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM