Pass CNKI verification code

通过知网的滑动验证码

  1. // ==UserScript==
  2. // @name Pass CNKI verification code
  3. // @namespace http://tampermonkey.net/
  4. // @version 2024-11-08
  5. // @description 通过知网的滑动验证码
  6. // @author You
  7. // @match https://kns.cnki.net/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=cnki.net
  9. // @grant none
  10. // @license MIT
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15. function bezierPath(start, end, control1, control2, steps) {
  16. const path = [];
  17. for (let t = 0; t <= 1; t += 1 / steps) {
  18. const x = (1 - t) ** 3 * start[0] +
  19. 3 * (1 - t) ** 2 * t * control1[0] +
  20. 3 * (1 - t) * t ** 2 * control2[0] +
  21. t ** 3 * end[0];
  22. const y = (1 - t) ** 3 * start[1] +
  23. 3 * (1 - t) ** 2 * t * control1[1] +
  24. 3 * (1 - t) * t ** 2 * control2[1] +
  25. t ** 3 * end[1];
  26. path.push([x + Math.random() * 2 - 1, y + Math.random() * 2 - 1]);
  27. }
  28. return path;
  29. }
  30.  
  31. function simulateSliderMovement(sliderElement, start, end) {
  32. const control1 = [start[0] + (end[0] - start[0]) / 4, start[1] - 30];
  33. const control2 = [start[0] + (end[0] - start[0]) * 3 / 4, end[1] + 30];
  34. const path = bezierPath(start, end, control1, control2, 100);
  35.  
  36. // 模拟按下
  37. sliderElement.dispatchEvent(new MouseEvent('mousedown', {
  38. clientX: start[0],
  39. clientY: start[1],
  40. bubbles: true
  41. }));
  42.  
  43. // 模拟移动
  44. path.forEach(([x, y], i) => {
  45. setTimeout(() => {
  46. sliderElement.dispatchEvent(new MouseEvent('mousemove', {
  47. clientX: x,
  48. clientY: y,
  49. bubbles: true
  50. }));
  51. }, i * 1); // 控制速度
  52. });
  53.  
  54. // 模拟释放
  55. setTimeout(() => {
  56. sliderElement.dispatchEvent(new MouseEvent('mouseup', {
  57. clientX: end[0],
  58. clientY: end[1],
  59. bubbles: true
  60. }));
  61. }, path.length * 10);
  62. }
  63.  
  64. var txt = document.querySelector('.txt').textContent;
  65. if (txt == "系统检测到您的访问行为异常,请帮助我们完成 验证"){
  66. // 用法示例
  67. const sliderElement = document.querySelector('.verify-move-block');
  68. var start_x = sliderElement.getBoundingClientRect().x;
  69. var offset = document.querySelector('.verify-gap').offsetLeft;
  70. simulateSliderMovement(sliderElement, [start_x, 0], [start_x + offset + 30, 0]);
  71. }
  72. // Your code here...
  73. })();