Greasy Fork 还支持 简体中文。

b-live-random-send-test

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

目前為 2023-10-21 提交的版本,檢視 最新版本

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.cn-greasyfork.org/scripts/447936/1268103/b-live-random-send-test.js

  1. // 1.5.8
  2.  
  3. const blobURL = URL.createObjectURL(
  4. new Blob(
  5. [
  6. '(',
  7. function () {
  8. const ids = {};
  9. // 监听message 开始执行定时器或者销毁
  10. self.onmessage = (e) => {
  11. switch (e.data.command) {
  12. case 'interval:start': // 开启定时器
  13. const intervalId = setInterval(() => postMessage({ message: 'interval:tick', id: e.data.id }), e.data.interval);
  14. // postMessage({ message: 'interval:started', id: e.data.id });
  15. ids[e.data.id] = intervalId;
  16. break;
  17. case 'interval:clear': // 销毁
  18. clearInterval(ids[e.data.id]);
  19. postMessage({ message: 'interval:cleared', id: e.data.id });
  20. delete ids[e.data.id];
  21. break;
  22. case 'timeout:start':
  23. const timeoutId = setTimeout(() => postMessage({ message: 'timeout:tick', id: e.data.id }), e.data.timeout);
  24. // postMessage({ message: 'timeout:started', id: e.data.id });
  25. ids[e.data.id] = timeoutId;
  26. break;
  27. case 'timeout:clear':
  28. clearTimeout(ids[e.data.id]);
  29. postMessage({ message: 'timeout:cleared', id: e.data.id });
  30. delete ids[e.data.id];
  31. break;
  32. }
  33. };
  34. }.toString(),
  35. ')()',
  36. ],
  37. { type: 'application/javascript' },
  38. ),
  39. );
  40. const worker = new Worker(blobURL);
  41. URL.revokeObjectURL(blobURL); //用完释放URL对象
  42. const workerTimer = {
  43. id: 0,
  44. callbacks: {},
  45. setInterval: (cb, interval, context) => {
  46. const id = ++workerTimer.id;
  47. workerTimer.callbacks[id] = { fn: cb, context: context };
  48. worker.postMessage({ command: 'interval:start', interval: interval, id: id });
  49. return id;
  50. },
  51. setTimeout: (cb, timeout, context) => {
  52. const id = ++workerTimer.id;
  53. workerTimer.callbacks[id] = { fn: cb, context: context };
  54. worker.postMessage({ command: 'timeout:start', timeout: timeout, id: id });
  55. return id;
  56. },
  57.  
  58. // 监听worker 里面的定时器发送的message 然后执行回调函数
  59. onMessage: (e) => {
  60. switch (e.data.message) {
  61. case 'interval:tick':
  62. case 'timeout:tick':
  63. const callbackItem = workerTimer.callbacks[e.data.id];
  64. if (callbackItem && callbackItem.fn) {
  65. callbackItem.fn.apply(callbackItem.context);
  66. }
  67.  
  68. break;
  69. case 'interval:cleared':
  70. case 'timeout:cleared':
  71. delete workerTimer.callbacks[e.data.id];
  72. break;
  73. }
  74. },
  75.  
  76. // 往worker里面发送销毁指令
  77. clearInterval: (id) => worker.postMessage({ command: 'interval:clear', id: id }),
  78. clearTimeout: (id) => worker.postMessage({ command: 'timeout:clear', id: id }),
  79. };
  80. worker.onmessage = workerTimer.onMessage.bind(workerTimer);