Uni_Auto sign

打开网页后自动或半自动完成签到,避免重复劳动。

当前为 2023-11-22 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Uni_Auto sign
  3. // @name:zh-CN 通用_自动签到
  4. // @name:en-US Uni_Auto sign
  5. // @description 打开网页后自动或半自动完成签到,避免重复劳动。
  6. // @version 4.0.0
  7. // @author LiuliPack
  8. // @license WTFPL
  9. // @namespace https://gitlab.com/LiuliPack/UserScript
  10. // @match *://*/*
  11. // @grant GM_addStyle
  12. // @grant GM_registerMenuCommand
  13. // @grant window.close
  14. // @supportURL https://gitlab.com/liulipack/UserScript
  15. // @run-at document-body
  16. // ==/UserScript==
  17.  
  18. /* 配置示范 / Config demo
  19. {
  20. "remark": "通用 - 简述使用得扩展、主题或相似点",
  21. "remark": "通用(已知适配站点、已知适配站点、) - 简述使用得扩展、主题或相似点",
  22. "remark": "站点名",
  23. "remark": "站点名 - 子项",
  24. "link": /链接-正则匹配/,
  25. "link": "链接-网址匹配",
  26. "close": false, // 签到完成后是否关闭页面
  27. "menu": {
  28. "open": true,
  29. "links": [
  30. {
  31. "enable": true, // 是否启用
  32. "remark": "站点名",
  33. "link": "链接"
  34. }
  35. ]
  36. },
  37. "check": {
  38. "mode": "ele 元素存在、text 元素内文本、attr 元素属性",
  39. "ele": "",
  40. "data": "", // 元素内文本
  41. "data": { // 元素属性
  42. "key": "",
  43. "value": ""
  44. }
  45. },
  46. "sign": [
  47. {
  48. "remark": "点击元素",
  49. "mode": "clicker",
  50. "ele": "元素定位符",
  51. "delay": 0
  52. },
  53. {
  54. "remark": "写入文本",
  55. "mode": "writer",
  56. "ele": "元素定位符",
  57. "text": "",
  58. "delay": 0
  59. },
  60. {
  61. "remark": "自定义脚本",
  62. "mode": "scripter",
  63. "ele": () => {
  64. // 脚本写在这
  65. },
  66. "delay": 0
  67. },
  68. {
  69. "remark": "关闭页面",
  70. "mode": "closeer",
  71. "delay": 0
  72. }
  73. ]
  74. }
  75. */
  76.  
  77. (function() {
  78. 'use strict';
  79.  
  80. // 定义配置( config )和快捷元素定位器( $(元素定位符) )变量和侦测元素初现( observer(元素定位符).then(() => { /*代码写在这*/ }) )和页面关闭者( closeer(页面关闭配置) )函数。
  81. let config = [
  82. { "remark": "通用(Anime 字幕论坛、NeoACG) - Discuz DSU 每日签到插件", "link": /dsu_paulsign-sign.html$|plugin.php?id=dsu_paulsign:sign$/, "close": true, "menu": { "open": true, "links": [ { "enable": true, "remark": "Anime 字幕论坛", "link": "https://bbs.acgrip.com/dsu_paulsign-sign.html" }, { "enable": true, "remark": "NeoACG", "link": "https://neoacg.com/dsu_paulsign-sign.html" } ] }, "check": { "mode": "ele", "ele": "#yl" }, "sign": [ { "remark": "选择心情", "mode": "clicker", "ele": "#yl", "delay": 0 }, { "remark": "勾选不填写留言", "mode": "clicker", "ele": "#qiandao > table.tfm > tbody > tr:nth-child(1) > td > label:nth-child(3) > input[type=radio]", "delay": 0 }, { "remark": "签到执行", "mode": "clicker", "ele": "#shuai_menu + table .tac a", "delay": 0 }, { "remark": "Anime 字幕论坛专有 - 浏览「Discuz 任务」页", "mode": "script", "data": () => { /*如果页面匹配就打开「Discuz 任务」页*/ if (URL.search(/https:\/\/bbs.acgrip.com/) !== -1) { window.open("/home.php?mod=task", "_self"); } }, "delay": 2500 }, { "remark": "关闭页面", "mode": "closeer", "delay": 5000 } ] },
  83. { "remark": "萌幻之乡、芯幻 - WordPress INN AO 主题", "link": /https:\/\/(www.hmoeh.com|xhcyra.com)\/author\/\d+/, "close": true, "menu": { "open": true, "links": [ { "enable": true, "remark": "萌幻之乡", "link": "https://www.hmoeh.com/author/143569" }, { "enable": true, "remark": "芯幻", "link": "https://xhcyra.com/author/1000001" } ] }, "check": { "mode": "attr", "ele": "#inn-nav__point-sign-daily a", "data": { "key": "title", "value": "签到" } }, "sign": [ { "remark": "签到执行", "mode": "clicker", "ele": "#inn-nav__point-sign-daily a", "delay": 0 } ] },
  84. { "remark": "Anime 字幕论坛 - Discuz 任务", "link": "https://bbs.acgrip.com/home.php?mod=task", "menu": { "open": true }, "check": { "mode": "ele", "ele": "#ct a[href='home.php?mod=task&do=apply&id=1']" }, "sign": [ { "remark": "签到执行", "mode": "clicker", "ele": "#ct a[href='home.php?mod=task&do=apply&id=1']", "delay": 0 } ] },
  85. { "remark": "2DFun", "link": "https://2dfan.com/", "close": false, "menu": { "open": true }, "check": { "mode": "ele", "ele": "#do_checkin" }, "sign": [ { "remark": "签到执行", "mode": "clicker", "ele": "#do_checkin" } ] },
  86. { "remark": "南+ - 申请任务", "link": "https://www.south-plus.net/plugin.php?H_name-tasks.html.html", "close": true, "menu": { "open": true }, "check": { "mode": "ele", "ele": "#p_15 a" }, "sign": [ { "remark": "申请任务「日常」", "mode": "clicker", "ele": "#p_15 a", "delay": 0 }, { "remark": "申请任务「周常」", "mode": "clicker", "ele": "#p_14 a", "delay": 0 }, { "remark": "前往「完成任务」页", "mode": "clicker", "ele": "tr.tr3:nth-child(3) td a", "delay": 2500 } ] },
  87. { "remark": "南+ - 完成任务", "link": "https://www.south-plus.net/plugin.php?H_name-tasks-actions-newtasks.html.html", "close": true, "menu": { "open": false }, "check": { "mode": "ele", "ele": "#both_15 a" }, "sign": [ { "remark": "完成任务「日常」", "mode": "clicker", "ele": "#both_15 a", "delay": 0 }, { "remark": "完成任务「周常」", "mode": "clicker", "ele": "#both_14 a", "delay": 0 }, { "remark": "关闭页面", "mode": "closeer", "delay": 2500 } ] },
  88. { "remark": "绯月", "link": "https://bbs.kfpromax.com/kf_growup.php", "menu": { "open": true }, "check": { "mode": "ele", "ele": ".gro_divhui:nth-child(5) + div a:not(a[href='javascript:;'])" }, "sign": [ { "remark": "签到执行", "mode": "clicker", "ele": ".gro_divhui:nth-child(5) + div a", "delay": 0 }, { "remark": "关闭页面", "mode": "closeer", "delay": 2500 } ] },
  89. { "remark": "绅士仓库", "link": "https://cangku.moe/", "close": false, "menu": { "open": true }, "check": { "mode": "text", "ele": ".auth-info .footer li:nth-child(2) a", "data": "签到" }, "sign": [ { "remark": "签到执行", "mode": "clicker", "ele": ".auth-info .footer li:nth-child(2) a", "delay": 0 } ] },
  90. { "remark": "紳士の庭", "link": "https://gmgard.moe/", "close": false, "menu": { "open": true }, "check": { "mode": "text", "ele": "#checkw", "data": "点此签到" }, "sign": [ { "remark": "签到执行", "mode": "clicker", "ele": "#checkin", "delay": 0 } ] },
  91. ],
  92. $ = (ele) => document.querySelector(ele),
  93. URL = location.href;
  94.  
  95. function observer(ele) {
  96. return new Promise(resolve => {
  97. if ($(ele)) {
  98. return resolve($(ele));
  99. }
  100.  
  101. const observer = new MutationObserver(mutations => {
  102. if ($(ele)) {
  103. observer.disconnect();
  104. resolve($(ele));
  105. }
  106. });
  107.  
  108. observer.observe(document.body, {
  109. childList: true,
  110. subtree: true
  111. });
  112. });
  113. }
  114. function closeer(data) {
  115. // 如果配置得「关闭页面」启用就等待20秒然后关闭页面
  116. if(data) {
  117. setTimeout(() => {
  118. window.close();
  119. }, 20000)
  120. }
  121. }
  122.  
  123. // 遍历配置
  124. config.forEach(datas => {
  125. // 如果链接匹配
  126. if(typeof(datas.link) === "object" && URL.search(datas.link) !== -1 || typeof(datas.link) === "string" && datas.link === URL) {
  127. // 等待元素初现
  128. observer(datas.check.ele).then(ele => {
  129. // 如果没有签到
  130. if(datas.check.mode === "ele" || datas.check.mode === "text" && ele.textContent === datas.check.data || datas.check.mode === "attr" && ele.getAttribute(datas.check.data.key) === datas.check.data.value) {
  131. // 遍历签到步骤
  132. datas.sign.forEach(data => {
  133. // 签到执行
  134. if(data.mode === "clicker" && $(data.ele)) {
  135. $(data.ele).click();
  136. }else if(data.mode === "writer" && $(data.ele)) {
  137. $(data.ele).value = data.text;
  138. }else if(data.mode === "scripter") {
  139. data.data()
  140. }else if(data.mode === "closeer") {
  141. closeer(datas.close);
  142. }
  143. })
  144. // 执行「页面关闭者」函数
  145. closeer(datas.close);
  146. }
  147. });
  148. // 执行「页面关闭者」函数
  149. closeer(datas.close);
  150. }
  151. });
  152.  
  153. // 创建「打开签到页」菜单命令
  154. GM_registerMenuCommand("打开签到页", () => {
  155. // 遍历「配置」变量
  156. config.forEach(data => {
  157. // 更具「配置」打开「签到页」
  158. if(data.menu.open && typeof(data.link) === "string") {
  159. window.open(data.link);
  160. }else if(data.menu.open && typeof(data.menu.links) !== "typeof") {
  161. data.menu.links.forEach(data => {
  162. if(data.enable) {
  163. window.open(data.link);
  164. }
  165. })
  166. }
  167. })
  168. })
  169.  
  170. })();