更好的B站分享按钮

替换原有分享按钮,点击后调用api生成短链接并复制页面标题和短链接到剪切板

目前為 2024-08-14 提交的版本,檢視 最新版本

// ==UserScript==
// @name         更好的B站分享按钮
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  替换原有分享按钮,点击后调用api生成短链接并复制页面标题和短链接到剪切板
// @match        *://www.bilibili.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // B站短链接 API 的 URL
    const SHORTEN_API_URL = 'https://api.bilibili.com/x/share/click'; 

    // 清理 URL 中的查询参数
    function cleanUrl(url) {
        const urlObj = new URL(url);
        urlObj.search = ''; // 移除所有查询参数
        return urlObj.toString();
    }

    // 清理标题中的常见后缀
    function cleanTitle(title) {
        const suffixes = ['_哔哩哔哩', 'bilibili', '_bilibili', '哔哩哔哩', '_单机游戏热门视频'];
        for (const suffix of suffixes) {
            const index = title.indexOf(suffix);
            if (index !== -1) {
                return title.substring(0, index).trim();
            }
        }
        return title.trim();
    }

    // 将文本复制到剪切板
    function copyToClipboard(text) {
        navigator.clipboard.writeText(text).then(() => {
            // 成功复制到剪切板后无需额外反馈
        }).catch(err => {
            console.error('复制失败: ', err);
        });
    }

    // 获取短链接
    async function getShortenedUrl(longUrl) {
        try {
            // 生成随机参数
            const build = Math.floor(Math.random() * (9000000 - 6000000 + 1)) + 6000000;
            const buvid = Array.from({ length: 32 }, () => Math.random().toString(36)[2]).join('') + 'infoc';
            const platform = ['android', 'ios'][Math.floor(Math.random() * 2)];
            const shareMode = Math.floor(Math.random() * 10) + 1;

            // 发送请求以获取短链接
            const response = await fetch(SHORTEN_API_URL, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'User-Agent': navigator.userAgent
                },
                body: new URLSearchParams({
                    build: build,
                    buvid: buvid,
                    oid: longUrl,
                    platform: platform,
                    share_channel: 'COPY',
                    share_id: 'public.webview.0.0.pv',
                    share_mode: shareMode
                }).toString()
            });

            const data = await response.json();
            if (data.data && data.data.content) {
                return data.data.content; // 返回短链接
            } else {
                throw new Error('B站没有返回短链接。');
            }
        } catch (error) {
            console.error('获取短链接时出错:', error);
            return longUrl; // 如果获取短链接失败,则返回原始长链接
        }
    }

    // 创建替代按钮
    function createReplacementButton() {
        const button = document.createElement('button');
        button.innerText = '点击复制分享链接';
        button.style.padding = '10px 20px';
        button.style.border = 'none'; // 无边框
        button.style.color = '#61666D'; // 初始文本颜色
        button.style.backgroundColor = 'transparent'; // 无背景颜色
        button.style.borderRadius = '5px';
        button.style.cursor = 'pointer';
        button.style.fontSize = '14px';
        button.style.fontWeight = 'bold';
        button.style.transition = 'color 0.3s'; // 平滑的颜色变化

        button.addEventListener('click', async (event) => {
            event.stopPropagation(); // 阻止事件冒泡

            // 改变按钮的文本颜色以表示成功
            button.style.color = '#00AEEC'; // 更改为蓝色
            setTimeout(() => {
                button.style.color = '#61666D'; // 一秒后恢复为原始颜色
            }, 1000);

            const title = cleanTitle(document.title);
            const url = cleanUrl(window.location.href);

            try {
                const shortUrl = await getShortenedUrl(url);
                const textToCopy = `【${title}】\n${shortUrl}`;
                copyToClipboard(textToCopy);
            } catch (error) {
                console.error('获取短链接失败:', error);
            }
        });

        return button;
    }

    // 替换原有分享按钮
    function replaceShareButton() {
        const shareButton = document.getElementById('share-btn-outer');
        if (shareButton) {
            // 移除原有按钮
            shareButton.remove();
            
            // 创建新的替代按钮并插入到页面中
            const replacementButton = createReplacementButton();
            const toolbar = document.querySelector('.video-toolbar-left-main'); // 选择工具栏容器
            if (toolbar) {
                toolbar.style.position = 'relative'; // 确保工具栏具有相对定位
                toolbar.appendChild(replacementButton);
            }
        } else {
            setTimeout(replaceShareButton, 500); // 如果未找到按钮,则每500ms重试一次
        }
    }

    // 初始调用函数开始检查并替换分享按钮
    replaceShareButton();
})();

QingJ © 2025

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