Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.20 KB | None | 0 0
  1. //在浏览器console中执行
  2. function load_geetest_img(slices){
  3. return new Promise((resolve, reject)=>{
  4. var img = new Image();
  5. img.crossOrigin = "Anonymous";
  6. img.onload = ()=>{resolve(img)};
  7. img.src = slices[0].style.backgroundImage.slice(4, -1);
  8. });
  9. }
  10.  
  11. var restore_image = function(img, slices){
  12. // 在canvas中画出图片
  13. var canvas = document.createElement("canvas");
  14. // canvas.setAttribute("id", "crack_geetest");
  15. var context = canvas.getContext('2d');
  16. var upper_offset = 0;
  17. var down_offset = 0;
  18. for(var background_image of slices){
  19. var x = Math.abs(parseInt(background_image.style.backgroundPositionX.slice(0,-2)));
  20. var y = parseInt(background_image.style.backgroundPositionY.slice(0,-2));
  21. if(y == -58){
  22. // 上部分 Image
  23. context.drawImage(img, x, 58, 10, 58, upper_offset, 0, 10, 58);
  24. upper_offset += 10;
  25. }else{
  26. // 下部分 Image
  27. context.drawImage(img, x, 0, 10, 58, down_offset, 58, 10, 58);
  28. down_offset += 10;
  29. }
  30. }
  31. return canvas;
  32. }
  33.  
  34.  
  35. var take_background_image = function(){
  36. var slices1 = document.querySelectorAll(".gt_cut_bg_slice");//缺一块的
  37. var slices2 = document.querySelectorAll(".gt_cut_fullbg_slice");//完整的
  38. return Promise.all([
  39. load_geetest_img(slices1),
  40. load_geetest_img(slices2)
  41. ])
  42. .then((imgs)=>{
  43. return [restore_image(imgs[0], slices1), restore_image(imgs[1], slices2)]
  44. });
  45. }
  46.  
  47.  
  48. var is_similar = function(img1, img2, w, h){
  49. var pixel1 = img1.getContext('2d').getImageData(w, h, 1, 1).data;
  50. var pixel2 = img2.getContext('2d').getImageData(w, h, 1, 1).data;
  51. for (var i=0;i < 3; i++){
  52. if (Math.abs(pixel1[i] - pixel2[i]) >= 50){
  53. return false;
  54. }
  55. }
  56. return true;
  57. }
  58.  
  59. var loc_diff = function(img1, img2){
  60. console.log(`loc_diff: ${img1.width}, ${img1.height}`);
  61. for(var i = 0; i < img1.width; i++){
  62. for(var j = 0; j < img1.height; j++){
  63. if(!is_similar(img1, img2, i, j)){
  64. return i;
  65. }
  66. }
  67. }
  68. return null;
  69. }
  70.  
  71. var get_track = function(offset){
  72. var ret = [];
  73. var x = Math.floor(Math.random()*3)+1;
  74. var off = 0;
  75. while(offset - x >= 5){
  76. off += x;
  77. ret.push(off);
  78. offset -= x;
  79. x = Math.floor(Math.random()*3)+1;
  80. }
  81. for(var i = 0; i < offset; i++){
  82. off += 1;
  83. ret.push(off);
  84. }
  85. return ret;
  86. }
  87.  
  88. var get_start_position = function(){
  89. var knob = document.querySelector(".gt_slider_knob");
  90. var rect = knob.getBoundingClientRect();
  91. return [rect.left + rect.width/2, rect.top + rect.height/2];
  92. }
  93.  
  94. window.crack_finished = false;
  95. function crack_events(){
  96. return take_background_image().then((canvases)=>{
  97. var [img1, img2] = canvases;
  98. var offset = loc_diff(img1, img2);
  99. var track = get_track(offset - 5);
  100. console.log("track", track);
  101. var position = get_start_position();
  102. var mousedown = ["mousedown", position[0], position[1]];
  103. var mousemove = track.map((e)=>{return ["mousemove", position[0] + e, position[1]]});
  104. var mouseup = ["mouseup", position[0] + track[track.length-1], position[1]];
  105. mousemove.unshift(mousedown);
  106. mousemove.push(mouseup);
  107. return mousemove;
  108. });
  109. }
  110.  
  111. function mouse_event(type, x, y){
  112. console.log(`trigger ${type} on ${x}, ${y}`)
  113. var knob = document.querySelector(".gt_slider_knob")
  114. var event = document.createEvent('MouseEvent');
  115. event.initMouseEvent(type, true, false, window, 0, 0, 0, x, y/*坐标*/,false, false, false, false, 0, null);
  116. knob.dispatchEvent(event);
  117. }
  118.  
  119. function dispatch_events(events){
  120. if (events.length === 0){
  121. window.crack_finished = true;
  122. return null;
  123. }
  124. var [type, x, y] = events.shift();
  125. var rand = (Math.random(40)+10)/100;
  126.  
  127. mouse_event(type, x, y);
  128. return new Promise((resolve, reject)=>{
  129. setTimeout(
  130. ()=>{
  131. dispatch_events(events)
  132. }, rand
  133. );
  134. });
  135. }
  136. crack_events().then((events)=>{
  137. console.log("events", events);
  138. return dispatch_events(events);
  139. }).catch((e)=>{console.log("Exception", e)});
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement