pass_water_wall.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package common
  2. import (
  3. "bytes"
  4. "fmt"
  5. "github.com/nfnt/resize"
  6. "image/jpeg"
  7. "math"
  8. "strings"
  9. "time"
  10. )
  11. // SimulationTest 模拟滑动过防水墙
  12. func SimulationTest() {
  13. // 具体的应用见 subhd 的解析器
  14. // 感谢 https://www.bigs3.com/article/gorod-crack-slider-captcha/
  15. page, err := NewBrowserLoadPage("https://007.qq.com/online.html", "", 10*time.Second, 5)
  16. if err != nil {
  17. println(err.Error())
  18. return
  19. }
  20. // 切换到可疑用户
  21. page.MustElement("#app > section.wp-on-online > div > div > div > div.wp-on-box.col-md-5.col-md-offset-1 > div.wp-onb-tit > a:nth-child(2)").MustClick()
  22. //模擬Click點擊 "體驗驗證碼" 按鈕
  23. page.MustElement("#code").MustClick()
  24. //等待驗證碼窗體載入
  25. page.MustElement("#tcaptcha_iframe").MustWaitLoad()
  26. //進入到iframe
  27. iframe := page.MustElement("#tcaptcha_iframe").MustFrame()
  28. //等待拖動條加載, 延遲500秒檢測變化, 以確認加載完畢
  29. iframe.MustElement("#tcaptcha_drag_button").WaitStable(500 * time.Millisecond)
  30. //等待缺口圖像載入
  31. iframe.MustElement("#slideBg").MustWaitLoad()
  32. //取得帶缺口圖像
  33. shadowbg := iframe.MustElement("#slideBg").MustResource()
  34. //取得原始圖像
  35. src := iframe.MustElement("#slideBg").MustProperty("src")
  36. fullbg, fileName, err := DownFile(strings.Replace(src.String(), "img_index=1", "img_index=0", 1))
  37. if err != nil {
  38. return
  39. }
  40. println(fileName)
  41. //取得img展示的真實尺寸
  42. bgbox := iframe.MustElement("#slideBg").MustShape().Box()
  43. height, width := uint(math.Round(bgbox.Height)), uint(math.Round(bgbox.Width))
  44. //裁剪圖像
  45. shadowbg_img, _ := jpeg.Decode(bytes.NewReader(shadowbg))
  46. shadowbg_img = resize.Resize(width, height, shadowbg_img, resize.Lanczos3)
  47. fullbg_img, _ := jpeg.Decode(bytes.NewReader(fullbg))
  48. fullbg_img = resize.Resize(width, height, fullbg_img, resize.Lanczos3)
  49. //啓始left,排除干擾部份,所以右移10個像素
  50. left := fullbg_img.Bounds().Min.X + 10
  51. //啓始top, 排除干擾部份, 所以下移10個像素
  52. top := fullbg_img.Bounds().Min.Y + 10
  53. //最大left, 排除干擾部份, 所以左移10個像素
  54. maxleft := fullbg_img.Bounds().Max.X - 10
  55. //最大top, 排除干擾部份, 所以上移10個像素
  56. maxtop := fullbg_img.Bounds().Max.Y - 10
  57. //rgb比较阈值, 超出此阈值及代表找到缺口位置
  58. threshold := 20
  59. //缺口偏移, 拖動按鈕初始會偏移27.5
  60. distance := -27.5
  61. //取絕對值方法
  62. abs := func(n int) int {
  63. if n < 0 {
  64. return -n
  65. }
  66. return n
  67. }
  68. search:
  69. for i := left; i <= maxleft; i++ {
  70. for j := top; j <= maxtop; j++ {
  71. color_a_R, color_a_G, color_a_B, _ := fullbg_img.At(i, j).RGBA()
  72. color_b_R, color_b_G, color_b_B, _ := shadowbg_img.At(i, j).RGBA()
  73. color_a_R, color_a_G, color_a_B = color_a_R >> 8, color_a_G >> 8, color_a_B >> 8
  74. color_b_R, color_b_G, color_b_B = color_b_R >> 8, color_b_G >> 8, color_b_B >> 8
  75. if abs(int(color_a_R) - int(color_b_R)) > threshold ||
  76. abs(int(color_a_G) - int(color_b_G)) > threshold ||
  77. abs(int(color_a_B) - int(color_b_B)) > threshold {
  78. distance += float64(i)
  79. fmt.Printf("info: 對比完畢, 偏移量: %v\n", distance)
  80. break search
  81. }
  82. }
  83. }
  84. //獲取拖動按鈕形狀
  85. dragbtnbox := iframe.MustElement("#tcaptcha_drag_thumb").MustShape().Box()
  86. //启用滑鼠功能
  87. mouse := page.Mouse
  88. //模擬滑鼠移動至拖動按鈕處, 右移3的原因: 拖動按鈕比滑塊圖大3個像素
  89. mouse.MustMove(dragbtnbox.X + 3, dragbtnbox.Y + (dragbtnbox.Height / 2))
  90. //按下滑鼠左鍵
  91. mouse.MustDown("left")
  92. //開始拖動
  93. mouse.Move(dragbtnbox.X + distance, dragbtnbox.Y + (dragbtnbox.Height / 2), 20)
  94. //鬆開滑鼠左鍵, 拖动完毕
  95. mouse.MustUp("left")
  96. //截圖保存
  97. page.MustScreenshot("result.png")
  98. }