🏠 Home 

B站动态首页展示所有正在直播列表

直接在动态首页展示所有的正在直播名单,而不是默认10个


Install this script?
  1. // ==UserScript==
  2. // @name B站动态首页展示所有正在直播列表
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.2.4
  5. // @description 直接在动态首页展示所有的正在直播名单,而不是默认10个
  6. // @author tuntun
  7. // @match https://t.bilibili.com/*
  8. // @icon https://www.google.com/s2/favicons?domain=bilibili.com
  9. // @grant GM_addStyle
  10. // @license MIT
  11. // ==/UserScript==
  12. (function () {
  13. 'use strict';
  14. GM_addStyle(`
  15. .bili-dyn-live-users {
  16. max-height: calc(100vh - 276px);
  17. overflow-y: overlay;
  18. }
  19. .bili-dyn-live-users::-webkit-scrollbar {
  20. width: 10px; /*滚动条的宽度*/
  21. height: 8px; /*滚动条的高度*/
  22. opacity: 0;
  23. }
  24. .bili-dyn-live-users::-webkit-scrollbar-track-piece {
  25. background-color: #fff; /*滚动条的背景颜色*/
  26. -webkit-border-radius: 0; /*滚动条的圆角宽度*/
  27. opacity: 0;
  28. }
  29. .bili-dyn-live-users::-webkit-scrollbar-thumb {
  30. height: 50px;
  31. background-color: #ccc;
  32. -webkit-border-radius: 4px;
  33. outline: 2px solid #fff;
  34. outline-offset: -2px;
  35. border: 2px solid #fff;
  36. display: none;
  37. }
  38. .bili-dyn-live-users::-webkit-scrollbar-thumb:hover {
  39. background-color: #9f9f9f;
  40. }
  41. .bili-dyn-live-users:hover::-webkit-scrollbar-thumb {
  42. display: block;
  43. }
  44. .bili-dyn-live-users::-webkit-scrollbar-track {
  45. display: none;
  46. }
  47. .bili-dyn-live-users::-webkit-scrollbar-track-piece {
  48. display: none;
  49. }
  50. `)
  51. const API = {
  52. // 封装get方法
  53. Get: async (props) => {
  54. const { url: baseUrl, params = {} } = props;
  55. let pStr = Object.keys(params).map((key) => {
  56. return `${key}=${params[key]}`;
  57. }).join('&');
  58. let url = `${baseUrl}${pStr !== '' ? '?' : ''}${pStr}`;
  59. try {
  60. let res = await fetch(url, {
  61. credentials: "include"
  62. });
  63. return (await res.json()).data;
  64. } catch (error) {
  65. console.error('Get Error', error);
  66. }
  67. },
  68. // 通过关键词获取视频数据
  69. getLiver: async (num = 0) => {
  70. try {
  71. let params = {};
  72. if (num !== 0) {
  73. params = {
  74. size: num
  75. }
  76. }
  77. let res = await API.Get({
  78. url: 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_live_users',
  79. params,
  80. });
  81. return res;
  82. } catch (error) {
  83. console.log('getLiver', error);
  84. }
  85. },
  86. getCard: async (mid) => {
  87. try {
  88. let res = await API.Get({
  89. url: 'https://api.bilibili.com/x/web-interface/card',
  90. params: {
  91. mid,
  92. photo: 'true',
  93. },
  94. });
  95. return res;
  96. } catch (error) {
  97. console.log('getCard', error);
  98. }
  99. }
  100. }
  101. const Tool = {
  102. // 大数转万
  103. formatBigNumber: (num) => {
  104. return num > 10000 ? `${(num / 10000).toFixed(2)}万` : num
  105. },
  106. // 字符串转DOM
  107. s2d: (string) => {
  108. return new DOMParser().parseFromString(string, 'text/html').body
  109. .childNodes[0]
  110. },
  111. }
  112. const getListItemTemplete = (prop) => {
  113. return `
  114. <div class="bili-dyn-live-users__item">
  115. <a href="${prop.link}" target="_blank" style="display: flex">
  116. <div class="bili-dyn-live-users__item__left">
  117. <div class="bili-dyn-live-users__item__face-container">
  118. <div class="bili-dyn-live-users__item__face">
  119. <div class="bili-awesome-img" style="background-image: url(${prop.face.slice(6)}@47w_47h_1c.webp);">
  120. </div>
  121. </div>
  122. </div>
  123. </div>
  124. <div class="bili-dyn-live-users__item__right">
  125. <div class="bili-dyn-live-users__item__uname bili-ellipsis">
  126. ${prop.uname}
  127. </div>
  128. <div class="bili-dyn-live-users__item__title bili-ellipsis">
  129. ${prop.title}
  130. </div>
  131. </div>
  132. </a>
  133. </div>
  134. `
  135. }
  136. const getCardTemplete = async (params) => {
  137. const {mid, x, y} = params;
  138. let data = await API.getCard(mid);
  139. let card = data.card;
  140. return `
  141. <div data-v-6c7ff250="" class="userinfo-wrapper" style="top: ${x}px; left: ${y}px">
  142. <div data-v-1b335720="" data-v-6c7ff250="" class="userinfo-content">
  143. <!---->
  144. <div data-v-1b335720="" class="bg" style="
  145. background-image: url('${data.space.l_img.slice(5)}@120h.webp');
  146. "></div>
  147. <a data-v-1b335720="" href="//space.bilibili.com/${mid}/dynamic" target="_blank" class="face">
  148. <img
  149. data-v-1b335720="" src="${card.face.slice(5)}@50w_50h_1c.webp" />
  150. ${card.official_verify.type !== -1 ? `<div data-v-1b335720="" class="verify-box type-${card.official_verify.type}"></div>` : ''}
  151. </a>
  152. <div data-v-1b335720="" class="info">
  153. <p data-v-1b335720="" class="user">
  154. <a data-v-1b335720="" target="_blank" href="//space.bilibili.com/${mid}/dynamic" class="name ${card.vip.status === 0 ? '' : 'vip'}"
  155. ${card.vip.status === 0 ? '' : 'style="color: rgb(251, 114, 153)"'}>${card.name}</a>
  156. <!----><a data-v-1b335720="" target="_blank" href="//www.bilibili.com/html/help.html#k_5"><img
  157. data-v-1b335720=""
  158. src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAI+SURBVHgB7ZcxbNNAFIb/M0lKsSNgadaSmVZstExIBQmkimaFDgixIhqYEDMgJpoCY1GnlhkhYAkrYu8e5mRBiDptCM31Xlq7cc7xpXGU1NL7Flt353vvv3v33hlgGIZhGIZhEovAGPizeHtFShQxIBJYu/jlW4neUxgDyoGCWrppDIiAXFKPoIDfi7euW8K6jxEgIadJBWFdykPYtvmbWhWtWk1r9wUIiFUp5RWMEHI++/Z93+N3Hj/C/q9KcA7/TeICRkw/Kx8Y7+jjrbBJs+sbOP/5K+xXr2Fisvi0PTb7YSPUIWsq157PWXuHzJ0CBkW6LlrVqtauHWJhO7ByucPOmVmYSF2e8R09k8/j//Z2oD+9cONoPtXftf2dtFSM/334ACfFQsJJvICx1IEwKHQn7i737KcQa34va+2nSICNs/eWI8e4SkT3GeMQGhaUJps/f2jt6blrkfViqAJSV+e1LabU2g/S3cFuaVWfc302UkDsECLDHhNLhcBBpCKXnps/HlutYdjEFlB/+SJQIekgUvEiIRn19KAMsvdxE8PGGEKTxSdaG8VrY2vzsLyrzOA+f9a+dngV/Jxa+U7I+XrpDaKgNBpmSzgOYgnILNwMbW+Wy/7NMEyER0Ot+t6WeeUpznvZimLgEOq+GXoiOsPJ6HzdRVy0HSBHdtV2i6lcz48odLqzjfctiaAz0KtydrJfqRhtmWyGhtA/g+EoyPHGCQ5rHFuEL4B+lIWUK0gAEuITGIZhGIZhmORzAFVa0dNZxTNHAAAAAElFTkSuQmCC"
  159. class="level" /></a>
  160. <span data-v-1b335720="" class="vip-label" style="
  161. background-color: rgb(251, 114, 153);
  162. color: rgb(255, 255, 255);
  163. "><span data-v-1b335720="" class="label-size">年度大会员</span></span>
  164. </p>
  165. <p data-v-1b335720="" class="social">
  166. <a data-v-1b335720="" href="//space.bilibili.com/7706705/fans/follow" target="_blank"><span data-v-1b335720=""
  167. class="follow">281</span><span data-v-1b335720="" class="label">关注</span></a><a data-v-1b335720=""
  168. href="//space.bilibili.com/7706705/fans/fans" target="_blank"><span data-v-1b335720=""
  169. class="fans">48.5万</span><span data-v-1b335720="" class="label">粉丝</span></a><span data-v-1b335720=""><span
  170. data-v-1b335720="" class="like">202.3万</span><span data-v-1b335720="" class="label">获赞</span></span>
  171. </p>
  172. <p data-v-1b335720="" class="verify-desc">
  173. <i data-v-1b335720="" class="verify-icon type--0"></i><span data-v-1b335720="">bilibili个人认证:bilibili
  174. 直播高能主播</span>
  175. </p>
  176. <p data-v-1b335720="" class="sign">
  177. ${card.sign}
  178. </p>
  179. </div>
  180. <div data-v-1b335720="" class="btn-box">
  181. <a data-v-1b335720="" class="like liked"><span data-v-1b335720="">已关注</span></a><a data-v-1b335720=""
  182. href="//message.bilibili.com/#whisper/mid7706705" target="_blank" class="message">发消息</a>
  183. </div>
  184. </div>
  185. </div>
  186. `
  187. }
  188. const init = async (isReflash = false) => {
  189. let firstGet = await API.getLiver();
  190. let liverNum = firstGet.count;
  191. if (isReflash || liverNum > 10) {
  192. let liveUpListDom = document.querySelector('.bili-dyn-live-users__body');
  193. if (liveUpListDom) {
  194. liveUpListDom.innerHTML = '';
  195. let allLiver = await API.getLiver(liverNum);
  196. // let addLiverItem = allLiver.items.slice(10);
  197. allLiver.items.forEach(item => {
  198. if (liveUpListDom !== null) {
  199. liveUpListDom.appendChild(Tool.s2d(getListItemTemplete(item)));
  200. }
  201. });
  202. document.querySelector('.bili-dyn-live-users__title span').innerHTML = `(${allLiver.items.length})`
  203. }
  204. }
  205. }
  206. const addRefleshBtn = () => {
  207. const header = document.querySelector('.bili-dyn-live-users__header');
  208. const more = document.querySelector('.bili-dyn-live-users__more');
  209. const refleshBtn = Tool.s2d(`
  210. <button style="background: white; color: #99a2aa; cursor: pointer; border: #99a2aa;font-size: 12px;">刷新</button>
  211. `);
  212. try {
  213. header.insertBefore(refleshBtn, more);
  214. refleshBtn.addEventListener('click', async () => {
  215. refleshBtn.innerHTML = '正在刷新';
  216. await init(true);
  217. refleshBtn.innerHTML = '刷新';
  218. });
  219. refleshBtn.onmouseover = () => {
  220. refleshBtn.style.color = '#00a1d6';
  221. }
  222. refleshBtn.onmouseout = () => {
  223. refleshBtn.style.color = '#99a2aa';
  224. }
  225. } catch (error) {
  226. console.log(error);
  227. }
  228. }
  229. window.addEventListener(
  230. 'load',
  231. async () => {
  232. await init();
  233. addRefleshBtn();
  234. },
  235. )
  236. })();