(改)B站成分检测器(键政贵物DLC)

B站评论区自动标注成分,支持动态、发言历史、收藏、稿件和关注识别,默认标注包括原神、崩坏3、崩坏星穹铁道、明日方舟、碧蓝航线、Vtuber、Asoul、王者荣耀、三国杀、我的世界、迷你世界、初生科技。

  1. // ==UserScript==
  2. // @name (改)B站成分检测器(键政贵物DLC)
  3. // @version 1.35.9
  4. // @author hmjz100,xulaupuz,trychen
  5. // @namespace github.com/hmjz100
  6. // @license GPLv3
  7. // @description B站评论区自动标注成分,支持动态、发言历史、收藏、稿件和关注识别,默认标注包括原神、崩坏3、崩坏星穹铁道、明日方舟、碧蓝航线、Vtuber、Asoul、王者荣耀、三国杀、我的世界、迷你世界、初生科技。
  8. // @match *://*.bilibili.com/*
  9. // @icon data:image/x-icon;base64,AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAABMLAAATCwAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A1qEAANahAADWoQAG1qEAb9ahAMvWoQD01qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD01qEAy9ahAG/WoQAG1qEAANahAADWoQAA1qEAG9ahAM/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahANDWoQAb1qEAANahAAfWoQDQ1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahANHWoQAH1qEAbtahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAG7WoQDH1qEA/9ahAP/WoQD/1qEAtdahABjWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahABvWoQC11qEA/9ahAP/WoQD/1qEAx9ahAPnWoQD/1qEA/9ahAP/WoQAZ1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahABjWoQD/1qEA/9ahAP/WoQDz1qEA/9ahAP/WoQD/1qEA/9ahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEAANahAADWoQAA1qEAANahAErWoQDn1qEA5NahAErWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAErWoQDn1qEA5NahAErWoQAA1qEAANahAADWoQAA1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQAA1qEAANahAADWoQAA1qEA5tahAP/WoQD/1qEA59ahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEA5tahAP/WoQD/1qEA59ahAADWoQAA1qEAANahAADWoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAADWoQAA1qEAANahAADWoQD/1qEA/9ahAP/WoQD/1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQD/1qEA/9ahAP/WoQD/1qEAANahAADWoQAA1qEAANahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEAANahAADWoQAA1qEAANahAP/WoQD/1qEA/9ahAP/WoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAP/WoQD/1qEA/9ahAP/WoQAA1qEAANahAADWoQAA1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQAA1qEAANahAADWoQAA1qEA5tahAP/WoQD/1qEA5tahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEA5tahAP/WoQD/1qEA5tahAADWoQAA1qEAANahAADWoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAADWoQAA1qEAANahAADWoQBJ1qEA5tahAObWoQBJ1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQBJ1qEA5tahAObWoQBJ1qEAANahAADWoQAA1qEAANahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQD/1qEA/9ahAP/WoQD/1qEA+dahAP/WoQD/1qEA/9ahABnWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAGdahAP/WoQD/1qEA/9ahAPjWoQDH1qEA/9ahAP/WoQD/1qEAttahABnWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahABnWoQC21qEA/9ahAP/WoQD/1qEAx9ahAG3WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQBt1qEABtahAM/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA0NahAAfWoQAA1qEAG9ahAM/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAM/WoQAb1qEAANahAADWoQAA1qEABtahAG7WoQDH1qEA89ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA89ahAMfWoQBu1qEABtahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEADtahAMXWoQD/1qEA/9ahAP/WoQD/1qEAxdahAA/WoQAA1qEAANahAADWoQAA1qEADtahAMXWoQD/1qEA/9ahAP/WoQD/1qEAxdahAA/WoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAAbWoQDF1qEA/9ahAP/WoQD/1qEA/9ahAMXWoQAP1qEAANahAADWoQAA1qEAANahAADWoQAA1qEADtahAMXWoQD/1qEA/9ahAP/WoQD/1qEAxdahAAbWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAYtahAP/WoQD/1qEA/9ahAP/WoQDF1qEADtahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEADtahAMXWoQD/1qEA/9ahAP/WoQD/1qEAY9ahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQBf1qEA/9ahAP/WoQD/1qEAxdahAA7WoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEADtahAMXWoQD/1qEA/9ahAP/WoQBf1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAATWoQCg1qEA6tahAKjWoQAO1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEADtahAKjWoQDr1qEAoNahAATWoQAA1qEAANahAADWoQAA1qEAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A///////////AAAADgAAAAQAAAAAAAAAAA///wAf//+AP///wD///8A////AP///wDw/w8A8P8PAPD/DwDw/w8A8P8PAPD/DwD///8A////AH///gA///wAAAAAAAAAAAgAAAAcAAAAP8A8A/+AfgH/gP8B/4H/gf+D/8H/////8=
  10. // @connect bilibili.com
  11. // @connect bing.com
  12. // @grant GM_xmlhttpRequest
  13. // @grant GM_registerMenuCommand
  14. // @grant GM_getResourceText
  15. // @grant GM_getValue
  16. // @grant GM_setValue
  17. // @require https://unpkg.com/jquery@3.6.3/dist/jquery.min.js
  18. // @require https://unpkg.com/sweetalert2@11/dist/sweetalert2.min.js
  19. // @resource Swal https://unpkg.com/sweetalert2@11/dist/sweetalert2.min.css
  20. // @resource SwalDark https://unpkg.com/@sweetalert2/theme-dark@5.0.15/dark.min.css
  21. // ==/UserScript==
  22.  
  23. $(function () {
  24. // 准备好sweetalert
  25. let toast = Swal.mixin({
  26. toast: true,
  27. position: 'top-end',
  28. showConfirmButton: false,
  29. showCloseButton: true,
  30. timer: 2000,
  31. timerProgressBar: true,
  32. didOpen: (toast) => {
  33. toast.addEventListener('mouseenter', Swal.stopTimer);
  34. }
  35. });
  36.  
  37. const message = {
  38. success: (text) => {
  39. toast.fire({title: text, icon: 'success'});
  40. },
  41. error: (text) => {
  42. toast.fire({title: text, icon: 'error'});
  43. },
  44. warning: (text) => {
  45. toast.fire({title: text, icon: 'warning'});
  46. },
  47. info: (text) => {
  48. toast.fire({title: text, icon: 'info'});
  49. },
  50. question: (text) => {
  51. toast.fire({title: text, icon: 'question'});
  52. }
  53. };
  54.  
  55. // 增加CSS界面样式
  56. let base = {
  57. addStyle(id, tag, css) {
  58. tag = tag || 'style';
  59. let doc = document, styleDom = doc.getElementById(id);
  60. if (styleDom) styleDom.remove();
  61. let style = doc.createElement(tag);
  62. style.rel = 'stylesheet';
  63. style.id = id;
  64. tag === 'style' ? style.innerHTML = css : style.href = css;
  65. doc.getElementsByTagName('head')[0].appendChild(style);
  66. },
  67.  
  68. addSwalStyle() {
  69. let color = "#574AB8";
  70.  
  71. let swalcss = `
  72. .swal2-loader{display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:${color} transparent ${color} transparent }
  73. .swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:${color};color:#fff;font-size:1em}
  74. .swal2-styled.swal2-confirm:focus{box-shadow:0 0 0 3px ${color}80 }
  75. .swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto;overflow:hidden;border-bottom-right-radius:5px;border-bottom-left-radius:5px}
  76. .swal2-timer-progress-bar{width:100%;height:.25em;background:${color}33 }
  77. .swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:${color};color:#fff;line-height:2em;text-align:center}
  78. .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:${color} }
  79. .swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:${color}}
  80. .swal2-popup {padding:0 0 1.25em;flex-direction:column}
  81. .swal2-close {position:absolute;top:0;right:0}
  82. div:where(.swal2-container) .swal2-html-container{margin: 1em 1.3em 0.3em;}
  83. .composition-badge {
  84. display: inline-flex;
  85. justify-content: center;
  86. align-items: center;
  87. width: fit-content;
  88. background: #7367f026;
  89. border-radius: 10px;
  90. margin: 0 5px;
  91. font-family: PingFang SC, HarmonyOS_Regular, Helvetica Neue, Microsoft YaHei, sans-serif;
  92. cursor: pointer;
  93. }
  94.  
  95. .composition-name {
  96. line-height: 13px;
  97. font-size: 13px;
  98. color: ${color} !important;
  99. padding: 2px 8px;
  100. }
  101.  
  102. .composition-icon {
  103. width: 25px;
  104. height: 25px;
  105. border-radius: 50%;
  106. border: 2px solid ${color}80;
  107. margin: -6px;
  108. margin-right: 5px;
  109. }
  110.  
  111. .composition-badge-control {
  112. display: inline-flex;
  113. justify-content: center;
  114. align-items: center;
  115. width: fit-content;
  116. background: #00000008 !important;
  117. border-radius: 10px;
  118. margin: 0 5px;
  119. font-family: PingFang SC, HarmonyOS_Regular, Helvetica Neue, Microsoft YaHei, sans-serif;
  120. }
  121.  
  122. .composition-name-control {
  123. line-height: 13px;
  124. font-size: 12px;
  125. color: #00000050 !important;
  126. padding: 2px 8px;
  127. }
  128. `;
  129.  
  130. // 先监听颜色方案变化 SweetAlert2-Default
  131. window.matchMedia('(prefers-color-scheme: dark)').addListener((e) => {
  132. if (e.matches) {
  133. // 切换到暗色主题
  134. this.addStyle('swal-pub-style', 'style', GM_getResourceText('SwalDark'));
  135. } else {
  136. // 切换到浅色主题
  137. this.addStyle('swal-pub-style', 'style', GM_getResourceText('Swal'));
  138. }
  139. this.addStyle('SweetAlert2-User', 'style', swalcss);
  140. });
  141.  
  142. // 再修改主题 SweetAlert2-Default
  143. if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
  144. // 切换到暗色主题
  145. this.addStyle('swal-pub-style', 'style', GM_getResourceText('SwalDark'));
  146. } else {
  147. // 切换到浅色主题
  148. this.addStyle('swal-pub-style', 'style', GM_getResourceText('Swal'));
  149. }
  150. this.addStyle('SweetAlert2-User', 'style', swalcss);
  151. },
  152. };
  153. base.addSwalStyle();
  154.  
  155. // 在这里配置要检查的成分,以及直接 拉黑(使用指定UID评论的人直接添加标签)。
  156. // 比如你要直接给指定UID添加一个标签,就这样写:blacklist: [401742377]
  157. const checkers = [
  158. {
  159. displayName: "抽奖",
  160. displayIcon: "data:image/svg+xml;base64,PHN2ZyBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik04NTQgMjA5Yy02LjQgMC0xMC4yLTcuMi02LjYtMTIuNSAxNS42LTIzLjIgMjMuMi00OC43IDIxLjUtNzQtMS45LTMwLjMtMTctNTYuNS00My43LTc1LjgtMTkuMi0xMy45LTQ0LjctMjQtNzEuNy0yOC42LTQ5LTguMi0xMDAuOSA1LjctMTQ2LjMgMzkuMy0yNC40IDE4LjEtNDYuNiA0MS4yLTY2LjQgNjkuMi0xMi43IDE3LjktMzkuNCAxNy45LTUyIDAtMTkuOC0yOC00Mi01MS4xLTY2LjQtNjkuMkMzNzcgMjMuOCAzMjUuMSA5LjggMjc2LjEgMTguMWMtMjcgNC42LTUyLjUgMTQuNy03MS43IDI4LjYtMjYuNyAxOS4zLTQxLjkgNDUuNS00My44IDc1LjgtMS42IDI1LjMgNS45IDUwLjggMjEuNiA3NCAzLjYgNS4zLTAuMSAxMi41LTYuNiAxMi41SDEyOEM1Ny4zIDIwOSAwIDI2Ni4zIDAgMzM3djEyOGMwIDE3LjcgMTQuMyAzMiAzMiAzMmgyNGM0LjQgMCA4IDMuNiA4IDh2NDQwYzAgMzUuMyAyOC43IDY0IDY0IDY0aDc2OGMzNS4zIDAgNjQtMjguNyA2NC02NFY1MDVjMC00LjQgMy42LTggOC04aDI0YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjMzN2MwLTcwLjctNTcuMy0xMjgtMTI4LTEyOGgtNDJ6TTc0Mi45IDgxLjJjNi4xIDEgNjAgMTEuMSA2Mi4zIDQ1LjQgMS45IDI5LjktMzEuMSA2OS41LTg4IDgyLjRoLTEzOGMtNi4xIDAtOS45LTYuNS03LTExLjkgNTMuMS05Ni41IDEyMC41LTEyNC40IDE3MC43LTExNS45eiBtLTUxOC40IDQ1LjRjMi4yLTM0LjMgNTYuMS00NC4zIDYyLjMtNDUuNCA1MC4xLTguNCAxMTcuNiAxOS40IDE3MC43IDExNS45IDIuOSA1LjMtMC45IDExLjktNyAxMS45aC0xMzhjLTU2LjktMTMtOTAtNTIuNS04OC04Mi40ek00MDggOTQ1SDE0NGMtOC44IDAtMTYtNy4yLTE2LTE2VjUwNWMwLTQuNCAzLjYtOCA4LThoMjcyYzQuNCAwIDggMy42IDggOHY0MzJjMCA0LjQtMy42IDgtOCA4eiBtMTI4IDBoLTQ4Yy00LjQgMC04LTMuNi04LThWNTA1YzAtNC40IDMuNi04IDgtOGg0OGM0LjQgMCA4IDMuNiA4IDh2NDMyYzAgNC40LTMuNiA4LTggOHogbTM0NCAwSDYxNmMtNC40IDAtOC0zLjYtOC04VjUwNWMwLTQuNCAzLjYtOCA4LThoMjcyYzQuNCAwIDggMy42IDggOHY0MjRjMCA4LjgtNy4yIDE2LTE2IDE2eiBtNjQtNTEySDgwYy04LjggMC0xNi03LjItMTYtMTZ2LTgwYzAtMzUuMyAyOC43LTY0IDY0LTY0aDc2OGMzNS4zIDAgNjQgMjguNyA2NCA2NHY4MGMwIDguOC03LjIgMTYtMTYgMTZ6Ij48L3BhdGg+PC9zdmc+",
  161. keywords: ["互动抽奖","转发本条动态"],
  162. },
  163. {
  164. displayName: "原神",
  165. displayIcon: "https://i2.hdslb.com/bfs/face/d2a95376140fb1e5efbcbed70ef62891a3e5284f.jpg",
  166. keywords: ["互动抽奖 #原神","#原神","#米哈游#","#miHoYo#","原神","芙宁娜","白术","赛诺","神里绫人","神里绫华","夏洛蒂","珊瑚宫","心海","北斗","五郎","九条裟罗","雷神","班尼特","夜阑","夜兰","那维莱特","行秋","枫原万叶","万叶","钟离","纳西妲","香菱","锅巴","八重神子","久岐忍","菲谢尔","艾尔海森","胡桃","林尼","达达利亚","提纳里","宵宫","莫娜","甘雨","罗莎莉亚","刻晴","北斗","九条裟罗","温蒂","温迪","阿贝多","云堇","芭芭拉","可莉","迪卢克","烟绯","早柚","重云","米卡","雷泽","多莉","凝光","丽莎","坎蒂丝","安柏","辛焱"],
  167. followings: [401742377] // 原神官方号的 UID
  168. },
  169. {
  170. displayName: "崩坏3",
  171. displayIcon: "https://i0.hdslb.com/bfs/face/f861b2ff49d2bb996ec5fd05ba7a1eeb320dbf7b.jpg",
  172. keywords: ["互动抽奖 #崩坏3","#崩坏3","崩坏3"],
  173. followings: [27534330] // 崩坏3官方号的 UID
  174. },
  175. {
  176. displayName: "崩坏星穹铁道",
  177. displayIcon: "https://i2.hdslb.com/bfs/face/57b6e8c16b909a49bfc8d8394d946f908cabe728.jpg",
  178. keywords: ["互动抽奖 #崩坏星穹铁道","#崩坏星穹铁道","崩坏星穹铁道","星铁","崩铁"],
  179. followings: [1340190821] // 崩坏星穹铁道官方号的 UID
  180. },
  181. {
  182. displayName: "明日方舟",
  183. displayIcon: "https://i2.hdslb.com/bfs/face/d4005a0f9b898d8bb049caf9c6355f8e8f772a8f.jpg",
  184. keywords: ["明日方舟","#明日方舟"],
  185. followings: [
  186. 161775300, // 明日方舟官方号的 UID
  187. ]
  188. },
  189. {
  190. displayName: "碧蓝航线",
  191. displayIcon: "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg",
  192. keywords: ["碧蓝航线","#碧蓝航线","#舰船新增#","#碧蓝航线5周年生日快乐"],
  193. followings: [
  194. 233114659, // 碧蓝航线官方号的 UID
  195. ]
  196. },
  197. {
  198. displayName: "VTuber",
  199. displayIcon: "https://i2.hdslb.com/bfs/face/d399d6f5cf7943a996ae96999ba3e6ae2a2988de.jpg",
  200. keywords: ["雪蓮","塔菲","七海","草莓猫","嘉然"],
  201. followings: [
  202. 1437582453, // 東雪蓮Official
  203. 1265680561, // 永雏塔菲
  204. 434334701, // 七海Nana7mi
  205. 1210816252, // 草莓猫Taffy
  206. 672328094, // 嘉然今天吃什么
  207. 672342685, // 乃琳Queen
  208. 351609538, // 珈乐Carol
  209. 672346917, // 向晚大魔王
  210. 672353429, // 贝拉kira
  211. ]
  212. },
  213. {
  214. displayName: "Asoul",
  215. displayIcon: "https://i2.hdslb.com/bfs/face/43b21998da8e7e210340333f46d4e2ae7ec046eb.jpg",
  216. keywords: ["@A-SOUL_Official", "#A_SOUL#"],
  217. followings: [
  218. 703007996, // Asoul
  219. 547510303, // Asoul二创计画
  220. 672328094, // 嘉然今天吃什么
  221. 672342685, // 乃琳Queen
  222. 351609538, // 珈乐Carol
  223. 672346917, // 向晚大魔王
  224. 672353429, // 贝拉kira
  225. ]
  226. },
  227. {
  228. displayName: "王者荣耀",
  229. displayIcon: "https://i2.hdslb.com/bfs/face/effbafff589a27f02148d15bca7e97031a31d772.jpg",
  230. keywords: ["互动抽奖 #王者荣耀","#王者荣耀","王者荣耀"],
  231. followings: [
  232. 57863910, // 王者荣耀
  233. 392836434, // 哔哩哔哩王者荣耀赛事
  234. ]
  235. },
  236. {
  237. displayName: "三国杀",
  238. displayIcon: "https://i0.hdslb.com/bfs/face/fe2e1a6e3dc702a6c91378e096ef37ca71bf4629.jpg",
  239. keywords: ["互动抽奖 #三国杀","#三国杀","三国杀","#2023三国杀"],
  240. followings: [1254932367] // 三国杀十周年官方号的 UID
  241. },
  242. {
  243. displayName: "Minecraft",
  244. displayIcon: "https://i2.hdslb.com/bfs/face/c5578966c447a70edf831bbf7e522b7be6090fea.jpg",
  245. keywords: ["MC","我的世界","minecraft","#我的世界","我的世界拜年祭","MCBBS","我的世界中文论坛","MC玩家"],
  246. followings: [
  247. 43310262, // 我的世界官方号的 UID
  248. 39914211, // 我的世界中文论坛(MCBBS)官方号的 UID
  249. ]
  250. },
  251. {
  252. displayName: "迷你世界",
  253. displayIcon: "https://i0.hdslb.com/bfs/face/a7591e5e0278aafb76cc083b11ca5dd46f049420.jpg",
  254. keywords: ["mnsj","迷你世界","miniworld","#迷你世界","迷你世界拜年祭"],
  255. followings: [
  256. 470935187, // 迷你世界官方号的 UID
  257. ]
  258. },{
  259. displayName: "兔友",
  260. displayIcon: "https://pic2.zhimg.com/80/v2-8e08912298d7c7c1bf1671a448f15369_1440w.webp",
  261. keywords: ["种花", "昂撒","殖人", "润人", "偷国", "七哥", "心医", "公知","躺匪","新冠后遗症","美狗","1450","入关","唐飞","电子宠物","不爱国","撅醒","大棋","华为","倪师","中医","文化输出","丑国","恨国","犹太","西方","渗透","白左"],
  262. followings: [346563107, 439478093, 19248926, 289189019, 1482025194, 77701536, 323397658,648113003,397672,1458767615,510362725,2233213],
  263. }, {
  264. displayName: "网左",
  265. displayIcon: "https://i0.hdslb.com/bfs/emote/0922c375da40e6b69002bd89b858572f424dcfca.png@112w_112h.webp",
  266. keywords: ["革命", "同志", "阶级","觉醒","资本","剥削","斗争","无产","劳动","左壬","苏联","红军","布尔什维克","斯大林","列宁","中苏","封建","共产","选集","全集","马克思"],
  267. followings: [23191782, 521249172,43219807]
  268. }, {
  269. displayName: "毛左",
  270. displayIcon: "https://i0.hdslb.com/bfs/emote/2caafee2e5db4db72104650d87810cc2c123fc86.png@48w_48h.webp",
  271. keywords: ["教员","毛主席","一声扑向","艾公","修正","邓","前三十年","前30年","艾跃进","艾老师"],
  272. followings: [605727461,2022537742,3493133453101082]
  273. }, {
  274. displayName: "黄鹅",
  275. displayIcon: "https://i1.hdslb.com/bfs/archive/87cadbe23ec449f2114cb998d04ce7160f7dfdec.jpg@672w_378h_1c_!web-search-common-cover.avif",
  276. keywords: ["大帝", "乌贼", "鱿鱼", "大佐", "乌拉", "战斗民族","喀秋莎"],
  277. followings: [153890218, 664086886, 622986240, 501247999,433443590]
  278. }, {
  279. displayName: "中医粉",
  280. displayIcon: "https://i0.hdslb.com/bfs/face/c0629ce0c4cc3d442101704b33756b2ef738f7aa.jpg@96w_96h_1c_1s_!web-avatar.avif",
  281. keywords: ["国医", "国药", "吃中药", "针灸", "中医黑", "汉方","经络","倪海厦","倪师","易经","弟子规","国学","汤剂","曾仕强","南怀瑾","易学","养生","中医","太极","中醫","寒湿"],
  282. followings: []
  283. }, {
  284. displayName: "恨猫闹钟",
  285. displayIcon: "https://img0.baidu.com/it/u=1427754838,2773895594&fm=253&fmt=auto&app=138&f=JPEG?w=394&h=450",
  286. keywords: ["哈基十","猫孝子","爱猫","改猫","灭猫","猫奴","消灭流浪猫","人道毁灭","捕杀流浪猫","处理流浪猫","猫肉","狗粉","杰克辣条","流浪猫虐杀","动保"],
  287. followings: []
  288. },{
  289. displayName: "键政神童",
  290. displayIcon: "https://i2.hdslb.com/bfs/face/880c533cfd7434acf77b91552e5799d11d25ddcc.jpg@240w_240h_1c_1s_!web-avatar-search-user.webp",
  291. keywords: ["班级","中考","高考","四六级","不放假","防沉迷","上学","班里","班委","放寒假","写作业","学校的","我们老师","开学"],
  292. followings: []
  293. },{
  294. displayName: "初生科技",
  295. displayIcon: "https://i2.hdslb.com/bfs/face/eb4c7bbea813eed3a92ee194809d85715e6a7659.jpg",
  296. keywords: ["易语言","编程猫","scratch","破解","黑客","ramos","winpe","bsod","memz","MEMZ","WindowsCE","下崽器","aero","setup","DWM","CmzPrep","RAM","虚拟机","VMWare","希沃白板","捡垃圾","root","解BL"],
  297. followings: [
  298. //- 组1/关键词:system -//
  299. 493998035, // SYSTEM-RAMOS-ZDY 唯一真神,他的脸皮比医院设备还要厚
  300. 702028797, // JERRY-SYSTEM
  301. 631731585, // system-bootmgr-L
  302. 501355555, // MS-SYSTEM
  303. 1865727084, // SYSTEM-WinPE-CHD
  304. //- 组2/关键词:bsod -//
  305. 451475014, // STR-BSOD
  306. 1511907771, // MEMZ-BSOD
  307. 1975308950, // BSOD-MEMZ
  308. 397847418, // 蓝屏钙BSOD
  309. 1776025003, // 蓝瓶钙BSoD
  310. //- 组3/关键词:memz -//
  311. 21927744, // 360MEMZ
  312. 1353783215, // MEMZ-Chrome
  313. 412777837, // 注册表MEMZ
  314. 457692234, // 奇怪的MEMZ
  315. 298993710, // 注册表编辑器MEMZ
  316. //- 组4/关键词:Aero setup -//
  317. 435972058, // WindowsAero毛玻璃
  318. 1452376557, // 没有Aero就没有灵魂
  319. 1911529131, // Aero8m
  320. 1321946754, // 没有Aero的Windows7
  321. //- 组5/关键词:setup -//
  322. 589370259, // setup-windows安装
  323. 2050076822, // Windows-Setup
  324. //- 组6/关键词:Start -//
  325. 524501321, // Start-hs888
  326. 2030178992, // Start-BME
  327. //- 自定义组/依照个人判断 -//
  328. 1157923020, // 仗义的老班长
  329. 401094700, // 旮沓曼_gt428
  330. 356882513, // 被重组吃掉的虚拟桌面
  331. 1151325757, // SYSTEM-OPS-LJY
  332. 1304244190, // System-NBNB
  333. 504179884, // MYB_CKLS
  334. 1776456802, // 奇怪的MEMZ的小号
  335. 1534842751, // 爱WinPE的MEMZ
  336. 2112060594, // WINPE-SYSTEM
  337. 1439352366, // SYSTEM-WINPE-EXE
  338. 678414222, // Windows-regedit
  339. 1863175083, // 半不了世的空城
  340. 1736202379, // 胡桃玩VM
  341. 1322183332, // WindowsCEMEMZ新账号
  342. 414666753, // 桌面窗口管理器_DWM
  343. 1380415597, // 雨林木风YLMF
  344. 698760287, // 出星海wrcjs_sp4
  345. 307432672, // 花l火
  346. 3493108908034540, // S-1-5-21-1726115
  347. 1158046953, // VistaChrome108
  348. 727892489, // Windows2003R2
  349. 1243577821, // hyq061221
  350. ],
  351. blacklist: [
  352. 2102787368, // Silence默不作声 按理说休学的他不应该出现在这
  353. //- 组1/关键词:system -//
  354. 493998035, // SYSTEM-RAMOS-ZDY 唯一真神,他的脸皮比医院设备还要厚
  355. 702028797, // JERRY-SYSTEM
  356. 631731585, // system-bootmgr-L
  357. 501355555, // MS-SYSTEM
  358. 1865727084, // SYSTEM-WinPE-CHD
  359. 1162296488, // System3206
  360. 1531948091, // SYSTEM_Win11_RE
  361. 392697653, // System-i386
  362. 313342814, // SYSTEM-GREE-GZN
  363. 1546428456, // SYSTEM-WIN-EDGE
  364. //- 组2/关键词:bsod -//
  365. 451475014, // STR-BSOD
  366. 1511907771, // MEMZ-BSOD
  367. 1975308950, // BSOD-MEMZ
  368. 397847418, // 蓝屏钙BSOD
  369. 1776025003, // 蓝瓶钙BSoD
  370. 1007224506, // EXPLORER-BSOD
  371. 1175873768, // BSOD-Winme
  372. 2032637936, // BSOD-SYSTEM
  373. 1933399514, // win11_BSOD
  374. 1641461034, // DEEPIN_BSOD2_CMD
  375. //- 组3/关键词:memz -//
  376. 21927744, // 360MEMZ
  377. 1353783215, // MEMZ-Chrome
  378. 412777837, // 注册表MEMZ
  379. 457692234, // 奇怪的MEMZ
  380. 298993710, // 注册表编辑器MEMZ
  381. 413269076, // Cmd_MEMZ
  382. 649846967, // Win7MEMZ-BX
  383. 498912953, // AMD_MEMZ
  384. 390483853, // 炒鸡360MEMZ
  385. 362451533, // NC_Memz
  386. //- 组5/关键词:Aero -//
  387. 435972058, // WindowsAero毛玻璃
  388. 1452376557, // 没有Aero就没有灵魂
  389. 1911529131, // Aero8m
  390. 1321946754, // 没有Aero的Windows7
  391. //- 组5/关键词:setup -//
  392. 589370259, // setup-windows安装
  393. 2050076822, // Windows-Setup
  394. 1549141274, // system-setup
  395. 692755897, // Setup-Official
  396. 483574120, // setup安装程序
  397. 1031408618, // Deewin-Setup
  398. 671918906, // win95setup
  399. //- 组6/关键词:Start -//
  400. 524501321, // Start-hs888
  401. 2030178992, // Start-BME
  402. //- 自定义组/依照个人判断 -//
  403. 1157923020, // 仗义的老班长
  404. 401094700, // 旮沓曼_gt428
  405. 356882513, // 被重组吃掉的虚拟桌面
  406. 1151325757, // SYSTEM-OPS-LJY
  407. 1304244190, // System-NBNB
  408. 504179884, // MYB_CKLS
  409. 1776456802, // 奇怪的MEMZ的小号
  410. 1534842751, // 爱WinPE的MEMZ
  411. 2112060594, // WINPE-SYSTEM
  412. 1439352366, // SYSTEM-WINPE-EXE
  413. 678414222, // Windows-regedit
  414. 505199229, // SYSTEM_PHILI
  415. 652188355, // 一个windows爱好者
  416. 1863175083, // 半不了世的空城
  417. 1736202379, // 胡桃玩VM
  418. 1322183332, // WindowsCEMEMZ新账号
  419. 414666753, // 桌面窗口管理器_DWM
  420. 698760287, // 出星海wrcjs_sp4
  421. 307432672, // 花l火
  422. 3493108908034540, // S-1-5-21-1726115
  423. 1158046953, // VistaChrome108
  424. 727892489, // Windows2003R2
  425. 1243577821, // hyq061221
  426. ]
  427. },
  428. // 指定仙家军UID与仙话的XianLists太容易误杀,故此处删除
  429. ]
  430.  
  431.  
  432.  
  433. // 空间动态api
  434. const spaceApiUrl = 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?&host_mid='
  435. const followingApiUrl = 'https://api.bilibili.com/x/relation/followings?vmid='
  436. const searchIcon = `<svg width="12" height="12" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M16.3451 15.2003C16.6377 15.4915 16.4752 15.772 16.1934 16.0632C16.15 16.1279 16.0958 16.1818 16.0525 16.2249C15.7707 16.473 15.4456 16.624 15.1854 16.3652L11.6848 12.8815C10.4709 13.8198 8.97529 14.3267 7.44714 14.3267C3.62134 14.3267 0.5 11.2314 0.5 7.41337C0.5 3.60616 3.6105 0.5 7.44714 0.5C11.2729 0.5 14.3943 3.59538 14.3943 7.41337C14.3943 8.98802 13.8524 10.5087 12.8661 11.7383L16.3451 15.2003ZM2.13647 7.4026C2.13647 10.3146 4.52083 12.6766 7.43624 12.6766C10.3517 12.6766 12.736 10.3146 12.736 7.4026C12.736 4.49058 10.3517 2.1286 7.43624 2.1286C4.50999 2.1286 2.13647 4.50136 2.13647 7.4026Z" fill="currentColor"></path></svg>`
  437. const checked = {}
  438. const checking = {}
  439. var printed = false
  440.  
  441. // 监听用户ID元素出现
  442. waitForKeyElements(".user-name", installCheckButton);
  443. waitForKeyElements(".sub-user-name", installCheckButton);
  444. waitForKeyElements(".user .name", installCheckButton);
  445. waitForKeyElements(".user-card .btn-box .like", installCheckButton);
  446.  
  447.  
  448.  
  449. console.log("开启B站用户成分检查器...")
  450. let dom = ''
  451.  
  452. // 添加检查按钮
  453. function installCheckButton(element) {
  454. let node = $(`<div style="display: inline-block;" class="composition-checkable"><div class="composition-badge-control"><a class="composition-name-control" title="点击查看已识别用户">${searchIcon}</a></div></div>`)
  455. if (element.attr("data-user-id") || element.attr("data-usercard-mid")){
  456. node.on('click', function () {
  457. checkComposition(element, node.find(".composition-name-control"))
  458. })
  459. node.click()
  460. element.after(node)
  461. } else if (element.attr("mid")) {
  462. node.on('click', function () {
  463. checkComposition(element, node.find(".composition-name-control"))
  464. })
  465. node.click()
  466. node.css({"margin":"8px 5px"});
  467. element.parent().after(node);
  468. }
  469. }
  470.  
  471. // 添加标签
  472. function installComposition(id, element, setting) {
  473. let node = $(`<div style="display: inline-block;"><div class="composition-badge">
  474. <a class="composition-name" title="点击查看已识别用户">${setting.displayName}</a>
  475. <img src="${setting.displayIcon}" class="composition-icon">
  476. </div></div>`)
  477. node.on('click', function () {
  478. check.showAllUser()
  479. })
  480. if (element.attr("data-user-id") || element.attr("data-usercard-mid")){
  481. element.after(node)
  482. } else if (element.attr("mid")) {
  483. node.css({"margin":"10px 0"});
  484. element.parent().after(node);
  485. }
  486. }
  487.  
  488. // 检查标签
  489. function checkComposition(element, loadingElement) {
  490. // 用户ID
  491. let userID = element.attr("data-user-id") || element.attr("data-usercard-mid") || element.attr("mid")
  492. // 用户名
  493. let name = element.text().charAt(0) == "@" ? element.text().substring(1) : element.text()
  494.  
  495. if (checked[userID] != undefined && GM_getValue(userID, undefined) != undefined ) {
  496. // 已经缓存过了
  497.  
  498. let found = GM_getValue(userID, undefined)//checked[userID]
  499. if (found.length > 0) {
  500. for (let setting of found) {
  501. installComposition(userID, element, setting)
  502. }
  503. loadingElement.parent().remove()
  504. } else {
  505. console.log(`检测到 ${name} ${userID} 的成分为 无`)
  506. loadingElement.text('路人')
  507. loadingElement.on('click', function () {
  508. check.showAllUser()
  509. })
  510. }
  511. } else if (checking[userID] != undefined) {
  512. // 检查中
  513. if (checking[userID].indexOf(element) < 0)
  514. checking[userID].push(element)
  515. } else {
  516. checking[userID] = [element]
  517. console.log("正在检查用户 " + name + " 的成分...");
  518.  
  519. new Promise(async (resolve, reject) => {
  520. try {
  521. // 找到的匹配内容
  522. let found = []
  523.  
  524. let spaceRequest = request({
  525. data: "",
  526. url: spaceApiUrl + userID,
  527. })
  528.  
  529. let bingRequest = requestbing({
  530. data: "",
  531. url: 'https://www.bing.com/search?q="'+name+'" %2B'+userID.toString()+' site:bilibili.com',
  532. })
  533.  
  534. let vidreq = requestbing({
  535. data: "",
  536. url: 'https://space.bilibili.com/'+userID.toString(),
  537. })
  538.  
  539. let artreq = requestbing({
  540. data: "",
  541. url: 'https://space.bilibili.com/'+userID.toString()+'/article',
  542. })
  543.  
  544. let favreq = requestbing({
  545. data: "",
  546. url: 'https://space.bilibili.com/'+userID.toString()+'/favlist',
  547. })
  548.  
  549. let followingRequest = request({
  550. data: "",
  551. url: followingApiUrl + userID,
  552. })
  553.  
  554. try {
  555. //console.log(spaceApiUrl + userID)
  556. try{
  557. let spaceContent = await spaceRequest
  558. if (!printed) {
  559. console.log(spaceContent)
  560. printed = true
  561. }
  562.  
  563. // 动态内容检查
  564. if (spaceContent.code == 0) {
  565. // 解析并拼接动态数据
  566. let st = JSON.stringify(spaceContent.data.items)
  567. //alert(bingContent)
  568. for (let setting of checkers) {
  569. // 检查动态内容
  570. if (setting.keywords) {
  571. if (setting.keywords.find(keyword => st.includes(keyword))) {
  572. if (found.indexOf(setting) < 0)
  573. found.push(setting)
  574. continue;
  575. }
  576. }
  577. }
  578. }
  579. }catch(error){
  580. console.log("no")
  581. }
  582. let bingContent = await bingRequest
  583. let vidContent = await vidreq
  584. let artContent = await artreq
  585. let favContent = await favreq
  586.  
  587.  
  588. // 动态内容检查
  589. if (vidContent.code == 0) {
  590. // 解析并拼接动态数据
  591. let st = vidContent+" "+artContent+" "+favContent+" "+element.parent().attr('text')+" "+name
  592. //alert(bingContent)
  593. for (let setting of checkers) {
  594. // 检查动态内容
  595. if (setting.keywords) {
  596. if (setting.keywords.find(keyword => st.includes(keyword))) {
  597. if (found.indexOf(setting) < 0)
  598. found.push(setting)
  599. continue;
  600. }
  601. }
  602. }
  603. }
  604. // 动态内容检查
  605. if (bingContent.code == 0) {
  606. // 解析并拼接动态数据
  607. let st = bingContent
  608. for (let setting of checkers) {
  609. // 检查动态内容
  610. if (setting.keywords) {
  611. if (setting.keywords.find(keyword => st.includes(keyword))) {
  612. if (found.indexOf(setting) < 0 && setting.displayName != "兔友" && setting.displayName != "Minecraft")
  613. found.push(setting)
  614. continue;
  615. }
  616. }
  617. }
  618. }
  619. } catch(error) {
  620. console.error(`获取 ${name} ${userID} 的动态失败`, error)
  621. }
  622.  
  623. try {
  624. //console.log(followingApiUrl + userID)
  625. let followingContent = await followingRequest
  626. // 可能无权限
  627. let following = followingContent.code == 0 ? followingContent.data.list.map(it => it.mid) : []
  628. if (following) {
  629. for (let setting of checkers) {
  630. // 检查关注列表
  631. if (setting.followings)
  632. for (let mid of setting.followings) {
  633. if (following.indexOf(mid) >= 0) {
  634. if (found.indexOf(setting) < 0)
  635. found.push(setting)
  636. continue;
  637. }
  638. }
  639. }
  640. }
  641. } catch(error) {
  642. console.error(`获取 ${name} ${userID} 的关注列表失败`, error)
  643. }
  644.  
  645. try {
  646. for (let setting of checkers) {
  647. // 检查关注列表
  648. if (setting.blacklist)
  649. for (let mid of setting.blacklist) {
  650. if (userID.indexOf(mid) >= 0) {
  651. if (found.indexOf(setting) < 0)
  652. found.push(setting)
  653. continue;
  654. }
  655. }
  656. }
  657. } catch(error) {
  658. console.error(`获取 ${name} ${userID} 是否在命中名单失败`, error)
  659. }
  660.  
  661. // 添加标签
  662. if (found.length > 0) {
  663. // 输出日志
  664. // console.log(`检测到 ${name} ${userID} 的成分为 `, found.map(it => it.displayName))
  665. dom += `<span>昵称: ${name}<br>UID: ${userID}<br>成分: ${found.map(it => it.displayName)}<br>主页: <a href="https://space.bilibili.com/${userID}" target="_blank" style="color: #fb7299;">space.bilibili.com/${userID}</a></span><br><br>`;
  666. checked[userID] = found
  667.  
  668. // 给所有用到的地方添加标签
  669. for (let element of checking[userID]) {
  670. for (let setting of found) {
  671. installComposition(userID, element, setting)
  672. }
  673. }
  674. loadingElement.parent().remove()
  675. } else {
  676. // console.log(`检测到 ${name} ${userID} 的成分为 无`)
  677. loadingElement.text('路人')
  678. loadingElement.on('click', function () {
  679. check.showAllUser()
  680. })
  681. }
  682.  
  683. checked[userID] = found
  684. GM_setValue(userID, found)
  685. delete checking[userID]
  686.  
  687. resolve(found)
  688. } catch (error) {
  689. console.error(`检测 ${name} ${userID} 的成分失败`, error)
  690. loadingElement.text('失败')
  691. loadingElement.on('click', function () {
  692. check.showAllUser()
  693. })
  694. delete checking[userID]
  695. reject(error)
  696. }
  697. })
  698. }
  699. }
  700. dom = '<div id="Identified"><span id="tips">注:因判断关键词较为广泛,可能会出现识别错误的现象<br>脚本还在测试阶段,喜欢的话还请留下你的评论</span><br><br>' + dom + '</div>';
  701. let check = {
  702. showAllUser() {
  703. Swal.fire({
  704. title: '已识别用户',
  705. html: dom,
  706. icon: 'info',
  707. heightAuto: false,
  708. scrollbarPadding: false,
  709. showCloseButton: true,
  710. confirmButtonText: '关闭'
  711. })
  712. },
  713. }
  714.  
  715. GM_registerMenuCommand("查看所有已识别用户", () => {
  716. check.showAllUser();
  717. });
  718.  
  719. function request(option) {
  720. return new Promise((resolve, reject) => {
  721. let requestFunction = GM_xmlhttpRequest ? GM_xmlhttpRequest : GM.xmlHttpRequest
  722.  
  723. requestFunction({
  724. method: "get",
  725. headers: {
  726. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
  727. },
  728. ...option,
  729. onload: (response) => {
  730. let res = JSON.parse(response.responseText)
  731. resolve(res)
  732. },
  733. onerror: (error) => {
  734. reject(error);
  735. }
  736. });
  737. })
  738. }
  739. function requestbing(option) {
  740. return new Promise((resolve, reject) => {
  741. let requestFunction = GM_xmlhttpRequest ? GM_xmlhttpRequest : GM.xmlHttpRequest
  742.  
  743. requestFunction({
  744. method: "get",
  745. headers: {
  746. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
  747. },
  748. ...option,
  749. onload: (response) => {
  750. let res = response.responseText
  751. resolve(res)
  752. },
  753. onerror: (error) => {
  754. reject(error);
  755. }
  756. });
  757. })
  758. }
  759.  
  760.  
  761. /*--- waitForKeyElements(): A utility function, for Greasemonkey scripts,
  762. that detects and handles AJAXed content.
  763. Usage example:
  764. waitForKeyElements (
  765. "div.comments"
  766. , commentCallbackFunction
  767. );
  768. //--- Page-specific function to do what we want when the node is found.
  769. function commentCallbackFunction (jNode) {
  770. jNode.text ("This comment changed by waitForKeyElements().");
  771. }
  772. IMPORTANT: This function requires your script to have loaded jQuery.
  773. */
  774. function waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector) {
  775. var targetNodes, btargetsFound;
  776.  
  777. if (typeof iframeSelector == "undefined")
  778. targetNodes = $(selectorTxt);
  779. else
  780. targetNodes = $(iframeSelector).contents()
  781. .find(selectorTxt);
  782.  
  783. if (targetNodes && targetNodes.length > 0) {
  784. btargetsFound = true;
  785. targetNodes.each(function () {
  786. var jThis = $(this);
  787. var alreadyFound = jThis.data('alreadyFound') || false;
  788.  
  789. if (!alreadyFound) {
  790. //--- Call the payload function.
  791. var cancelFound = actionFunction(jThis);
  792. if (cancelFound) btargetsFound = false;
  793. else jThis.data('alreadyFound', true);
  794. }
  795. });
  796. } else {
  797. btargetsFound = false;
  798. }
  799.  
  800. //--- Get the timer-control variable for this selector.
  801. var controlObj = waitForKeyElements.controlObj || {};
  802. var controlKey = selectorTxt.replace(/[^\w]/g, "_");
  803. var timeControl = controlObj[controlKey];
  804.  
  805. //--- Now set or clear the timer as appropriate.
  806. if (btargetsFound && bWaitOnce && timeControl) {
  807. //--- The only condition where we need to clear the timer.
  808. clearInterval(timeControl);
  809. delete controlObj[controlKey]
  810. } else {
  811. //--- Set a timer, if needed.
  812. if (!timeControl) {
  813. timeControl = setInterval(function () {
  814. waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector);
  815. }, 300);
  816. controlObj[controlKey] = timeControl;
  817. }
  818. }
  819. waitForKeyElements.controlObj = controlObj;
  820. }
  821. })