上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

修改b站up的名字以及如何使用工具库

[复制链接]
  • TA的每日心情
    无聊
    2023-11-2 17:37
  • 签到天数: 275 天

    [LV.8]以坛为家I

    114

    主题

    453

    回帖

    974

    积分

    荣誉开发者

    积分
    974

    荣誉开发者油中2周年卓越贡献生态建设者

    发表于 2023-6-17 08:27:25 | 显示全部楼层 | 阅读模式
    安装此脚本 如何安装? 脚本问题反馈 给脚本评分 查看代码

    本帖最后由 wwwwwllllk 于 2023-6-17 08:30 编辑

    写文章动机

    本来是不打算写的,因为脚本简单加上可能对别人几乎是没用的。但是用的过程发现想的太简单了。居然用到了MutationObserver来监听节点变化,之前用的时候也踩坑请教了道哥。但是偷懒没有写成博客分享。今天用的过程又翻了一下之前的笔记。所以正好通过脚本来分享一下,顺便写到了工具库虽然其实也没做多大贡献。

    MutationObserver注意事项

    主要是理解config的配置

    config = { attributes: true, childList: false, subtree: true };

    attributes:一个布尔值,表示是否监听目标节点的属性变化。
    childList:一个布尔值,表示是否监听目标节点的子节点变化。
    subtree:一个布尔值,表示是否监听目标节点的后代节点变化。

    所以我们为了节省性能,如果理解了配置的意思我们可以直接定位到目标节点,或者同时监测子节点,subtree正常为false即可,假如我的需求就是监听某个节点,但是你监听了后代节点,敲好别的地方也有相同的类名,这个时候就可能会把我们不需要监听的内容也监听到了

    工具库

    我把MutationObserver写成了工具库,使用的时候我们就不需要还得从百度或者别的地方粘贴了。
    // @require https://scriptcat.org/lib/1105/1.0.0/uniqueObserver.js

    // 写上自己监听的节点
    const nextPlay = document.querySelector('#next_play_btn');
    // 自己的配置
    const config = { attributes: true, childList: true, subtree: false };
    const observer = observeNodeChanges(nextPlay, config, function(mutation) {
      // 监听的操作
      console.log('节点发生变化了', mutation.type);
    });

    写文章怕代码多,大家懒得看,封装了一下

    (我平时是不会封装的,因为脚本很简单没有必要,大部分脚本我不会频繁的修改)

    // ==UserScript==
    // @name         修改某个up的名字
    // @namespace    https://bbs.tampermonkey.net.cn/
    // @version      0.1.2
    // @description  因为这个up改的昵称自己看了很难受,但是b站没有改备注的功能,所以我们写个脚本来实现
    // @author       You
    // @match        https://www.bilibili.com/video/*
    // @require https://scriptcat.org/lib/1105/1.0.0/uniqueObserver.js
    // ==/UserScript==
    
    (function () {
        'use strict';
        setTimeout(() => {
            function modifyUpNameSliber() {
                if (document.querySelectorAll('.upname') && document.querySelectorAll('.upname').length > 0) {
                    document.querySelectorAll('.upname a span').forEach((node) => {
                        if (node.innerText.indexOf('神奇宝鳖') > -1) {
                            node.innerText = '我是小志'
                        }
                    })
                }
            }
            const nextPlay = document.querySelector('.next-play')
            const config = { attributes: true, childList: true, subtree: false };
            const observerUpName = observeNodeChanges(nextPlay, config, function (mutation) {
                console.log('开始播放下一个视频了', mutation.type);
                modifyUpNameSliber()
            });
            let upMessage = document.querySelector('.up-detail-top a').innerText
            if (upMessage.indexOf('神奇宝鳖') > -1) {
                document.querySelector('.up-detail-top a').innerText = '我是小志'
            }
            modifyUpNameSliber()
    
        }, 3000)
    })();
    

    之前代码(感觉代码也不多)

    // ==UserScript==
    // @name         修改某个up的名字
    // @namespace    https://bbs.tampermonkey.net.cn/
    // @version      0.1.2
    // @description  因为这个up改的昵称自己看了很难受,但是b站没有改备注的功能,所以我们写个脚本来实现
    // @author       You
    // @match        https://www.bilibili.com/video/*
    // ==/UserScript==
    
    (function() {
        'use strict';
        setTimeout(() => {
            const observerUpName = new MutationObserver(function(mutations) {
                mutations.forEach(function(mutation) {
                    console.log('开始播放下一个视频了', mutation.type);
                    if (document.querySelectorAll('.upname') && document.querySelectorAll('.upname').length > 0) {
                        document.querySelectorAll('.upname a span').forEach((node) => {
                            if(node.innerText.indexOf('神奇宝鳖') > -1) {
                                node.innerText = '我是小志'
                            }
                        })
                     }
                });    
            });
            const nextPlay = document.querySelector('.next-play')
            const config = { attributes: true, childList: true, subtree: false };
            observerUpName.observe(nextPlay, config)
            let upMessage = document.querySelector('.up-detail-top a').innerText
            if (upMessage.indexOf('神奇宝鳖') > -1) {
                document.querySelector('.up-detail-top a').innerText = '我是小志'
            }
            if (document.querySelectorAll('.upname') && document.querySelectorAll('.upname').length > 0) {
                document.querySelectorAll('.upname a span').forEach((node) => {
                    if(node.innerText.indexOf('神奇宝鳖') > -1) {
                        node.innerText = '我是小志'
                    }
                })
            }
        }, 3000)
    })();
    接脚本定制
    I frequently record, because want to leave something.

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表