OBS

检测元素并点击、休眠、顺序执行、填充表单

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

  1. /**
  2. * 休眠
  3. * @param time 休眠时间,单位秒
  4. * @param desc
  5. * @returns {Promise<unknown>}
  6. */
  7. function obsSleep(time, desc = 'obsSleep') {
  8. return new Promise(resolve => {
  9. //sleep
  10. setTimeout(() => {
  11. console.log(desc, time, 's')
  12. resolve(time)
  13. }, Math.floor(Math.abs(time) * 1000))
  14. })
  15. }
  16.  
  17. /**
  18. * 监测页面地址
  19. * @param path 页面地址片段
  20. * @param time 延时,负数:延时->执行,正数:执行->延时
  21. * @param desc
  22. * @returns {Promise<unknown>}
  23. */
  24. function obsIsPage(path, time = 0, desc = 'obsHasPage') {
  25. return new Promise(resolve => {
  26. //obs page
  27. let page = setInterval(() => {
  28. if (location.href.toLowerCase().indexOf(path.toLowerCase()) > -1) {
  29. clearInterval(page)
  30. if (time < 0) {
  31. setTimeout(() => {
  32. console.log(desc, path)
  33. resolve(path)
  34. }, Math.abs(time) * 1000)
  35. } else if (time > 0) {
  36. setTimeout(() => {
  37. console.log(desc, path)
  38. resolve(path)
  39. }, Math.abs(time) * 1000)
  40. } else {
  41. console.log(desc, path)
  42. resolve(path)
  43. }
  44. } else {
  45. return
  46. }
  47. }, 100)
  48. })
  49. }
  50.  
  51. /**
  52. * 监测input节点设置内容
  53. * @param selector CSS选择器
  54. * @param text 设置的内容
  55. * @param time 延时,负数:延时->执行,正数:执行->延时
  56. * @param desc
  57. * @returns {Promise<unknown>}
  58. */
  59. function obsSetValue(selector, text, time = 0, desc = 'obsSetValue') {
  60. return new Promise(resolve => {
  61. //obs node
  62. let timer = setInterval(() => {
  63. let target = document.querySelector(selector)
  64. if (!!target) {
  65. clearInterval(timer)
  66. if (time < 0) {
  67. setTimeout(() => {
  68. target.value = text
  69. console.log(desc, text)
  70. resolve(selector)
  71. }, Math.abs(time) * 1000)
  72. } else if (time > 0) {
  73. target.value = text
  74. setTimeout(() => {
  75. console.log(desc, text)
  76. resolve(selector)
  77. }, Math.abs(time) * 1000)
  78. } else {
  79. target.value = text
  80. console.log(desc, text)
  81. resolve(selector)
  82. }
  83. } else {
  84. return
  85. }
  86. }, 100)
  87. })
  88. }
  89.  
  90. /**
  91. * 文本框是否有值,如果传入text且不为空则比较文本框的值
  92. * @param selector
  93. * @param text
  94. * @param time
  95. * @param desc
  96. * @returns {Promise<unknown>}
  97. */
  98. function obsHasValue(selector, text = '', time = 0, desc = 'obsHasValue') {
  99. return new Promise(resolve => {
  100. //obs node
  101. let timer = setInterval(() => {
  102. let target = document.querySelector(selector)
  103. if (!!target) {
  104. clearInterval(timer)
  105. if (Math.abs(time) > 0) {
  106. setTimeout(() => {
  107. console.log(desc, text)
  108. if (!!text) {
  109. if (target.value == text) {
  110. resolve(selector)
  111. }
  112. } else {
  113. if (target.value) {
  114. resolve(selector)
  115. }
  116. }
  117. }, Math.abs(time) * 1000)
  118. } else {
  119. console.log(desc, text)
  120. if (!!text) {
  121. if (target.value == text) {
  122. resolve(selector)
  123. }
  124. } else {
  125. if (target.value) {
  126. resolve(selector)
  127. }
  128. }
  129. }
  130. } else {
  131. return
  132. }
  133. }, 100)
  134. })
  135. }
  136.  
  137. /**
  138. * 监测到节点后点击
  139. * @param selector CSS选择器
  140. * @param time 延时,负数:延时->执行,正数:执行->延时
  141. * @param desc
  142. * @returns {Promise<unknown>}
  143. */
  144. function obsClick(selector, time = 0, desc = 'obsClick') {
  145. return new Promise(resolve => {
  146. //obs node
  147. let timer = setInterval(() => {
  148. let target = document.querySelector(selector)
  149. if (!!target) {
  150. clearInterval(timer)
  151. if (time < 0) {
  152. setTimeout(() => {
  153. target.click()
  154. console.log(desc, selector)
  155. resolve(selector)
  156. }, Math.abs(time) * 1000)
  157. } else if (time > 0) {
  158. target.click()
  159. setTimeout(() => {
  160. console.log(desc, selector)
  161. resolve(selector)
  162. }, Math.abs(time) * 1000)
  163. } else {
  164. target.click()
  165. console.log(desc, selector)
  166. resolve(selector)
  167. }
  168. } else {
  169. return
  170. }
  171. }, 100)
  172. })
  173. }
  174.  
  175. /**
  176. * 监测节点是否存在
  177. * @param selector CSS选择器
  178. * @param time 延时,负数:延时->执行,正数:执行->延时
  179. * @param desc
  180. * @returns {Promise<unknown>}
  181. */
  182. function obsHas(selector, time = 0, desc = 'obsHas') {
  183. return new Promise(resolve => {
  184. //obs node
  185. let timer = setInterval(() => {
  186. let target = document.querySelector(selector)
  187. if (!!target) {
  188. clearInterval(timer)
  189. if (Math.abs(time) > 0) {
  190. setTimeout(() => {
  191. console.log(desc, selector)
  192. resolve(selector)
  193. }, Math.abs(time) * 1000)
  194. } else {
  195. console.log(desc, selector)
  196. resolve(selector)
  197. }
  198. } else {
  199. return
  200. }
  201. }, 100)
  202. })
  203. }
  204.  
  205. /**
  206. * 监测节点是否存在然后执行函数
  207. * @param selector
  208. * @param func
  209. * @param time 延时,负数:延时->执行,正数:执行->延时
  210. * @param desc
  211. * @returns {Promise<unknown>}
  212. */
  213. function obsHasFunc(selector, func, time = 0, desc = 'obsHasFunc') {
  214. return new Promise(resolve => {
  215. //obs node
  216. let timer = setInterval(() => {
  217. let target = document.querySelector(selector)
  218. if (!!target) {
  219. clearInterval(timer)
  220. if (time < 0) {
  221. setTimeout(() => {
  222. if (!!func) {
  223. func()
  224. }
  225. console.log(desc, selector)
  226. resolve(selector)
  227. }, Math.abs(time) * 1000)
  228. } else if (time > 0) {
  229. if (!!func) {
  230. func()
  231. }
  232. setTimeout(() => {
  233. console.log(desc, selector)
  234. resolve(selector)
  235. }, Math.abs(time) * 1000)
  236. } else {
  237. if (!!func) {
  238. func()
  239. }
  240. console.log(desc, selector)
  241. resolve(selector)
  242. }
  243. } else {
  244. return
  245. }
  246. }, 100)
  247. })
  248. }
  249.  
  250. /**
  251. * 监测节点内容
  252. * @param selector CSS选择器
  253. * @param text 节点内容
  254. * @param time 延时,负数:延时->执行,正数:执行->延时
  255. * @param desc
  256. * @returns {Promise<unknown>}
  257. */
  258. function obsHasText(selector, text, time = 0, desc = 'obsHasText') {
  259. return new Promise(resolve => {
  260. //obs node
  261. let timer = setInterval(() => {
  262. let target = document.querySelector(selector)
  263. if (!!target && target.textContent.trim() == text) {
  264. clearInterval(timer)
  265. if (time < 0) {
  266. setTimeout(() => {
  267. console.log(desc, text)
  268. resolve(selector)
  269. }, Math.abs(time) * 1000)
  270. } else if (time > 0) {
  271. setTimeout(() => {
  272. console.log(desc, text)
  273. resolve(selector)
  274. }, Math.abs(time) * 1000)
  275. } else {
  276. console.log(desc, text)
  277. resolve(selector)
  278. }
  279. } else {
  280. return
  281. }
  282. }, 100)
  283. })
  284. }
  285.  
  286. /**
  287. * 监测节点内容点击
  288. * @param selector CSS选择器
  289. * @param text 节点内容
  290. * @param time 延时,负数:延时->执行,正数:执行->延时
  291. * @param desc
  292. * @returns {Promise<unknown>}
  293. */
  294. function obsHasTextClick(selector, text, time = 0, desc = 'text') {
  295. return new Promise(resolve => {
  296. //obs node
  297. let timer = setInterval(() => {
  298. let target = document.querySelector(selector)
  299. if (!!target && target.textContent.trim() == text) {
  300. clearInterval(timer)
  301. if (time < 0) {
  302. setTimeout(() => {
  303. target.click()
  304. console.log(desc, text)
  305. resolve(selector)
  306. }, Math.abs(time) * 1000)
  307. } else if (time > 0) {
  308. target.click()
  309. setTimeout(() => {
  310. console.log(desc, text)
  311. resolve(selector)
  312. }, Math.abs(time) * 1000)
  313. } else {
  314. target.click()
  315. console.log(desc, text)
  316. resolve(selector)
  317. }
  318. } else {
  319. return
  320. }
  321. }, 100)
  322. })
  323. }
  324.  
  325. /**
  326. * 监测节点非内容
  327. * @param selector Css选择器
  328. * @param text 节点内容
  329. * @param time 延时,负数:延时->执行,正数:执行->延时
  330. * @param desc
  331. * @returns {Promise<unknown>}
  332. */
  333. function obsNotText(selector, text, time = 0, desc = 'not text') {
  334. return new Promise(resolve => {
  335. //obs node
  336. let timer = setInterval(() => {
  337. let target = document.querySelector(selector)
  338. if (!!target) {
  339. if (target.textContent.trim() == text) {
  340. return
  341. } else {
  342. clearInterval(timer)
  343. if (time < 0) {
  344. setTimeout(() => {
  345. console.log(desc, text)
  346. resolve(selector)
  347. }, Math.abs(time) * 1000)
  348. } else if (time > 0) {
  349. setTimeout(() => {
  350. console.log(desc, text)
  351. resolve(selector)
  352. }, Math.abs(time) * 1000)
  353. } else {
  354. console.log(desc, text)
  355. resolve(selector)
  356. }
  357. }
  358. } else {
  359. return
  360. }
  361. }, 100)
  362. })
  363. }
  364.  
  365. /**
  366. * 函数返回真继续执行
  367. * @param func 函数,返回真继续执行
  368. * @param time 延时,负数:延时->执行,正数:执行->延时
  369. * @param desc
  370. * @returns {Promise<unknown>}
  371. */
  372. function obsTrueFunc(func, time = 0, desc = 'func=>true') {
  373. return new Promise(resolve => {
  374. if (!!func) {
  375. if (time < 0) {
  376. setTimeout(() => {
  377. let ret = func()
  378. if (ret) {
  379. console.log(desc, ret)
  380. resolve('func=>true')
  381. }
  382. }, Math.abs(time) * 1000)
  383. } else if (time > 0) {
  384. let ret = func()
  385. setTimeout(() => {
  386. if (ret) {
  387. console.log(desc, ret)
  388. resolve('func=>true')
  389. }
  390. }, Math.abs(time) * 1000)
  391. } else {
  392. let ret = func()
  393. if (ret) {
  394. console.log(desc, ret)
  395. resolve('func=>true')
  396. }
  397. }
  398. }
  399. })
  400. }
  401.  
  402. /**
  403. * 执行函数
  404. * @param func 函数
  405. * @param time 延时,负数:延时->执行,正数:执行->延时
  406. * @param desc
  407. * @returns {Promise<unknown>}
  408. */
  409. function obsFunc(func, time = 0, desc = 'func') {
  410. return new Promise(resolve => {
  411. if (!!func) {
  412. if (time < 0) {
  413. setTimeout(() => {
  414. func()
  415. console.log(desc)
  416. resolve('func')
  417. }, Math.abs(time) * 1000)
  418. } else if (time > 0) {
  419. func()
  420. setTimeout(() => {
  421. console.log(desc)
  422. resolve('func')
  423. }, Math.abs(time) * 1000)
  424. } else {
  425. func()
  426. console.log(desc)
  427. resolve('func')
  428. }
  429. }
  430. })
  431. }
  432.  
  433. /**
  434. * 变量为真继续执行
  435. * @param isTrue bool变量
  436. * @param time 延时,负数:延时->执行,正数:执行->延时
  437. * @param desc
  438. * @returns {Promise<unknown>}
  439. */
  440. function obsTrue(isTrue, time = 0, desc = 'true') {
  441. return new Promise(resolve => {
  442. if (!!isTrue) {
  443. if (time < 0) {
  444. setTimeout(() => {
  445. console.log(desc, isTrue);
  446. resolve(isTrue)
  447. }, Math.abs(time) * 1000)
  448. } else if (time > 0) {
  449. setTimeout(() => {
  450. console.log(desc, isTrue);
  451. resolve(isTrue)
  452. }, Math.abs(time) * 1000)
  453. } else {
  454. console.log(desc, isTrue);
  455. resolve(isTrue)
  456. }
  457. }
  458. })
  459. }
  460.  
  461. /**
  462. * 随机字符串
  463. * @param e 长度
  464. * @returns {string}
  465. */
  466. function randStr(e = 12) {
  467. e = e || 32;
  468. // let t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",
  469. let t = "abcdefghijkmnprstwxyz",
  470. a = t.length,
  471. n = "";
  472. for (let i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a));
  473. return n
  474. }
  475.  
  476. /**
  477. * 随机数字
  478. * @param e 长度
  479. * @returns {string}
  480. */
  481. function randNum(e = 12) {
  482. e = e || 32;
  483. // let t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",
  484. let t = "123456789",
  485. a = t.length,
  486. n = "";
  487. for (let i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a));
  488. return n
  489. }
  490.  
  491. /**
  492. * 获取当前URL地址参数
  493. * @param name 参数名称
  494. * @returns {string|null}
  495. */
  496. function getUrlParam(name) {
  497. let reg = new RegExp("(.|&)" + name + "=([^&]*)(&|$)");
  498. let r = window.location.href.match(reg);
  499. if (r != null) return unescape(r[2]);
  500. return null;
  501. }
  502.  
  503. /**
  504. * 加载style样式
  505. * @param style style标签内容
  506. */
  507. function addStyleEle(style = '') {
  508. let css = document.createElement('style')
  509. css.innerHTML = style
  510. document.body.append(css)
  511. }
  512.  
  513. /**
  514. * 加载css文件
  515. * @param url css文件地址
  516. */
  517. function loadCssFile(url) {
  518. let head = document.getElementsByTagName('head')[0];
  519. let link = document.createElement('link');
  520. link.type = 'text/css';
  521. link.rel = 'stylesheet';
  522. link.href = url;
  523. head.appendChild(link);
  524. }
  525.  
  526. /**
  527. * 加载js代码
  528. * @param code
  529. */
  530. function addScriptEle(code) {
  531. let script = document.createElement("script");
  532. script.type = "text/javascript";
  533. try {
  534. // firefox、safari、chrome和Opera
  535. script.appendChild(document.createTextNode(code));
  536. } catch (ex) {
  537. // IE早期的浏览器 ,需要使用script的text属性来指定javascript代码。
  538. script.text = code;
  539. }
  540. document.getElementsByTagName("head")[0].appendChild(script);
  541. }
  542.  
  543. /**
  544. * 加载js文件
  545. * @param url js文件路径
  546. * @param callback 加载成功后执行的回调函数
  547. */
  548. function loadJsFile(url, callback) {
  549. let head = document.getElementsByTagName('head')[0];
  550. let script = document.createElement('script');
  551. script.type = 'text/javascript';
  552. script.src = url;
  553. if (typeof (callback) == 'function') {
  554. script.onload = script.onreadystatechange = function () {
  555. if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") {
  556. callback();
  557. script.onload = script.onreadystatechange = null;
  558. }
  559. };
  560. }
  561. head.appendChild(script);
  562. }
  563.  
  564. /**
  565. * 向页面中添加div
  566. * @param className 类名
  567. * @param innerHtml 内容
  568. * @param clickFunc 点击事件函数
  569. * @returns {HTMLDivElement}
  570. */
  571. function addDivEle(className = '', innerHtml = '', clickFunc = false, parentSelector = '') {
  572. // console.log('addDivEle.className', className)
  573. let div = document.createElement('div')
  574. div.className = className
  575. div.innerHTML = innerHtml
  576. if (typeof clickFunc == 'function') {
  577. div.onclick = clickFunc
  578. }
  579. // console.log('addDivEle.parentSelector', parentSelector)
  580. if (parentSelector.length > 0) {
  581. document.querySelector(parentSelector).append(div)
  582. } else {
  583. document.body.append(div)
  584. }
  585. return div
  586. }
  587.  
  588. /**
  589. * 添加工具按钮
  590. * @param className 按钮类名
  591. * @param innerHtml 按钮内容
  592. * @param clickFunc 按钮点击事件
  593. * @param param {}
  594. */
  595. function addToolBtn(className = '', innerHtml = '', clickFunc = false, param = {}) {
  596. let defaultParam = {
  597. yAlign: 'bottom',
  598. xAlign: 'left',
  599. boxSelector: '.monkeyToolBtnBox',
  600. btnSelector: '.monkeyToolBtn',
  601. //自定义盒子样式
  602. boxCss: '',
  603. //自定义按钮样式
  604. btnCss: '',
  605. }
  606. param = Object.assign({}, defaultParam, param)
  607.  
  608. if (param.boxSelector && document.querySelector(param.boxSelector) == null) {
  609. addDivEle(param.boxSelector.replaceAll('\\.', ' '))
  610. // return;
  611. addStyleEle(`
  612. ${param.boxSelector} {
  613. position: fixed;
  614. bottom: 0;
  615. left: 0;
  616. display: flex;
  617. flex-direction: column;
  618. justify-content: center;
  619. align-items: flex-start;
  620. ${param.yAlign == 'top' ? 'top:0;bottom:auto;' : 'top:auto;bottom:0;'}
  621. ${param.xAlign == 'left' ? 'left:0;right:auto;' : 'left:auto;right:0;align-items: flex-end;'}
  622. line-height: 1;
  623. cursor: pointer;
  624. z-index: 999999;
  625. font-size: 15px;
  626. ${param.boxCss}
  627. }
  628. ${param.btnSelector} {
  629. border: 2px solid red;
  630. color: red;
  631. padding: 5px 10px;
  632. background: white;
  633. font-size: 15px;
  634. ${param.btnCss}
  635. }
  636. `)
  637. }
  638. addStyleEle(`
  639. ${param.btnSelector}.${className} {
  640. cursor: pointer;
  641. ${param.btnCss}
  642. }
  643. `)
  644. addDivEle(`${param.btnSelector.replaceAll('\\.', ' ')} ${className}`, innerHtml, clickFunc, param.boxSelector)
  645. }
  646.  
  647. /**
  648. * 移除iframe页面元素,用于wifi劫持和去除iframe广告
  649. */
  650. function removeIframe() {
  651. let filter = new Object();
  652. filter.ad = function () {
  653. let tar = document.getElementsByTagName('iframe');
  654. let len = tar.length;
  655. if (len > 0) {
  656. for (let i = 0; i < len; i++) {
  657. tar[0].remove()
  658. }
  659. }
  660. }
  661. filter.timer = function () {
  662. let clean = setInterval(function () {
  663. if (document.getElementsByTagName('iframe').length == 0) {
  664. clearInterval(clean)
  665. console.log('清除')
  666. } else {
  667. filter.ad()
  668. }
  669. }, 300)
  670. }
  671. filter.timer()
  672. }
  673.  
  674. /**
  675. * 时间格式化
  676. * @param fmt 格式,yyyy-MM-dd hh:mm:ss.S
  677. * @returns {*} 时间字符串,2006-07-02 08:09:04.423
  678. * @constructor
  679. */
  680. Date.prototype.format = function (fmt) { //author: meizz
  681. let o = {
  682. "M+": this.getMonth() + 1, //月份
  683. "d+": this.getDate(), //日
  684. "h+": this.getHours(), //小时
  685. "m+": this.getMinutes(), //分
  686. "s+": this.getSeconds(), //秒
  687. "q+": Math.floor((this.getMonth() + 3) / 3), //季度
  688. "S": this.getMilliseconds() //毫秒
  689. };
  690. if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  691. for (let k in o)
  692. if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  693. return fmt;
  694. }
  695.  
  696. /**
  697. * 替换全部匹配到的内容
  698. * @param FindText 需要查找的字符串
  699. * @param RepText 将要替换的字符串
  700. * @returns {string}
  701. */
  702. String.prototype.replaceAll = function (FindText, RepText) {
  703. let regExp = new RegExp(FindText, "g");
  704. return this.replace(regExp, RepText);
  705. }
  706.  
  707. /**
  708. * 随机获取一个元素
  709. * @returns {*}
  710. */
  711. Array.prototype.sample = function () {
  712. return this[Math.floor(Math.random() * this.length)]
  713. }

QingJ © 2025

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