通用_自动签到

自动或半自动地签到。

当前为 2023-06-21 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name 通用_自动签到
  3. // @name:zh-CN 通用_自动签到
  4. // @name:en-US Uni_Auto sign
  5. // @description 自动或半自动地签到。
  6. // @version 3.0.0
  7. // @author LiuliPack
  8. // @license WTFPL
  9. // @namespace https://gitlab.com/LiuliPack/UserScript
  10. // @match *://*/*
  11. // @supportURL https://gitlab.com/liulipack/UserScript
  12. // @grant GM_registerMenuCommand
  13. // @run-at document-idle
  14. // ==/UserScript==
  15.  
  16. /* 参数示范 / Config demo
  17. {
  18. "remark": "备注",
  19. "url": "网址",
  20. "check": {
  21. "mode": ["0:元素属性", "1:元素文本", "2:元素存在"],
  22. "element": "元素选择器",
  23. "data": ["元素文本或元素属性键", "元素属性值"]
  24. },
  25. "sign": [
  26. {
  27. "remark": "备注",
  28. "data": "元素选择器",
  29. "data": () => { // 自定义脚本 },
  30. "delay": "0",
  31. "last": ["false:不是最后一步", "true:是最后一步"]
  32. }
  33. ],
  34. "refresh": "刷新页面",
  35. "close": "关闭页面"
  36. },
  37. {
  38. "remark": "Remarks",
  39. "url": "URL",
  40. "check": {
  41. "mode": ["0:Element Properties", "1:Element Text", "2:Element Existence"],
  42. "element": "Element Selector",
  43. "data": ["Element text or element attribute key", "Element attribute value"]
  44. },
  45. "sign": [
  46. {
  47. "remark": "Remarks",
  48. "data": "Element Selector",
  49. "data": () => { // Custom Script },
  50. "delay": "0",
  51. "last": ["false: Not the last step", "true: Is the last step"]
  52. }
  53. ],
  54. "refresh": "Refresh page",
  55. "close": "Close page"
  56. }
  57. */
  58.  
  59. 'use strict';
  60.  
  61. // 定义参数(config)和网页链接(URL)变量;快捷元素选择($('元素'))和关闭页面(close())函数。
  62. let config = [
  63. {
  64. "remark": "Anime 字幕论坛_签到插件",
  65. "url": "https://bbs.acgrip.com/dsu_paulsign-sign.html",
  66. "check": {
  67. "mode": 2,
  68. "element": "#shuai_menu + table .tac a"
  69. },
  70. "sign": [
  71. {
  72. "remark": "选择心情",
  73. "data": "#yl",
  74. "delay": 0,
  75. "last": false
  76. },
  77. {
  78. "remark": "勾选不填写留言",
  79. "data": "#qiandao > table.tfm > tbody > tr:nth-child(1) > td > label:nth-child(3) > input[type=radio]",
  80. "delay": 0,
  81. "last": false
  82. },
  83. {
  84. "remark": "执行签到",
  85. "data": "#shuai_menu + table .tac a",
  86. "delay": 0,
  87. "last": true
  88. }
  89. ],
  90. "refresh": false,
  91. "close": true
  92. },
  93. {
  94. "remark": "Anime 字幕论坛_Discuz 任务",
  95. "url": "https://bbs.acgrip.com/home.php?mod=task",
  96. "check": {
  97. "mode": 2,
  98. "element": "#ct a[href='home.php?mod=task&do=apply&id=1']",
  99. },
  100. "sign": [
  101. {
  102. "remark": "执行签到",
  103. "data": "#ct a[href='home.php?mod=task&do=apply&id=1']",
  104. "delay": 0,
  105. "last": true
  106. }
  107. ],
  108. "refresh": false,
  109. "close": true
  110. },
  111. {
  112. "remark": "2DFun",
  113. "url": "https://2dfan.com/",
  114. "check": {
  115. "mode": 2,
  116. "element": "#do_checkin"
  117. },
  118. "sign": [
  119. {
  120. "remark": "执行签到",
  121. "data": "#do_checkin",
  122. "delay": 0,
  123. "last": true
  124. }
  125. ],
  126. "refresh": true,
  127. "close": true
  128. },
  129. {
  130. "remark": "南+_接任务",
  131. "url": "https://www.south-plus.net/plugin.php?H_name-tasks.html.html",
  132. "check": {
  133. "mode": 0,
  134. "element": "#p_15 a",
  135. "data": ["title", "按这申请此任务"]
  136. },
  137. "sign": [
  138. {
  139. "remark": "接每日任务",
  140. "data": "#p_15 a",
  141. "delay": "0",
  142. "last": false
  143. },
  144. {
  145. "remark": "接每周任务",
  146. "data": "#p_14 a",
  147. "delay": "0",
  148. "last": false
  149. },
  150. {
  151. "remark": "前往完成任务页面",
  152. "data": () => { window.open('https://www.south-plus.net/plugin.php?H_name-tasks-actions-newtasks.html.html', "_self") },
  153. "delay": 3,
  154. "last": true
  155. }
  156. ],
  157. "refresh": false,
  158. "close": true
  159. },
  160. {
  161. "remark": "南+_完成任务",
  162. "url": "https://www.south-plus.net/plugin.php?H_name-tasks-actions-newtasks.html.html",
  163. "check": {
  164. "mode": 0,
  165. "element": "#both_15 a",
  166. "data": ["title", "领取此奖励"]
  167. },
  168. "sign": [
  169. {
  170. "remark": "完成每日任务",
  171. "data": "#both_15 a",
  172. "delay": "0",
  173. "last": false
  174. },
  175. {
  176. "remark": "完成每周任务",
  177. "data": "#both_14 a",
  178. "delay": "0",
  179. "last": true
  180. }
  181. ],
  182. "refresh": false,
  183. "close": true
  184. },
  185. {
  186. "remark": "绯月",
  187. "url": "https://bbs.kfpromax.com/kf_growup.php",
  188. "check": {
  189. "mode": 2,
  190. "element": ".gro_divhui:nth-child(5) + div a:not(a[href=\"javascript:;\"])"
  191. },
  192. "sign": [
  193. {
  194. "remark": "执行签到",
  195. "data": ".gro_divhui:nth-child(5) + div a:not(a[href=\"javascript:;\"])",
  196. "delay": 0,
  197. "last": true
  198. }
  199. ],
  200. "refresh": false,
  201. "close": true
  202. },
  203. {
  204. "remark": "绅士仓库",
  205. "url": "https://cangku.moe/",
  206. "check": {
  207. "mode": 1,
  208. "element": ".footer li:nth-child(2) a",
  209. "data": ["签到"]
  210. },
  211. "sign": [
  212. {
  213. "remark": "执行签到",
  214. "data": ".footer li:nth-child(2) a",
  215. "delay": 0,
  216. "last": true
  217. }
  218. ],
  219. "refresh": false,
  220. "close": false
  221. },
  222. {
  223. "remark": "紳士の庭",
  224. "url": "https://gmgard.moe/",
  225. "check": {
  226. "mode": 1,
  227. "element": "#checkw",
  228. "data": ["点此签到"]
  229. },
  230. "sign": [
  231. {
  232. "remark": "执行签到",
  233. "data": "#checkin",
  234. "delay": 0,
  235. "last": true
  236. }
  237. ],
  238. "refresh": false,
  239. "close": false
  240. }
  241. ],
  242. URL = location.href,
  243. $ = ele => document.querySelector(ele);
  244. function close() {
  245. window.close();
  246. };
  247.  
  248. // 等待 5 秒
  249. setTimeout(() => {
  250.  
  251. // 遍历配置信息
  252. config.forEach(data => {
  253.  
  254. // 如果链接匹配且未签到
  255. if(URL === data.url && data.check.mode === 0 && $(data.check.element)?.getAttribute(data.check.data[0]) === data.check.data[1] ||
  256. URL === data.url && data.check.mode === 1 && $(data.check.element)?.textContent === data.check.data[0] ||
  257. URL === data.url && data.check.mode === 2 && $(data.check.element)) {
  258.  
  259. // 执行签到
  260. data.sign.forEach(data => {
  261.  
  262. // 等待延时
  263. setTimeout(() => {
  264.  
  265. // 判断模式并执行对应操作
  266. typeof data.data === "string" ? $(data.data)?.click() : data.data() ;
  267.  
  268. // 如果是最后一步
  269. if(data.last) {
  270.  
  271. // 根据参数刷新和关闭
  272. data.refresh ? location.reload() : 0 ;
  273. setTimeout(() => { data.close ? close() : 0 ; }, 500);
  274.  
  275. }
  276.  
  277. }, data.delay * 1000);
  278.  
  279. });
  280.  
  281. }else if(URL === data.url) {
  282.  
  283. // 根据参数刷新和关闭
  284. data.refresh ? location.reload() : 0 ;
  285. setTimeout(() => { data.close ? close() : 0 ; }, 500);
  286.  
  287. }
  288.  
  289. });
  290.  
  291. }, 5000);