妖火复读机

妖火论坛每个回复后面加个复读按钮。

  1. // ==UserScript==
  2. // @name 妖火复读机
  3. // @namespace http://yaohuo.me/
  4. // @supportURL http://zgcwkj.cn
  5. // @version 20250225.01
  6. // @description 妖火论坛每个回复后面加个复读按钮。
  7. // @author zgcwkj
  8. // @match *://yaohuo.me/bbs*
  9. // @match *://www.yaohuo.me/bbs*
  10. // @grant none
  11. // @license MIT
  12. // ==/UserScript==
  13.  
  14. (function () {
  15. let domTextarea = document.querySelector('textarea');
  16. //发表回复
  17. window.reply = function (txt, face) {
  18. //填写内容
  19. domTextarea.value += txt;
  20. //选择表情
  21. for (let i = 0; i < document.forms.length; i++) {
  22. const form = document.forms[i];
  23. if (form.name == 'f') {
  24. form.face.value = face;
  25. break;
  26. }
  27. }
  28. //点击回复按钮
  29. let domInput = document.querySelectorAll('input');
  30. for (let i = domInput.length - 1; i > 0; i--) {
  31. const btn = domInput[i];
  32. if (btn.value == '快速回复' || btn.value == '发表回复') {
  33. btn.click();
  34. break;
  35. }
  36. }
  37. }
  38. //注入更多按钮
  39. let moreButn = [
  40. { css: 'background:#937a3e;color:#fff', showText: '吃', text: '吃', face: '', },
  41. { css: 'background:#937a3e;color:#fff', showText: '过', text: '过', face: '', },
  42. { css: 'background:#a7588d;color:#fffa28', showText: '感谢分享', text: '感谢分享', face: '谢谢.gif' },
  43. { css: 'background:#3e933e;color:#fff', showText: '哈哈', text: '哈哈', face: '哈哈.gif' },
  44. { css: 'background:#3e933e;color:#fff', showText: '恭喜', text: '恭喜', face: '么么哒.gif' },
  45. { css: 'background:#3e933e;color:#fff', showText: '大佬带带', text: '大佬带带', face: '耶耶.gif' },
  46. { css: 'background:#3e933e;color:#fff', showText: '大水比', text: '大水比', face: '被揍.gif' },
  47. ];
  48. let domForm = document.querySelector('.recontent');
  49. window.moreReplyBtn = function () {
  50. if (domForm != null) {
  51. //注入按钮
  52. let className = 'moreReplyButn';
  53. let isAddBtn = domForm.querySelector(`.${className}`);
  54. if (isAddBtn == null) {
  55. let btnHtml = '';
  56. let btnStyle = 'padding:5px;border-radius:5px;font-size:14px;';
  57. moreButn.forEach(f => {
  58. btnHtml += ` <a href='javascript:;' class='${className}' style='${btnStyle}${f.css}' onclick='window.reply("${generateFontUBB(f.text)}","${f.face}")'>${f.showText}</a>`;
  59. });
  60. domForm.innerHTML = `<div style='margin:0 10px 7px;'>${btnHtml}</div>` + domForm.innerHTML;
  61. }
  62. }
  63. }
  64. //注入复读按钮
  65. let isNewLayout = false;
  66. let getNewLayout = localStorage.getItem('customLayoutEnabled');
  67. if (getNewLayout !== null) isNewLayout = JSON.parse(getNewLayout);
  68. window.repeatBotBtn = function () {
  69. //获取当前主题版本
  70. let domTxt = {};
  71. if (isNewLayout) domTxt = document.querySelectorAll('.forum-post');//新主题
  72. else domTxt = document.querySelectorAll('.list-reply'); //旧主题
  73. //注入按钮
  74. let className = 'repeatBotButn';
  75. domTxt.forEach(f => {
  76. let domSpan = f.querySelector('.retext');
  77. let isAddBtn = domSpan.querySelector(`.${className}`);
  78. if (isAddBtn == null) {
  79. let txt = generateHtmlUbb(domSpan.innerHTML);
  80. let btnHtml = ` <a href='javascript:;' class='${className}' onclick='window.reply(\`${txt}\`)'>+1</a>`;
  81. domSpan.innerHTML += btnHtml;
  82. }
  83. });
  84. }
  85. //检查页面
  86. if (domTextarea != null) {
  87. //注入更多按钮
  88. window.moreReplyBtn();
  89. //注入复读按钮
  90. window.repeatBotBtn();
  91. //元素监视(减少性能损耗)
  92. const callback = function (mutationsList, observer) {
  93. //隐藏提示
  94. var showTipe = document.querySelector('#retip');
  95. if (showTipe != null) showTipe.style.display = 'none';
  96. //注入更多按钮
  97. window.moreReplyBtn();
  98. //注入复读按钮
  99. window.repeatBotBtn();
  100. };
  101. const observer = new MutationObserver(callback);
  102. observer.observe(domForm, { childList: true, subtree: true });
  103. }
  104. //HTML转UBB
  105. function generateHtmlUbb(html) {
  106. //创建一个临时 DOM 元素来解析 HTML
  107. const tempDiv = document.createElement('div');
  108. tempDiv.innerHTML = html;
  109. //获取所有的 img 元素并替换为 UBB 格式
  110. const imgElements = tempDiv.getElementsByTagName('img');
  111. for (let i = imgElements.length - 1; i >= 0; i--) {
  112. const img = imgElements[i];
  113. const ubbImage = `[img]${img.src}[/img]`;
  114. //用 UBB 格式替换 img 元素
  115. img.replaceWith(ubbImage);
  116. }
  117. //获取所有的 br 元素并替换为换行符
  118. const brElements = tempDiv.getElementsByTagName('br');
  119. for (let i = brElements.length - 1; i >= 0; i--) {
  120. const br = brElements[i];
  121. const newLine = document.createTextNode('\n');
  122. //用换行符替换 br 元素
  123. br.replaceWith(newLine);
  124. }
  125. //返回处理后的文本
  126. return tempDiv.innerText || tempDiv.textContent;
  127. }
  128. //生成彩色文字UBB
  129. function generateFontUBB(input) {
  130. let ubbString = '';
  131. for (const char of input) {
  132. const color = getRandomColor();
  133. ubbString += `[forecolor=${color}]${char}[/forecolor]`;
  134. }
  135. return ubbString;
  136. }
  137. //获取随机颜色
  138. function getRandomColor() {
  139. const letters = '0123456789ABCDEF';
  140. let color = '#';
  141. for (let i = 0; i < 6; i++) {
  142. color += letters[Math.floor(Math.random() * 16)];
  143. }
  144. return color;
  145. }
  146. })();

QingJ © 2025

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