bilibili直播间简易版独轮车

这是bilibili直播间简易版独轮车

  1. // ==UserScript==
  2. // @name bilibili直播间简易版独轮车
  3. // @namespace https://greasyfork.org/zh-TW/users/725704
  4. // @version 1.0.2
  5. // @description 这是bilibili直播间简易版独轮车
  6. // @author quiet
  7. // @match *://live.bilibili.com/*
  8. // @grant GM_setValue
  9. // @grant GM_getValue
  10. // @grant GM_deleteValue
  11. // @require https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js
  12. // ==/UserScript==
  13.  
  14. var $ = window.jQuery;
  15. var Msg = [];
  16. const scriptInitVal = {Msg:'',MsgSendInterval:1}
  17. for(let initVal in scriptInitVal) {
  18. if(GM_getValue(initVal)===undefined) GM_setValue(initVal,scriptInitVal[initVal]);
  19. }
  20.  
  21. var sendMsg = false;
  22.  
  23. (function() {
  24. var check = setInterval(() => {
  25. var input = document.getElementsByClassName('chat-input border-box')[0];
  26. if (input !== undefined) {
  27. var div = document.getElementsByClassName('bottom-actions p-relative')[0];
  28. var btn = document.createElement('button');
  29. btn.innerHTML = '独轮车面版';
  30. btn.style.background = '#23ade5';
  31. btn.style.color = 'white';
  32. btn.style.cursor = 'pointer';;
  33. btn.style.padding = '6px 12px';
  34. btn.style.border = '0';
  35. btn.style.borderRadius = '4px';
  36. div.appendChild(btn);
  37. var list = document.createElement('fieldset');
  38. list.style.position = 'absolute';
  39. list.style.zIndex = '1000';
  40. list.style.background = 'white'
  41. list.style.display = 'none';
  42. list.style.minWidth = '50px';
  43. list.style.left = '1094px';
  44. list.style.top = '809px';
  45. list.style.height = '300px';
  46. list.style.width = '250px';
  47. list.innerHTML = `<div style="margin:10px; height:80px; width: 200px;">
  48. <button class="startSendBtn" style="background:#757575; cursor:pointer; border-radius: 4px; padding: 3px 6px;">开启独轮车</button>
  49. <textarea class="MsgList" placeholder="在这输入弹幕,每一句不可超过20字(否则无法发送),每次发送一句。" style="height: 100px; width: 220px; resize: none;"></textarea>
  50. <div class="MsgCount" style="display:inline;"></div><div style="display:inline;"> 发送弹幕间隔:</div>
  51. <input id="MsgSendInterval" style="display:inline; width:25px;" autocomplete="off" type="number" min="0" value="${GM_getValue('MsgSendInterval')}">
  52. <div style="display:inline;">秒</div>
  53. <br>
  54. <div>日誌:</div>
  55. <textarea class="MsgLogs" style="height: 100px; width: 220px; resize: none;" readonly></textarea>
  56. </div>`;
  57. let i;
  58. document.body.appendChild(list);
  59. var startSendBtn = document.getElementsByClassName('startSendBtn')[0];
  60. startSendBtn.addEventListener('click',() => {
  61. if (!sendMsg) {
  62. sendMsg = true;
  63. startSendBtn.textContent = '关闭独轮车';
  64. startSendBtn.style.background = '#23ade5';
  65. }else{
  66. sendMsg = false;
  67. startSendBtn.textContent = '开启独轮车';
  68. startSendBtn.style.background = '#757575';
  69. };
  70. });
  71. btn.addEventListener('click',() => {
  72. if (list.style.display === 'none') {$(list).slideDown();}else{$(list).slideUp();};
  73. });
  74. var MsgInput = document.getElementsByClassName('MsgList')[0];
  75. var MsgCount = document.getElementsByClassName('MsgCount')[0];
  76. var MsgIntervalInput = document.getElementById('MsgSendInterval');
  77. MsgInput.addEventListener('input',() => {
  78. Msg = MsgInput.value.split('\n');
  79. if (MsgInput.value === '') {
  80. MsgCount.textContent = `共0个弹幕`;
  81. }else{MsgCount.textContent = `共${Msg.length}个弹幕`;};
  82. GM_setValue('Msg', MsgInput.value);
  83. });
  84. MsgIntervalInput.addEventListener('input',()=>{
  85. if(!(parseInt(MsgIntervalInput.value)>=0)) MsgIntervalInput.value = 0;
  86. GM_setValue('MsgSendInterval',MsgIntervalInput.value);
  87. });
  88. let MsgValue = GM_getValue('Msg');
  89. MsgInput.value = MsgValue;
  90. MsgValue = MsgValue.split('\n');
  91. for (i = 0; i < MsgValue.length; i++) {
  92. Msg.push(MsgValue[i]);
  93. };
  94. if (MsgInput.value === '') {
  95. MsgCount.textContent = `共0个弹幕`;
  96. }else{MsgCount.textContent = `共${Msg.length}个弹幕`;};
  97. loop();
  98. clearInterval(check);
  99. };
  100. },100);
  101. })();
  102. async function loop() {
  103. let count = 0;
  104. let i;
  105. let MsgLogs = document.getElementsByClassName('MsgLogs')[0];
  106. let shortUid = window.location.href.split('live.bilibili.com/')[1];
  107. let room = await fetch(`http://api.live.bilibili.com/room/v1/Room/room_init?id=${shortUid}`,{
  108. method: 'GET',
  109. credentials: 'include'
  110. })
  111. let roomid = await room.json();
  112. roomid = roomid['data']['room_id'];
  113. let scrf = document.cookie.split(';').map(c=>c.trim()).filter(c => c.startsWith('bili_jct='))[0].split('bili_jct=')[1];
  114. while (true) {
  115. if (sendMsg === true) {
  116. let MsgSendInterval = GM_getValue('MsgSendInterval');
  117. for (i = 0; i < Msg.length; i++) {
  118. if (sendMsg === true) {
  119. let send = await fetch('https://api.live.bilibili.com/msg/send',{
  120. method: 'POST',
  121. credentials: 'include',
  122. headers: {
  123. 'accept': 'application/json, text/javascript, */*; q=0.01',
  124. 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
  125. },
  126. body: `color=16777215&fontsize=25&mode=1&msg=${Msg[i]}&rnd=16082868&roomid=${roomid}&csrf_token=${scrf}&csrf=${scrf}`
  127. });
  128. let sendApiRes = await send.json();
  129. if (sendApiRes['message'] !== "") {
  130. MsgLogs.value = MsgLogs.value + `发送弹幕:【${Msg[i]}】失败,原因:${sendApiRes['message']}。\n`;
  131. }else{MsgLogs.value = MsgLogs.value + `发送弹幕:【${Msg[i]}】成功\n`;};
  132. MsgLogs.scrollTop = MsgLogs.scrollHeight;
  133. await new Promise(r => setTimeout(r,MsgSendInterval*1000));
  134. };
  135. };
  136. count += 1;
  137. MsgLogs.value = MsgLogs.value + `第${count}轮弹幕发送完成\n`;
  138. MsgLogs.scrollTop = MsgLogs.scrollHeight;
  139. } else {let count = 0;;await new Promise(r => setTimeout(r,1000));};
  140. };
  141. };