Bilibili 分享链接优化

简化Bilibili分享链接,移除多余的赛博狗屎并优化显示格式。

  1. // ==UserScript==
  2. // @name Bilibili 分享链接优化
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.8.0.8
  5. // @description 简化Bilibili分享链接,移除多余的赛博狗屎并优化显示格式。
  6. // @author 0808
  7. // @icon https://www.bilibili.com/favicon.ico
  8. // @match https://www.bilibili.com/video/*
  9. // @match https://www.bilibili.com/list/*
  10. // @license MIT
  11. // @grant none
  12. // ==/UserScript==
  13.  
  14. (function () {
  15. 'use strict';
  16.  
  17. /**
  18. * 简化分享链接
  19. * @param {string} text 原始分享内容
  20. * @returns {string} 简化后的内容
  21. */
  22. function simplifyText(text) {
  23. // 移除 "share_source" 和 "vd_source" 参数,同时保留 "?t" 和 "?p"
  24. let cleanedText = text.replace(/([&?])(share_source|vd_source)=[^&]*/g, (match, p1) => {
  25. return p1 === '?' ? '?' : ''; // 如果是问号,保留问号
  26. });
  27.  
  28. // 修复多余 "&" 和 "?&"
  29. cleanedText = cleanedText
  30. .replace(/&+/g, '&') // 合并多余的 "&"
  31. .replace(/\?&/, '?') // 修复 "?&"
  32. .replace(/[&?]$/, ''); // 去除末尾 "&"/"?"
  33.  
  34. // 提取 URL 部分
  35. const urlMatch = cleanedText.match(/https?:\/\/[^\s]+/);
  36. const url = urlMatch ? urlMatch[0] : '';
  37.  
  38. // 提取 t 和 p 参数
  39. const tMatch = url.match(/t=(\d+)/);
  40. const pMatch = url.match(/p=(\d+)/);
  41.  
  42. // 构建时间信息
  43. let timeInfo = '';
  44. if (tMatch) {
  45. const seconds = parseInt(tMatch[1], 10);
  46. const hours = Math.floor(seconds / 3600);
  47. const minutes = Math.floor((seconds % 3600) / 60);
  48. const remainingSeconds = seconds % 60;
  49.  
  50. // 构建时间字符串,只有小时数大于 0 时才显示小时
  51. timeInfo = `${hours > 0 ? `${hours}:` : ''}${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;
  52. }
  53.  
  54. // 构建分集信息
  55. let partInfo = '';
  56. if (pMatch) {
  57. partInfo = `P${pMatch[1]}`;
  58. }
  59.  
  60. // 提取标题部分
  61. const titleElement = document.querySelector('.inner-video-title .title-text');
  62. let title = titleElement ? titleElement.textContent.trim() : '视频标题';
  63.  
  64. // 构建最终标题格式
  65. let formattedTitle = `【${title}`;
  66. if (partInfo) formattedTitle += `| ${partInfo}`;
  67. if (timeInfo) formattedTitle += `| ${timeInfo}`;
  68. formattedTitle += '】';
  69.  
  70. console.log(`title: [${title}]; partInfo:[${partInfo}]; timeInfo:[${timeInfo}]; url:[${url}]`);
  71.  
  72. // 返回最终格式
  73. return `${formattedTitle} ${url}`;
  74. }
  75.  
  76. /**
  77. * 尝试绑定分享按钮事件
  78. */
  79. function tryBindShareButton() {
  80. console.log('尝试绑定分享按钮...');
  81. const shareButton = document.querySelector('.bar-right .copy-link');
  82.  
  83. if (shareButton) {
  84. console.log('找到分享按钮,绑定事件...');
  85. shareButton.addEventListener('click', async () => {
  86. try {
  87. // 等待剪贴板内容写入完成
  88. await new Promise(resolve => setTimeout(resolve, 100));
  89.  
  90. // 读取剪贴板内容
  91. const originalText = await navigator.clipboard.readText();
  92. console.log('原始剪贴板内容:', originalText);
  93.  
  94. // 处理并简化内容
  95. const simplifiedText = simplifyText(originalText);
  96. console.log('简化后的内容:', simplifiedText);
  97.  
  98. // 写入简化内容到剪贴板
  99. await navigator.clipboard.writeText(simplifiedText);
  100.  
  101. // 成功
  102. console.log('已将简化的分享链接复制到剪贴板:', simplifiedText);
  103. } catch (error) {
  104. console.error('处理剪贴板内容时出错:', error);
  105. alert('处理分享链接时出错');
  106. }
  107. });
  108. } else {
  109. console.log('未找到分享按钮,1秒后重试...');
  110. setTimeout(tryBindShareButton, 1000); // 1秒后重试
  111. }
  112. }
  113.  
  114. // 初始化脚本
  115. console.log('脚本已加载');
  116. tryBindShareButton();
  117. })();

QingJ © 2025

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