為了破解永樂票務登錄驗證碼問題
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