FBase Lib

Base library

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/461948/1361801/FBase%20Lib.js

  1. // ==UserScript==
  2. // @name FBase Lib
  3. // @description Base library
  4. // @version 0.0.12
  5. // ==/UserScript==
  6. const FOUR_MINUTES = 4 * 60 * 1000;
  7. const wait = (msMin, msMax) => new Promise(resolve => setTimeout(resolve, msMin && msMax && rndInt(msMin, msMax) || msMin || 3000));
  8. const rndInt = (min, max) => Math.floor(Math.random() * (max - min + 1) + min);
  9.  
  10. Element.prototype.isVisible = function() {
  11. return !!(this.offsetWidth||this.offsetHeight||this.getClientRects().length);
  12. };
  13. Element.prototype.isUserFriendly = function(selector) {
  14. let e = selector ? this.querySelector(selector) : this;
  15. return e && e.isVisible() ? e : null;
  16. };
  17. Document.prototype.isUserFriendly = Element.prototype.isUserFriendly;
  18.  
  19. async function triggerClick(elm, x =0, y = 0) {
  20. if (!elm) return;
  21. elm.dispatchEvent(new MouseEvent('mouseover'));
  22. await wait(100, 300);
  23. elm.dispatchEvent(new MouseEvent('mousedown'));
  24. await wait(100, 300);
  25. elm.dispatchEvent(new MouseEvent('mouseup'));
  26. await wait(100, 300);
  27. elm.dispatchEvent(new MouseEvent('click'));
  28. };
  29. function typer(inputElm, value) {
  30. let lastValue = inputElm.value;
  31. inputElm.value = value;
  32. let event = new Event('input', { bubbles: true });
  33. event.simulated = true;
  34. let tracker = inputElm._valueTracker;
  35. if (tracker) {
  36. tracker.setValue(lastValue);
  37. }
  38. inputElm.dispatchEvent(event);
  39. }
  40.  
  41. class CrawlerWidget {
  42. constructor(params) {
  43. if (!params || (!params.selector && !params.fnSelector)) {
  44. throw new Error('CrawlerWidget requires a selector or a function selector parameter');
  45. }
  46. this.context = this.context || document;
  47. Object.assign(this, params);
  48. }
  49.  
  50. get isUserFriendly() {
  51. if (this.selector) {
  52. this.element = this.context.isUserFriendly(this.selector);
  53. return this.element;
  54. } else {
  55. this.element = this.fnSelector();
  56. return this.element;
  57. }
  58. }
  59. }
  60.  
  61. class CaptchaWidget extends CrawlerWidget {
  62. constructor(params) {
  63. super(params);
  64. }
  65.  
  66. solve() { return true; }
  67.  
  68. async isSolved() { return false; }
  69. }
  70.  
  71. class HCaptchaWidget extends CaptchaWidget {
  72. constructor(params) {
  73. let defaultParams = {
  74. selector: '.h-captcha > iframe',
  75. waitMs: [1000, 5000],
  76. timeoutMs: FOUR_MINUTES
  77. };
  78. for (let p in params) {
  79. defaultParams[p] = params[p];
  80. }
  81. super(defaultParams);
  82. }
  83.  
  84. async isSolved() {
  85. return wait().then( () => {
  86. if (this.isUserFriendly && this.element.hasAttribute('data-hcaptcha-response') && this.element.getAttribute('data-hcaptcha-response').length > 0) {
  87. return Promise.resolve(true);
  88. }
  89. return this.isSolved();
  90. });
  91. }
  92. }
  93.  
  94. class RecaptchaWidget extends CaptchaWidget {
  95. constructor(params) {
  96. let defaultParams = {
  97. selector: function() { return grecaptcha },
  98. waitMs: [1000, 5000],
  99. timeoutMs: 4 * 60 * 1000
  100. };
  101. for (let p in params) {
  102. defaultParams[p] = params[p];
  103. }
  104. super(defaultParams);
  105. }
  106.  
  107. get isUserFriendly() {
  108. try {
  109. this.element = grecaptcha;
  110. return this.element;
  111. } catch(err) { return false; }
  112. }
  113.  
  114. isInvisible() {
  115. let frames = [...document.querySelectorAll('iframe')];
  116. let anchor = frames.filter(x => x.src.toLowerCase().includes('/recaptcha/api2/anchor'));
  117. anchor = anchor.length > 0 ? anchor[0] : false;
  118. let bframe = frames.filter(x => x.src.toLowerCase().includes('/recaptcha/api2/bframe'));
  119. bframe = bframe.length > 0 ? bframe[0] : false;
  120. let isInvisibleAnchor = anchor && anchor.src.toLowerCase().includes('size=invisible');
  121. return !(anchor && !isInvisibleAnchor);
  122. }
  123.  
  124. async isSolved() {
  125. return wait().then( () => {
  126. try {
  127. if (this.isUserFriendly) {
  128. if (this.isInvisible()) {
  129. return Promise.resolve(true);
  130. }
  131. if(this.element.hasOwnProperty('getPageId') && this.element.getPageId() && this.element.hasOwnProperty('getResponse') && (typeof(this.element.getResponse) == 'function')
  132. && this.element.getResponse().length > 0) {
  133. return Promise.resolve(true);
  134. }
  135. }
  136. } catch (err) {}
  137. return this.isSolved();
  138. });
  139. }
  140. }
  141.  
  142. class OuoSolver {
  143. constructor() {
  144. this.btnImHuman;
  145. }
  146.  
  147. async doClick() {
  148. this.btnImHuman = document.querySelector('#btn-main:not(.disabled)');
  149. if (!this.btnImHuman) {
  150. await wait(1000, 3000);
  151. return this.doClick();
  152. }
  153. this.btnImHuman.click();
  154. }
  155.  
  156. async start() {
  157. return this.doClick();
  158. }
  159. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址