bilibili-live-random-send

定时从设置的字幕中随机取出一条在B站直播间发送,需先登录(不可用)B站账号

目前为 2022-07-28 提交的版本。查看 最新版本

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

  1. // ==UserScript==
  2. // @author Gamyou
  3. // @version 1.2.6
  4. // @note 22-07-29 1.2.6 修复初始化后的常量被赋值和没能初始化成功组件时系统提示加载超时的问题
  5. // @note 22-07-24 1.2.5 增加分组启用按钮,并优化设置面板样式
  6. // @note 22-07-23 1.2.4 修复弹幕分组数据都为空时,旧数据重复合并的BUG
  7. // @note 22-07-16 1.2.3 修复设置弹幕时旧(初始)数据没有清空的BUG
  8. // @note 22-06-24 1.2.2 优化部分代码
  9. // @note 22-06-20 1.2.1 修复定时停止不能再开始的BUG
  10. // @note 22-06-19 1.2.0 添加弹幕设置功能
  11. // ==/UserScript==
  12.  
  13.  
  14. (function () {
  15. window.autoSendDanmuModuleLoaded = false;
  16. let source = {
  17. version: 3,
  18. random: true,
  19. data1: { available: true, values: ['绿豆', '红豆', '黄豆', '蓝猫'] },
  20. data2: { available: true, values: ['红', '接天莲叶无穷碧,映日荷花别样红。'] },
  21. data3: { available: true, values: ['黄', '儿童急走追黄蝶,飞入菜花无处寻。'] },
  22. data4: { available: true, values: ['蓝', '沧海月明珠有泪,蓝田日暖玉生烟。'] },
  23. data5: { available: true, values: ['绿', '惟有绿荷红菡萏,卷舒开合任天真。'] }
  24. };
  25. let waiters = [], data = [], timer = null, signInContent = '签到';
  26. let count = 0, waitCount = 10, lastSent = 0, arrayIndex = 0, default_timeout = 600;
  27. let rdCheckbox, group1Checkbox, group2Checkbox, group3Checkbox, group4Checkbox, group5Checkbox;
  28. let dmButtonSend, dmInput, divSetting, dataText1, dataText2, dataText3, dataText4, dataText5, spanApplyTip;
  29. let storeDataCallback = (obj) => { }, removeDataCallback = (obj) => { }, notificationCallback = (obj) => { };
  30. const noticeTimeout = 10000,
  31. noticeImageUrl = 'https://www.bilibili.com/favicon.ico',
  32. initCss = () => {
  33. let linkElement = document.createElement('link');
  34. linkElement.rel = 'stylesheet';
  35. linkElement.href = 'https://unpkg.com/element-ui@2.15.9/lib/theme-chalk/index.css';
  36. document.head.appendChild(linkElement);
  37.  
  38. let customerStyle = document.createElement('style');
  39. customerStyle.setAttribute('type', 'text/css');
  40. customerStyle.innerHTML = '.danmu-group-title{font-size:14px;padding-left:2px;color:rgb(18, 56, 141);display:inline;margin-right:60%;vertical-align:middle;}.danmu-group-textarea{width:98%;min-height:100px;height:16%;margin:1px 0px 4px;border:0px;resize:none;}.el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#FFF;border:1px solid #DCDFE6;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;padding:12px 20px;font-size:14px;border-radius:4px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--mini.is-circle{padding:3px;}.el-button:focus,.el-button:hover{color:#409EFF;border-color:#c6e2ff;background-color:#ecf5ff}.el-icon-close.is-circle{padding:5px;color:#ff0000;border:1px solid #ff0000;margin-left:20px;}.el-icon-check.is-circle{padding:5px;color:#0000ff;border:1px solid #0000ff;margin-left:20px;}.random-check{display:inline-block;margin:0 5px;vertical-align:middle;}.random-check label{display:inline-block;vertical-align:middle;border:1px solid #bdc3c7;border-radius:60px;width:40px;height:18px;position:relative;transition:all .3s;}.random-check input{display:none;}.random-check label:before{width:14px;height:14px;content:"";display:inline-block;background-color:#bdc3c7;border-radius:100%;position:absolute;top:2px;left:4px;transition:all .3s;}.random-check :checked ~ label{background-color:#26b22b;border-color:#26b22b;}.random-check :checked ~ label:before{left:22px;background-color:#fff;}.danmu-group-check{display:inline-block;margin:0 5px;vertical-align:middle;}.danmu-group-check label{display:inline-block;vertical-align:middle;border:1px solid #bdc3c7;border-radius:60px;width:40px;height:18px;position:relative;transition:all .3s;}.danmu-group-check input{display:none;}.danmu-group-check label:before{width:14px;height:14px;content:"";display:inline-block;background-color:#bdc3c7;border-radius:100%;position:absolute;top:2px;left:4px;transition:all .3s;}.danmu-group-check :checked ~ label{background-color:#26b22b;border-color:#26b22b;}.danmu-group-check :checked ~ label:before{left:22px;background-color:#fff;}';
  41. document.head.appendChild(customerStyle);
  42. },
  43. getCurrentTimestamp = () => new Date().getTime(),
  44. send = (msg, index) => {
  45. let dmTextArea = document.getElementById('aside-area-vm').getElementsByClassName('chat-input border-box')[0];
  46. if (!dmTextArea) {
  47. alert('找不到输入弹幕文本框,请尝试刷新页面');
  48. return;
  49. }
  50.  
  51. let btnSend = document.getElementsByClassName('bl-button live-skin-highlight-button-bg live-skin-button-text bl-button--primary bl-button--small')[0];
  52. if (!btnSend) {
  53. alert('找不到发送按钮,请尝试刷新页面');
  54. return;
  55. }
  56. dmTextArea.value = msg;
  57. dmTextArea.dispatchEvent(new Event('input', { "bubbles": true, "cancelable": true }));
  58. btnSend.click();
  59. lastSent = getCurrentTimestamp();
  60. ++count;
  61. console.log('=================> ' + new Date().toLocaleString() + ' 弹幕发送成功 ' + count + ' 次,第【' + index + '】条数据 === ' + msg);
  62. },
  63. isNull = (str) => {
  64. if (!str || str == "")
  65. return true;
  66.  
  67. let regu = "^[ ]+$";
  68. let re = new RegExp(regu);
  69. return re.test(str);
  70. },
  71. randomSort = (arr) => {
  72. for (let i = 0; i < arr.length; i++) {
  73. const rdIndex = Math.floor(Math.random() * arr.length);
  74. const temp = arr[i];
  75. arr[i] = arr[rdIndex];
  76. arr[rdIndex] = temp;
  77. }
  78.  
  79. return arr;
  80. },
  81. clearWaiters = () => {
  82. for (let i = 0; i < waiters.length; i++) {
  83. clearInterval(waiters[i]);
  84. waiters[i] = null;
  85. }
  86.  
  87. waiters = [];
  88. },
  89. signIn = () => {
  90. let timestamp = new Date(new Date(new Date().setDate(new Date().getDate() + 1)).toDateString()).getTime() - getCurrentTimestamp();
  91. console.log('=================> 设置第二天凌晨签到定时器【' + timestamp + '】');
  92. setTimeout(() => {
  93. send(signInContent, 0);
  94. console.log('++++++++++++++++++++++> 完成签到发送,进入下一轮递归签到发送 <++++++++++++++++++++++');
  95. signIn();
  96. }, timestamp);
  97. },
  98. setCheckboxChecked = () => {
  99. rdCheckbox.checked = source.random;
  100. group1Checkbox.checked = source.data1.available;
  101. group2Checkbox.checked = source.data2.available;
  102. group3Checkbox.checked = source.data3.available;
  103. group4Checkbox.checked = source.data4.available;
  104. group5Checkbox.checked = source.data5.available;
  105. },
  106. openSetting = () => divSetting.style.display = 'block',
  107. closeSetting = () => {
  108. setCheckboxChecked();
  109. divSetting.style.display = 'none';
  110. },
  111. initData = () => {
  112. if (source.data1.values.length <= 0
  113. && source.data2.values.length <= 0
  114. && source.data3.values.length <= 0
  115. && source.data4.values.length <= 0
  116. && source.data5.values.length <= 0) {
  117. return data ? data : [];
  118. }
  119.  
  120. let result = [];
  121. result = source.data1.available ? result.concat(source.data1.values) : result;
  122. result = source.data2.available ? result.concat(source.data2.values) : result;
  123. result = source.data3.available ? result.concat(source.data3.values) : result;
  124. result = source.data4.available ? result.concat(source.data4.values) : result;
  125. result = source.data5.available ? result.concat(source.data5.values) : result;
  126. data = result;
  127. source.random ? data = randomSort(result) : arrayIndex = 0;
  128. },
  129. applySetting = () => {
  130. source.data1.values = isNull(dataText1.value) ? [] : dataText1.value.split('|');
  131. source.data2.values = isNull(dataText2.value) ? [] : dataText2.value.split('|');
  132. source.data3.values = isNull(dataText3.value) ? [] : dataText3.value.split('|');
  133. source.data4.values = isNull(dataText4.value) ? [] : dataText4.value.split('|');
  134. source.data5.values = isNull(dataText5.value) ? [] : dataText5.value.split('|');
  135. source.random = rdCheckbox.checked;
  136. source.data1.available = group1Checkbox.checked;
  137. source.data2.available = group2Checkbox.checked;
  138. source.data3.available = group3Checkbox.checked;
  139. source.data4.available = group4Checkbox.checked;
  140. source.data5.available = group5Checkbox.checked;
  141. initData();
  142. storeDataCallback(source);
  143. spanApplyTip.style.display = 'block';
  144. setTimeout(() => {
  145. spanApplyTip.style.display = 'none';
  146. divSetting.style.display = 'none';
  147. }, 1500);
  148. },
  149. danmu = () => {
  150. if (data.length < 1) {
  151. alert('请任意在一个分组里输入一条弹幕');
  152. return;
  153. }
  154. if (source.random)
  155. arrayIndex = Math.floor((Math.random() * data.length));
  156.  
  157. send(data[arrayIndex], arrayIndex);
  158. ++arrayIndex;
  159. if (arrayIndex >= data.length)
  160. arrayIndex = 0;
  161. },
  162. offOrOn = () => {
  163. let timeout = 0;
  164. if (timer) {
  165. console.log('=================> ' + new Date().toLocaleString() + ' 停止发送弹幕');
  166. clearInterval(timer);
  167. timer = null;
  168. console.log('=================> ' + new Date().toLocaleString() + ' 停止成功!!');
  169. dmButtonSend.style.background = 'rgba(217,157,27,1)';
  170. dmButtonSend.textContent = '开始';
  171. dmInput.removeAttribute("disabled");
  172. } else {
  173. timeout = isNull(dmInput.value) ? default_timeout * 1000 : dmInput.value * 1000;
  174. danmu();
  175. console.log('=================> ' + new Date().toLocaleString() + ' 开启定时器');
  176. timer = setInterval(danmu, timeout);
  177. console.log('=================> ' + new Date().toLocaleString() + ' 开启成功!!');
  178. dmButtonSend.style.background = '#ff0000';
  179. dmButtonSend.textContent = '停止';
  180. dmInput.setAttribute('disabled', 'disabled');
  181. }
  182. },
  183. pageFullyLoaded = () => {
  184. let divButton = document.getElementsByClassName('bottom-actions p-relative')[0];
  185. if (!divButton) {
  186. --waitCount;
  187. if (0 >= waitCount) {
  188. window.autoSendDanmuModuleLoaded = true;
  189. clearWaiters();
  190. notificationCallback({
  191. text: '没能找到发送按钮的所属元素,请刷新重试',
  192. title: '加载错误,点击刷新页面',
  193. image: noticeImageUrl,
  194. highlight: true,
  195. timeout: noticeTimeout,
  196. onclick: () => location.reload()
  197. });
  198. }
  199. return;
  200. }
  201. clearWaiters();
  202.  
  203. /* ----------------------------------------- head ----------------------------------------- */
  204. let divSettingTitle = document.createElement('div');
  205. divSettingTitle.textContent = '弹幕设置';
  206. divSettingTitle.style.textAlign = 'center';
  207. divSettingTitle.style.fontSize = '16px';
  208. divSettingTitle.style.fontWeight = '700';
  209. divSettingTitle.style.color = '#1c5adc';
  210. divSettingTitle.style.lineHeight = '30px';
  211.  
  212. let divTip = document.createElement('div');
  213. divTip.style.color = '#0b81cc';
  214. divTip.style.textAlign = 'center';
  215. divTip.style.fontStyle = 'italic';
  216. divTip.style.height = '25px';
  217. divTip.innerHTML = '任一分组内输入弹幕即可,多条用<span style="color:#dc6b07;margin:0 2px 0 4px;font-weight:700;font-style:normal;">竖线</span>分隔';
  218. /* ----------------------------------------- head ----------------------------------------- */
  219.  
  220. /* ----------------------------------------- textarea 1 ----------------------------------------- */
  221. let divText1 = document.createElement('div');
  222. divText1.textContent = '分组 1 :'
  223. divText1.classList.add('danmu-group-title');
  224.  
  225. group1Checkbox = document.createElement('input');
  226. group1Checkbox.type = 'checkbox';
  227. group1Checkbox.id = 'group1Checkbox';
  228. group1Checkbox.checked = true;
  229.  
  230. let lblGroup1Checkbox = document.createElement('label');
  231. lblGroup1Checkbox.setAttribute('for', 'group1Checkbox');
  232.  
  233. let divGroup1Checkbox = document.createElement('div');
  234. divGroup1Checkbox.classList.add('danmu-group-check');
  235. divGroup1Checkbox.appendChild(group1Checkbox);
  236. divGroup1Checkbox.appendChild(lblGroup1Checkbox);
  237.  
  238. dataText1 = document.createElement('textarea');
  239. dataText1.classList.add('danmu-group-textarea');
  240. dataText1.setAttribute('placeholder', '请输入弹幕,多条弹幕请用“|”分隔');
  241. /* ----------------------------------------- textarea 1 ----------------------------------------- */
  242.  
  243. /* ----------------------------------------- textarea 2 ----------------------------------------- */
  244. let divText2 = document.createElement('div');
  245. divText2.textContent = '分组 2 :'
  246. divText2.classList.add('danmu-group-title');
  247.  
  248. group2Checkbox = document.createElement('input');
  249. group2Checkbox.type = 'checkbox';
  250. group2Checkbox.id = 'group2Checkbox';
  251. group2Checkbox.checked = true;
  252.  
  253. let lblGroup2Checkbox = document.createElement('label');
  254. lblGroup2Checkbox.setAttribute('for', 'group2Checkbox');
  255.  
  256. let divGroup2Checkbox = document.createElement('div');
  257. divGroup2Checkbox.classList.add('danmu-group-check');
  258. divGroup2Checkbox.appendChild(group2Checkbox);
  259. divGroup2Checkbox.appendChild(lblGroup2Checkbox);
  260.  
  261. dataText2 = document.createElement('textarea');
  262. dataText2.classList.add('danmu-group-textarea');
  263. dataText2.setAttribute('placeholder', '请输入弹幕,多条弹幕请用“|”分隔');
  264. /* ----------------------------------------- textarea 2 ----------------------------------------- */
  265.  
  266. /* ----------------------------------------- textarea 3 ----------------------------------------- */
  267. let divText3 = document.createElement('div');
  268. divText3.textContent = '分组 3 :'
  269. divText3.classList.add('danmu-group-title');
  270.  
  271. group3Checkbox = document.createElement('input');
  272. group3Checkbox.type = 'checkbox';
  273. group3Checkbox.id = 'group3Checkbox';
  274. group3Checkbox.checked = true;
  275.  
  276. let lblGroup3Checkbox = document.createElement('label');
  277. lblGroup3Checkbox.setAttribute('for', 'group3Checkbox');
  278.  
  279. let divGroup3Checkbox = document.createElement('div');
  280. divGroup3Checkbox.classList.add('danmu-group-check');
  281. divGroup3Checkbox.appendChild(group3Checkbox);
  282. divGroup3Checkbox.appendChild(lblGroup3Checkbox);
  283.  
  284. dataText3 = document.createElement('textarea');
  285. dataText3.classList.add('danmu-group-textarea');
  286. dataText3.setAttribute('placeholder', '请输入弹幕,多条弹幕请用“|”分隔');
  287. /* ----------------------------------------- textarea 3 ----------------------------------------- */
  288.  
  289. /* ----------------------------------------- textarea 4 ----------------------------------------- */
  290. let divText4 = document.createElement('div');
  291. divText4.textContent = '分组 4 :'
  292. divText4.classList.add('danmu-group-title');
  293.  
  294. group4Checkbox = document.createElement('input');
  295. group4Checkbox.type = 'checkbox';
  296. group4Checkbox.id = 'group4Checkbox';
  297. group4Checkbox.checked = true;
  298.  
  299. let lblGroup4Checkbox = document.createElement('label');
  300. lblGroup4Checkbox.setAttribute('for', 'group4Checkbox');
  301.  
  302. let divGroup4Checkbox = document.createElement('div');
  303. divGroup4Checkbox.classList.add('danmu-group-check');
  304. divGroup4Checkbox.appendChild(group4Checkbox);
  305. divGroup4Checkbox.appendChild(lblGroup4Checkbox);
  306.  
  307. dataText4 = document.createElement('textarea');
  308. dataText4.classList.add('danmu-group-textarea');
  309. dataText4.setAttribute('placeholder', '请输入弹幕,多条弹幕请用“|”分隔');
  310. /* ----------------------------------------- textarea 4 ----------------------------------------- */
  311.  
  312. /* ----------------------------------------- textarea 5 ----------------------------------------- */
  313. let divText5 = document.createElement('div');
  314. divText5.textContent = '分组 5 :'
  315. divText5.classList.add('danmu-group-title');
  316.  
  317. group5Checkbox = document.createElement('input');
  318. group5Checkbox.type = 'checkbox';
  319. group5Checkbox.id = 'group5Checkbox';
  320. group5Checkbox.checked = true;
  321.  
  322. let lblGroup5Checkbox = document.createElement('label');
  323. lblGroup5Checkbox.setAttribute('for', 'group5Checkbox');
  324.  
  325. let divGroup5Checkbox = document.createElement('div');
  326. divGroup5Checkbox.classList.add('danmu-group-check');
  327. divGroup5Checkbox.appendChild(group5Checkbox);
  328. divGroup5Checkbox.appendChild(lblGroup5Checkbox);
  329.  
  330. dataText5 = document.createElement('textarea');
  331. dataText5.classList.add('danmu-group-textarea');
  332. dataText5.setAttribute('placeholder', '请输入弹幕,多条弹幕请用“|”分隔');
  333. /* ----------------------------------------- textarea 5 ----------------------------------------- */
  334.  
  335. /* ----------------------------------------- random chackbox ----------------------------------------- */
  336. let descCheckbox = document.createElement('span');
  337. descCheckbox.textContent = '随机';
  338. descCheckbox.title = '将合并所有分组数据,从中随机选出一条发送';
  339. descCheckbox.style.fontSize = '16px';
  340. descCheckbox.style.verticalAlign = 'middle';
  341. descCheckbox.style.marginRight = '4px';
  342. descCheckbox.style.color = '#095ca2';
  343. descCheckbox.style.cursor = 'help';
  344.  
  345. rdCheckbox = document.createElement('input');
  346. rdCheckbox.type = 'checkbox';
  347. rdCheckbox.id = 'rdmCheckbox';
  348. rdCheckbox.checked = true;
  349.  
  350. let lblCheckbox = document.createElement('label');
  351. lblCheckbox.setAttribute('for', 'rdmCheckbox');
  352.  
  353. let divCheckbox = document.createElement('div');
  354. divCheckbox.classList.add('random-check');
  355. divCheckbox.style.marginLeft = '10px';
  356. divCheckbox.appendChild(descCheckbox);
  357. divCheckbox.appendChild(rdCheckbox);
  358. divCheckbox.appendChild(lblCheckbox);
  359. /* ----------------------------------------- random chackbox ----------------------------------------- */
  360.  
  361. /* ----------------------------------------- div tip ----------------------------------------- */
  362. spanApplyTip = document.createElement('span');
  363. spanApplyTip.textContent = '设置成功'
  364. spanApplyTip.style.fontSize = '16px';
  365. spanApplyTip.style.color = '#128712';
  366. spanApplyTip.style.display = 'none';
  367.  
  368. let divApplyTip = document.createElement('div');
  369. divApplyTip.style.textAlign = 'center';
  370. divApplyTip.style.display = 'inline-block';
  371. divApplyTip.style.verticalAlign = 'middle';
  372. divApplyTip.style.width = '34%';
  373. divApplyTip.appendChild(spanApplyTip);
  374. /* ----------------------------------------- div tip ----------------------------------------- */
  375.  
  376. /* ----------------------------------------- appley and close button ----------------------------------------- */
  377. let btnApplySetting = document.createElement('i');
  378. btnApplySetting.setAttribute('title', '应用');
  379. btnApplySetting.classList.add('el-button');
  380. btnApplySetting.classList.add('el-icon-check');
  381. btnApplySetting.classList.add('is-circle');
  382. btnApplySetting.addEventListener('click', applySetting);
  383.  
  384. let btnCloseSetting = document.createElement('i');
  385. btnCloseSetting.setAttribute('title', '关闭');
  386. btnCloseSetting.classList.add('el-button');
  387. btnCloseSetting.classList.add('el-icon-close');
  388. btnCloseSetting.classList.add('is-circle');
  389. btnCloseSetting.addEventListener('click', closeSetting);
  390.  
  391. let divSettingButton = document.createElement('div');
  392. divSettingButton.style.display = 'inline-block';
  393. divSettingButton.style.verticalAlign = 'middle';
  394. divSettingButton.appendChild(btnApplySetting);
  395. divSettingButton.appendChild(btnCloseSetting);
  396. /* ----------------------------------------- appley and close button ----------------------------------------- */
  397.  
  398. /* ----------------------------------------- container ----------------------------------------- */
  399. let divBottomContainer = document.createElement('div');
  400. divBottomContainer.style.width = '100%';
  401. divBottomContainer.style.lineHeight = '35px';
  402. divBottomContainer.appendChild(divCheckbox);
  403. divBottomContainer.appendChild(divApplyTip);
  404. divBottomContainer.appendChild(divSettingButton);
  405.  
  406. let divContainer = document.createElement('div');
  407. divContainer.style.height = 'calc(98% - 30px - 25px)';
  408. divContainer.appendChild(divText1);
  409. divContainer.appendChild(divGroup1Checkbox);
  410. divContainer.appendChild(dataText1);
  411. divContainer.appendChild(divText2);
  412. divContainer.appendChild(divGroup2Checkbox);
  413. divContainer.appendChild(dataText2);
  414. divContainer.appendChild(divText3);
  415. divContainer.appendChild(divGroup3Checkbox);
  416. divContainer.appendChild(dataText3);
  417. divContainer.appendChild(divText4);
  418. divContainer.appendChild(divGroup4Checkbox);
  419. divContainer.appendChild(dataText4);
  420. divContainer.appendChild(divText5);
  421. divContainer.appendChild(divGroup5Checkbox);
  422. divContainer.appendChild(dataText5);
  423. divContainer.appendChild(divBottomContainer);
  424. /* ----------------------------------------- container ----------------------------------------- */
  425.  
  426. divSetting = document.createElement('div');
  427. divSetting.style.backgroundColor = '#d4f2e0';
  428. divSetting.style.borderRadius = '2px';
  429. divSetting.style.width = '100%';
  430. divSetting.style.height = '100%';
  431. divSetting.style.overflowY = 'auto';
  432. divSetting.style.position = 'absolute';
  433. divSetting.style.left = '0';
  434. divSetting.style.top = '0';
  435. divSetting.style.zIndex = '999';
  436. divSetting.style.display = 'none';
  437. divSetting.appendChild(divSettingTitle);
  438. divSetting.appendChild(divTip);
  439. divSetting.appendChild(divContainer);
  440.  
  441. let asideAreaVm = document.getElementById('aside-area-vm');
  442. asideAreaVm.appendChild(divSetting);
  443.  
  444. /* ----------------------------------------- function ----------------------------------------- */
  445. dmButtonSend = document.createElement('button');
  446. dmButtonSend.textContent = '开始';
  447. dmButtonSend.style.minWidth = '65px';
  448. dmButtonSend.style.height = '24px';
  449. dmButtonSend.style.fontSize = '12px';
  450. dmButtonSend.style.borderRadius = '4px';
  451. dmButtonSend.style.color = '#ffffff';
  452. dmButtonSend.style.background = 'rgba(217,157,27,1)';
  453. dmButtonSend.style.border = '0';
  454. dmButtonSend.style.cursor = 'pointer';
  455. dmButtonSend.addEventListener('click', offOrOn);
  456.  
  457. let beforeSpan = document.createElement('span');
  458. beforeSpan.textContent = '每';
  459. beforeSpan.style.color = '#ffffff';
  460. beforeSpan.style.fontSize = '12px';
  461. beforeSpan.style.marginLeft = '4px';
  462. beforeSpan.style.backgroundColor = '#ec6c1b';
  463.  
  464. dmInput = document.createElement('input');
  465. dmInput.value = default_timeout;
  466. dmInput.style.width = '25px';
  467. dmInput.style.height = '15px';
  468. dmInput.style.margin = '0 3px';
  469. dmInput.style.border = '0';
  470. dmInput.style.borderRadius = '3px';
  471. dmInput.setAttribute('oninput', "this.value = this.value.replace(/[^0-9]/g, '')");
  472.  
  473. let afterSpan = document.createElement('span');
  474. afterSpan.textContent = '秒发送';
  475. afterSpan.style.color = '#ffffff';
  476. afterSpan.style.fontSize = '12px';
  477. afterSpan.style.backgroundColor = '#ec6c1b';
  478. afterSpan.style.marginRight = '4px';
  479.  
  480. let iElement = document.createElement('i');
  481. iElement.classList.add('el-icon-setting');
  482.  
  483. let btnSetting = document.createElement('button');
  484. btnSetting.title = '设置';
  485. btnSetting.classList.add('el-button');
  486. btnSetting.classList.add('el-button--mini');
  487. btnSetting.classList.add('is-circle');
  488. btnSetting.addEventListener('click', openSetting);
  489. btnSetting.appendChild(iElement);
  490.  
  491. let div = document.createElement('div');
  492. div.style.position = 'absolute';
  493. div.appendChild(dmButtonSend);
  494. div.appendChild(beforeSpan);
  495. div.appendChild(dmInput);
  496. div.appendChild(afterSpan);
  497. div.appendChild(btnSetting);
  498. divButton.appendChild(div);
  499. /* ----------------------------------------- function ----------------------------------------- */
  500.  
  501. window.autoSendDanmuModuleLoaded = true;
  502. },
  503. arrayInfo = () => console.info(data),
  504. setDanmuData = (obj) => {
  505. if (obj) {
  506. if (source.version === obj.version)
  507. source = obj;
  508. else if (obj.version === 2) {
  509. source.data1 = obj.data1
  510. source.data2 = obj.data2
  511. source.data3 = obj.data3
  512. source.data4 = obj.data4
  513. source.data5 = obj.data5
  514. storeDataCallback(source);
  515. } else {
  516. source.data1.values = obj.data1 ? obj.data1 : source.data1.values;
  517. source.data2.values = obj.data2 ? obj.data2 : source.data2.values;
  518. source.data3.values = obj.data3 ? obj.data3 : source.data3.values;
  519. source.data4.values = obj.data4 ? obj.data4 : source.data4.values;
  520. source.data5.values = obj.data5 ? obj.data5 : source.data5.values;
  521. storeDataCallback(source);
  522. }
  523. }
  524.  
  525. setCheckboxChecked();
  526. dataText1.value = source.data1.values.join('|');
  527. dataText2.value = source.data2.values.join('|');
  528. dataText3.value = source.data3.values.join('|');
  529. dataText4.value = source.data4.values.join('|');
  530. dataText5.value = source.data5.values.join('|');
  531. initData();
  532. },
  533. storeDanmuData = (cb) => storeDataCallback = cb,
  534. removeDanmuData = (cb) => removeDataCallback = cb,
  535. setNotification = (cb) => notificationCallback = cb;
  536.  
  537. initCss();
  538. window.addEventListener("load", () => {
  539. waiters[waiters.length] = setInterval(pageFullyLoaded, 1500);
  540. window.arrayInfo = arrayInfo;
  541. window.setDanmuData = setDanmuData;
  542. window.storeDanmuData = storeDanmuData;
  543. window.removeDanmuData = removeDanmuData;
  544. window.setNotification = setNotification;
  545. signIn();
  546. });
  547. })();

QingJ © 2025

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