C# Selenium 破解騰訊滑動驗證


什么是Selenium?

    WebDriver是主流Web應用自動化測試框架,具有清晰面向對象 API,能以最佳的方式與瀏覽器進行交互。

支持的瀏覽器:

 

  • Mozilla Firefox

 

  • Google Chrome

 

  • Microsoft Internet Explorer

 

  • Opera

 

  • Safari

 

  • Apple iPhone

 

  • Android browsers

 具體學習相關的地址:

 

 簡書https://www.jianshu.com/search?q=c%23%20Selenium&page=1&type=note(針對C#)

 51testinghttp://www.51testing.com/zhuanti/selenium.html

 

如何破解呢?

1.  破解思路/方案

首先我也是在網上找了很多破解滑動驗證的文章,主要看了下Github上面滑動驗證破解學習的代碼(python):https://github.com/dzhongyi/crack-geetest

代碼雖然是python的,但是思路很明確,於是我就去看了下菜鳥教程的語法,大致思路如下

1.找到滑動驗證碼的原圖與出現缺塊凹槽的驗證碼圖片

2.兩張圖片循環進行像素點對比,然后找到像素點色差比較大點就能

 確定缺塊凹槽的位置,計算偏移度

3.根據計算的偏移度將滑塊移動到缺塊凹槽處

如何找到對應的原圖和凹槽圖呢?

        F12看了下QQ控件滑動驗證的對應的圖片,去查找元素里面去找這個圖片地址

凹槽圖很容易被我們找到,

凹槽圖查找元素直接在頁面上可以找到

 

同樣【Network】中也能找到請求的地址圖片

 

 

例如

圖片地址:

https://ssl.captcha.qq.com/cap_union_new_getcapbysig?aid=549000912&asig=&captype=&protocol=https&clientype=2&disturblevel=&apptype=2&curenv=inner&ua=TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzYzLjAuMzIzOS4xMzIgU2FmYXJpLzUzNy4zNg==&sess=CvU-D6haDOeZFH0zeUlUibQIontTfGSAVOmDKhjwtnlz8WFHRqcVt-vwYuCkafg9J_3L91cxAtwnwlVW44JTDBrrZXGMh3E3tcyKvJE6nuXBnW76_YHAndm0lkSKU7nWqpRJ36WNQbC5nv_faj4MJgr72dyG6iZz3a6wfYNxs9Wz_lYDZJUM1UOb2_yHDIxD&theme=&sid=6515699529621463059&noBorder=noborder&fb=1&forcestyle=undefined&showtype=embed&uid=111111&cap_cd=-BF6yU_7cioGpNgJGSBfMDVFU_W2BtTfRrNMFl84BHVyE1fLgKJtuQ**&lang=2052&rnd=584033&rand=0.867168954944683&vsig=c01haL2nNmvtlR5Wd4LVdBEa2wO95Wz993a9Qd8yizjOFR9GqjeC5KKmZzqxLxrBl88WHggcxN-KxPeEfyM1mhTE52Ju6v7dCFOi6HyIHMt_HR3AJpRbYCPm0mY3MtN8rqx62FFy_2L6WbMnn9f8iJZoev4XvbNrVtwfT6zUM4zL5Dw7-KndrxPdg**&img_index=1

然后我們目前只能看到凹槽圖,有人會發現【Network】中還有一個地址后面index=2的圖片,其實它不是原圖,它是滑塊

 

於是大家回去【source】去找,也會發現都沒有看到原圖的地址呢?

難道沒法找到原圖的地址嗎?

其實不是的,大家可以試試把上面那么長的地址后面index=1改為index=0,你就會發現這個圖就是原圖哦!

 

 

那么接下來就是對比像素得到缺塊凹槽的位置

 

代碼如下:

    

 1   /// <summary>
 2 
 3         /// 比較兩張圖片的像素,確定陰影圖片位置
 4 
 5         /// </summary>
 6 
 7         /// <param name="oldBmp"></param>
 8 
 9         /// <param name="newBmp"></param>
10 
11         /// <returns></returns>
12 
13         public static int GetArgb(Bitmap oldBmp, Bitmap newBmp)
14 
15         {
16 
17             //由於陰影圖片四個角存在黑點(矩形1*1)
18 
19             for (int i = 0; i < newBmp.Width; i++)
20 
21             {
22 
23  
24 
25                 for (int j = 0; j < newBmp.Height; j++)
26 
27                 {
28 
29                     if ((i>=0&&i<=1)&&((j>=0&&j<=1)||(j>= (newBmp.Height-2)&&j<=(newBmp.Height - 1))))
30 
31                     {
32 
33                         continue;
34 
35                     }
36 
37                     if ((i >= (newBmp.Width-2) && i <= (newBmp.Width - 1)) && ((j >= 0 && j <= 1) || (j >= (newBmp.Height - 2) && j <= (newBmp.Height - 1))))
38 
39                     {
40 
41                         continue;
42 
43                     }
44 
45                  
46 
47                     //獲取該點的像素的RGB的顏色
48 
49                     Color oldColor = oldBmp.GetPixel(i, j);
50 
51                     Color newColor = newBmp.GetPixel(i, j);
52 
53                     if (Math.Abs(oldColor.R - newColor.R) > 60 || Math.Abs(oldColor.G - newColor.G) > 60 || Math.Abs(oldColor.B - newColor.B) > 60)
54 
55                     {
56 
57                         return i;
58 
59                     }
60 
61  
62 
63  
64 
65                 }
66 
67             }
68 
69             return 0;
70 
71         }
72 
73  

 

其中細心的同學會發現為啥比較像素點的時候,出現continue跳出的情況的呢?

     在凹槽圖的四個角,有四個黑點,如果每個單位點去判斷,會導致導致像素會0的時候跳出循環,得到的偏移量自然就是0了,所以這肯定是有問題的,那么我是把這四個角的理解成1*1的矩形塊,所以在這個塊里的像素點直接跳出,不用比較

 

那么我們計算出了偏移量,如何移動滑塊呢?

      不用急,了解Selenium就知道,它提供的有Actions這個類,下面有很多可以移動的方法

      你可以直接調用DragAndDropToOffset移動元素到一定的偏移量

      或者你可以使用ClickAndHold鼠標左鍵單擊並不松開,然后MoveByOffset移動一定的偏移量,最后Release釋放即可

 

   然后中途我遇見一些bug

     在使用PhantomJS+Selenium的時候,iframe中Actions對象所有的移動相關的方法都對元素不起任何作用,很痛苦呀,我在stackoverflow中發現很多人也都遇到這樣的情況,但是也都沒有明確的答案,最后還是放棄了PhantomJS+Selenium,選擇了Chrome+ Selenium形式進行測試,發現也還是沒有效果,於是換了其他電腦的Chrome瀏覽器試了試,發現居然可以了,可以肯定的是這個可能跟Chrome版本有關,高版本反而沒法玩,哎……,最近Selenium.Chrome.WebDriver這個組件更新到了2.35,貌似解決了這個問題

 

其實破解驗證碼是進行爬蟲系列操作的第一步也是最為關鍵的一步

 

源碼:https://github.com/0zhouquan0/QQ_LoginTest

 

效果圖:

 


免責聲明!

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



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