V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
hillerliao
V2EX  ›  分享创造

5 分钟开发浏览器脚本 防止儿子沉迷动画片

  •  
  •   hillerliao · 26 天前 · 3816 次点击

    最近让大模型帮忙开发了一个浏览器脚本(油猴脚本),实现控制 B 站动画片播放进度的目的。

    缘起

    最近儿子晚上洗澡后会闹着要看动画片才愿意上床睡觉。好说歹说,终于同意看一集就睡觉。

    考虑到视力保护和观看体验,我没有选择手机,而是选择电脑播放 B 站的动画片。屏幕大,而且无需担心出现可能不适合儿童的片头广告,体验非常友好。

    但动画片有长有短,太长的视频如果中途掐掉,会导致小孩愤怒和哭泣。所以只能每次拖动进度条到大概最后四分钟的位置。

    但每次都要操作还是显得麻烦,而且小孩以后说不定发现我在骗他,那就不太好了。

    既然是浏览器,何不借助大模型快速写个扩展脚本试试自动化操作?

    借助 Claude.ai 写脚本,进度控制有严重问题

    一开始我尝试用最近很火的 claude.ai ,写出来的油猴脚本能跳转到最后四分钟,但一播放就会反复回到最后四分钟位置,尝试两次修复,但给出的代码问题依旧。问句如下:

    开发一个针对 bilibili 站点视频播放控制的油猴脚本,我希望在播放视频时能够自动跳转到最后四分钟的位置开始播放。

    改用 kimi 重写,第一版核心功能非常完美

    也许是外国人的大模型也许对 b 站的代码结构不太熟悉?那就试试到处在发推广的 kimi 吧。

    我将差不多的问题发给 Kimi ,没想到包含核心功能的第一版代码顺利运行。

    // ==UserScript==
    // @name         Bilibili Auto Skip to Last Four Minutes
    // @namespace    https://tampermonkey.net/
    // @version      0.1
    // @description  Automatically skip to the last four minutes of a Bilibili video
    // @author       Your Name
    // @match        *:https://*.bilibili.com/*
    // @grant        none
    // ==/UserScript==
    
    (function() {
        'use strict';
    
        // 等待视频元素加载
        window.addEventListener('load', function() {
            // 获取视频播放器
            var player = document.querySelector('video');
            if (player) {
                // 检查视频时长
                player.addEventListener('loadedmetadata', function() {
                    var duration = player.duration;
                    // 计算跳转时间点,确保不超过视频总时长
                    var skipTime = Math.max(duration - 4 * 60, 0);
                    // 跳转到指定时间点
                    player.currentTime = skipTime;
                });
            }
        });
    })();
    

    小幅优化 兼顾小孩和大人需求

    事情到此算是解决了。不过有个小问题,脚本默认针对所有视频,如果是我自己要看 B 站的长视频,就得将进度条拖回起始位置,略显麻烦。

    为此,需要给脚本增加一个判断,只针对动画片自动跳转进度。 我尝试让 kimi 自己判断,它没法准确判断当前视频是否为动画片,只是提供了正确的思路,比如根据视频标签等进行判断,实际给的代码无效。

    如果视频标签标注了视频属于动画片,那么通过标签来判断就比较准确。稍微看了几个视频详情页的 HTML 源代码,里面确实有视频的标签信息,动画片的话一般会带上“动画片”这个标签。

    继续问 Kimi:

    判断是否为动画片的规则如下,
    
    比如读取视频详情页的源代码,https://www.bilibili.com/video/BV1nA411x7gT/?spm_id_from=333.788.recommend_more_video.3&vd_source=8b616b33732cab00e369c8f78a43bb13   找到 `[{"tag_id":26517,"tag_name":"动画短片","music_id":"","tag_type":"old_channel","jump_url":"","showDetail":false,"showReport":false,"timeOut":null},{"tag_id":42837,"tag_name":"益智","music_id":"","tag_type":"old_channel","jump_url":"","showDetail":false,"showReport":false,"timeOut":null},{"tag_id":285829,"tag_name":"早教","music_id":"","tag_type":"old_channel","jump_url":"","showDetail":false,"showReport":false,"timeOut":null},{"tag_id":17205837,"tag_name":"11 月打卡挑战 W2","music_id":"","tag_type":"old_channel","jump_url":"","showDetail":false,"showReport":false,"timeOut":null}]`
    
    这段代码,看看 tag_name 有没有 “动画”,如果有,判定为动画片
    

    返回的脚本为:

    // ==UserScript==
    // @name         Bilibili Auto Skip to Last Four Minutes for Animation
    // @namespace    https://tampermonkey.net/
    // @version      0.1
    // @description  Automatically skip to the last four minutes of a Bilibili animation video
    // @author       Kimi + 廖智海
    // @match        *:https://*.bilibili.com/video/*
    // @grant        none
    // ==/UserScript==
    
    (function() {
        'use strict';
    
        // 等待页面加载
        window.addEventListener('load', function() {
            // 模拟发送请求获取视频标签信息
            fetch('/api/view?id=' + BV_ID).then(response => response.json()).then(data => {
                // 检查是否存在 "动画" 标签
                const isAnimation = data.tags.some(tag => tag.tag_name.includes('动画'));
                if (isAnimation) {
                    // 获取视频播放器
                    var player = document.querySelector('video');
                    if (player) {
                        // 检查视频时长
                        player.addEventListener('loadedmetadata', function() {
                            var duration = player.duration;
                            // 计算跳转时间点,确保不超过视频总时长
                            var skipTime = Math.max(duration - 4 * 60, 0);
                            // 跳转到指定时间点
                            player.currentTime = skipTime;
                        });
                    }
                }
            }).catch(error => {
                console.error('Error fetching video tags:', error);
            });
        });
    
        // 获取 BV 号
        function BV_ID() {
            const urlParams = new URLSearchParams(window.location.search);
            return urlParams.get('bvid');
        }
    })();
    

    过了几天,发现脚本针对有些视频不生效。重新看了下源代码,不同视频可以依据不同的条件来判断是否为动画片。问句里加了一句:

    增加一个判断方法,如果 html 源代码里面有 <div class="firstchannel-tag" data-v-000c5325=""><a href="https://www.bilibili.com/v/douga/" class="tag-link">动画</a></div>,div 包含一个链接文字为‘动画’或者‘动画片’的页面,则认定为动画片。

    得到的代码把之前的判定方法替换了。于是又稍作说明:

    我指的是这个判定方法和之前那个 tag 名称的判定方法并存。

    更新代码如下:

    // ==UserScript==
    // @name         Bilibili Auto Skip to Last Four Minutes for Anime Videos
    // @namespace    https://tampermonkey.net/
    // @version      0.1
    // @description  Automatically skip to the last four minutes of a Bilibili video if it is tagged as an anime or contains a specific tag link
    // @author       Your Name
    // @match        *:https://*.bilibili.com/video/*
    // @grant        none
    // ==/UserScript==
    
    (function() {
        'use strict';
    
        // 等待页面加载
        window.addEventListener('load', function() {
            // 检查 script 标签内容中是否包含"动画"标签
            var scriptTags = document.getElementsByTagName('script');
            var isAnimeByTag = false;
            for (var i = 0; i < scriptTags.length; i++) {
                var scriptContent = scriptTags[i].textContent;
                if (scriptContent.includes('"tag_name":"动画短片"') || scriptContent.includes('"tag_name":"动画"')) {
                    isAnimeByTag = true;
                    break;
                }
            }
    
            // 检查页面中是否存在特定的 div 元素
            var isAnimeByLink = document.querySelector('div.firstchannel-tag a.tag-link[href*="douga/"]').textContent === '动画' || document.querySelector('div.firstchannel-tag a.tag-link[href*="douga/"]').textContent === '动画片';
    
            // 如果任一条件满足,则跳转到视频的最后四分钟
            if (isAnimeByTag || isAnimeByLink) {
                var player = document.querySelector('video');
                if (player) {
                    player.addEventListener('loadedmetadata', function() {
                        var duration = player.duration;
                        var skipTime = Math.max(duration - 4 * 60, 0);
                        player.currentTime = skipTime;
                    });
                }
            }
        });
    })();
    

    小孩更大以后,能够识破父亲的诡计,这一招应该会失灵,不过那是以后的事情,以后再说,先解决已知问题即可,无需过度优化。

    结语

    有了生成式 AI ,不会前端技术,只需描述清楚自己的需求,稍微知道一点原理,就能快速获得能够运行的简单脚本,给工作和生活带来便利。

    如果你有类似需求或体验,欢迎交流探讨。

    65 条回复    2024-09-14 22:27:49 +08:00
    shinession
        1
    shinession  
       26 天前   ❤️ 11
    OP 小时候也是被父母这么对待的, 孩子太可怜了
    kelvansun
        2
    kelvansun  
       26 天前
    @shinession 哈哈,同感,想想人活着真是可怜,小时候被父母管,大了被另一半管,老了被下一代管。
    10RR
        3
    10RR  
       26 天前 via iPhone   ❤️ 2
    4 分钟??老实讲,被这样阉割,我觉得非常不可理喻,如果是我,在知道真相之后,一定会把电视砸烂。

    说真的,用这样的欺骗来对待小孩子,真的可能造成深远和巨大的负面影响。
    kelvansun
        4
    kelvansun  
       26 天前   ❤️ 4
    @10RR 本质上与 GFW 的存在是同一个道理,都是为你好。
    kulous
        5
    kulous  
       26 天前 via Android
    小孩不能拿动画片哄着吧!
    Leon777
        6
    Leon777  
       26 天前 via iPhone
    这辈子有了
    victorkk
        7
    victorkk  
       26 天前   ❤️ 3
    这根本就不应该是 IT 技术问题,而是教育问题。
    1. 睡觉前不能接触屏幕,如果一定要看点什么,可以看书。
    2. 答应他白天时给他看长一点的视频。
    3. 主动挑一些动画电影给他看,慢慢让他懂得欣赏长的动画电影,不知道怎么挑就干脆按各类评分评分从上往下。
    4. 最后就是在孩子哭闹时,如果你觉得对的事情,温柔且坚定的坚持它。前提是你要 a 论证你坚持的事情是对的,这个真的很难,就像你现在觉得阉割动画片是对的,其实是值得商榷的一样。教育孩子,其实自己也在和孩子一起长大。
    andytao
        8
    andytao  
       26 天前   ❤️ 1
    如果是我,在知道真相之后,一定会把电视砸烂。
    zomco
        9
    zomco  
       26 天前
    如果是我,会用 AI 将动画片超时部分转译成英文
    dai269619118
        10
    dai269619118  
       26 天前   ❤️ 1
    你自己都知道看视频要看完整的 小孩子看动画片就只能看阉割的版本
    领导恶心下属 你是恶心自己的小孩
    Chad0000
        11
    Chad0000  
       26 天前 via iPhone   ❤️ 2
    若干年后:

    儿媳:你快就算了,前戏都没有
    儿子:我看视频都这样的啊
    249239432
        12
    249239432  
       26 天前   ❤️ 2
    老子一巴掌就解决的事情,你还要写个脚本?
    HongXinss
        13
    HongXinss  
       26 天前
    多做无用功
    awebird
        14
    awebird  
       26 天前   ❤️ 4
    质疑"绿坝",理解"绿霸",成为“绿爸”.. 😂
    andforce
        15
    andforce  
       26 天前
    // @author Kimi + 廖智海

    OP 名字应景:荒谬的智慧,海了去了~
    U2Fsd
        16
    U2Fsd  
       26 天前
    孩子这辈子有个好爹,幸福了🙊
    timethinker
        17
    timethinker  
       26 天前
    魔怔人
    syntaxj
        18
    syntaxj  
       26 天前   ❤️ 8
    没正确教育能力,只能拿自己仅有一点自以为是的手段去实现掌控感的心理安慰罢了.还要发 v 站找点认同感和成就感 ,把你能的,你要不直接 new 个 child 得了
    dododada
        19
    dododada  
       26 天前
    @victorkk 小孩子不懂的,只要有的看能和其他小朋友讨论就无所谓;另外 4 要温柔坚定的,坚定就行了,温柔扔掉吧,讲好了不听一巴掌就完事儿了。
    小树苗长歪了不剪枝,难道还要试试用哪种肥料才不会长歪么
    calmlyman
        20
    calmlyman  
       26 天前   ❤️ 4
    看了楼上的评论挺寒心的,楼主明明挺用心的,也很关爱孩子,也为了孩子健康,还发挥了自己特长。其他人却在泼冷水,殊不知,小时候我要是有这么聪明的爹,现在应该更幸福的。
    zdw189803631
        21
    zdw189803631  
       26 天前
    有点逆天
    DXpro
        22
    DXpro  
       26 天前
    分裂人的孩子 🤣
    vsitebon
        23
    vsitebon  
       26 天前
    其实比起这个,我还是觉得海外的这个用 NFC 变现允许且限制小孩看电影的方案显得更有趣一点: https://simplyexplained.com/blog/how-i-built-an-nfc-movie-library-for-my-kids/ 。而时长是直接约定好,或者直接限制在 NFC 卡片上
    sdwill
        24
    sdwill  
       26 天前
    堵不如疏。我现在都是对崽说:你想要可以,但是必须答应几个条件(比如只有 xx 分钟,时间到了就停)或者做个什么事(比如收拾玩具),要不就没有。你可以自行选择。如果是大哭大闹,那是绝对没有的,甚至还会惹我生气(生气就是一都比,哈哈哈)。

    经过几次后,慢慢的就养成默契了。想看动画片或者想玩会 switch 就会好好说,时间到了,就乖乖关了机器。偶尔几次恋恋不舍超时间也无伤大雅。
    joyhub2140
        25
    joyhub2140  
       26 天前
    哈哈,我告诉你我怎么对付这情况,小孩子熬夜看动画是吧,我周末专门陪小孩子看动画,我有手机边玩变监督,论熬夜爷们没输过谁,不准睡觉,让他看通宵,只准做这一件事,看动画,最后小孩子看腻了,想睡觉了,行,我说明晚继续,他就怕了,再也不敢熬夜看了。

    玩 switch 也一样,我暑假用同样招数给他玩 switch ,最后他玩吐了。

    现在对动画片和 switch 都没兴趣了,偶尔带同学过来一起玩 switch 。
    victorkk
        26
    victorkk  
       26 天前
    @calmlyman #20 呃...楼主用心是肯定的,这个话题先不谈。你居然感叹的是想要有个聪明的爹...这句话有点怪怪的。
    qwertty01
        27
    qwertty01  
       26 天前
    好好好,不能看动画片,只能看抖音短视频了
    calmlyman
        28
    calmlyman  
       26 天前
    @victorkk 有什么问题呢,我爹确实教育程度很低,60 年代的人哪有什么好的教育呀
    SkywalkerJi
        29
    SkywalkerJi  
       26 天前 via Android
    你自己看视频也看阉割版吗?
    wildmaker
        30
    wildmaker  
       26 天前 via iPhone
    @victorkk 我们一定看过同一本教育的书
    JinBin
        31
    JinBin  
       26 天前 via Android
    30 年后,5 分钟开发呼吸机脚本,保持心跳但父亲防止苏醒
    iOCZS
        32
    iOCZS  
       26 天前
    写得很好,下辈子别写了
    tyrantZhao
        33
    tyrantZhao  
       26 天前
    孩子太可怜了。
    SvenWong
        34
    SvenWong  
       26 天前
    那些 diss 的 OP 的不知道有几个是有孩子的,我只能说理解并同情你,但不是很认同你的做法,你可以尝试,改变睡前习惯,比如看看绘本不要看电子产品,或者选择小猪佩奇、拉布拉多警长这种短小的动画片,你也没说一定要控制在 4 分钟有什么原因,这些短小的一集在 3-8 分钟,最长也不会超过 10 分钟,这样就不会突然打断。
    victorkk
        35
    victorkk  
       26 天前   ❤️ 1
    @wildmaker #30 咳,做个好父母说起来容易做起来难,时常感觉自己做的还不好,有时控制不住真的会崩溃发火,太难了。
    Messmer
        36
    Messmer  
       26 天前
    孩子这辈子有了
    xing7673
        37
    xing7673  
       26 天前
    v 站没小孩的用户比例是真的大
    op 这已经是比较好的了
    小学前的小孩基本上懂不了啥
    fgwmlhdkkkw
        38
    fgwmlhdkkkw  
       26 天前   ❤️ 1
    一秒钟拔管,防止父亲沉迷地球 online 。哈哈哈
    yuzuhi
        39
    yuzuhi  
       26 天前
    你小孩投胎到你家真是倒了大霉
    qwertyzzz
        40
    qwertyzzz  
       26 天前
    @andytao 你也就现在嘴上说说 小时候你试试?
    Natsuno
        41
    Natsuno  
       26 天前
    你们都会错意了,看了下主页,OP 发这个主要是为了体现他作为一个产品如何折腾的,下一步就是关注公众号教你如何《培养产品思维,利用 AI 实现技术》了
    07aPzknB16ui9Cp3
        42
    07aPzknB16ui9Cp3  
       26 天前
    不如直接乱棍打死,小孩北欧,楼主省心
    Rehtt
        43
    Rehtt  
       25 天前 via Android
    不如找一部单集时间短的动画,推荐《布鲁伊》单集时长 6~7 分钟,b 站上有资源,而且内容也好评如潮,作为小孩英语启蒙也不错
    assiadamo
        44
    assiadamo  
       25 天前
    不如看各种劣质国产如 XX 的故事,让小孩对动画产生阴影,就不再看了
    viviwon
        45
    viviwon  
       25 天前
    @kelvansun #4 主要是丧失了选择的权利,国外乱七八糟胡言乱语的真是不少
    Vtwoguest
        46
    Vtwoguest  
       25 天前 via iPhone
    医生:您的父亲病情似乎很严重 需要立即输液
    儿子:可以 但是我要求只输四分钟
    rekulas
        47
    rekulas  
       25 天前
    哈哈,同款问题,同款爹和儿子,同样是 b 站 我现在是手动选择 6 分钟左右视频给他看
    piero66
        48
    piero66  
       25 天前 via Android
    堵不如疏
    rouxi
        49
    rouxi  
       25 天前
    做个人 ,虽然说要限制。但是可以好好沟通
    ibcker
        50
    ibcker  
       25 天前
    坏爸爸
    kelvansun
        51
    kelvansun  
       25 天前
    @viviwon 对于大部分人来说是感觉不到 GFW 的存在,对于想看看外面的世界的人来说靠技术档也是档不住的。
    JoryJoestar
        52
    JoryJoestar  
       25 天前
    夸张,我还以用 AI 自动搜 4-5 分钟故事呢
    Sawyerhou
        53
    Sawyerhou  
       25 天前
    等你孩子长大了,知道你这么干,可能会记你一辈子,谨慎处理。
    viviwon
        54
    viviwon  
       24 天前
    @kelvansun #51 感觉国家也只是想不让这件事变得太容易,这样就已经让很多人出不去了。很多大学图书馆甚至寝室都是可以直接上外网的
    wzdsfl
        55
    wzdsfl  
       24 天前
    希望以后不会成为 OP 这样的家长
    ccaa5j
        56
    ccaa5j  
       24 天前
    可怜的孩子,有这样的父亲真的很不幸,希望你老了,你儿子也这样对你
    kelvansun
        57
    kelvansun  
       24 天前
    @viviwon 毕竟大部分人是听风就是雨的。 教育网不过 GFW 吗?
    viviwon
        58
    viviwon  
       24 天前
    @kelvansun #57 应该是部分。之前在图书馆突然发现能直接打开谷歌,试了下油管居然也可以
    hillerliao
        59
    hillerliao  
    OP
       23 天前
    @rekulas 你的解决方案更好。
    hillerliao
        60
    hillerliao  
    OP
       23 天前   ❤️ 1
    感谢大家的提醒,是要找到一个更好的不会欺骗孩子的解决方案。
    hillerliao
        61
    hillerliao  
    OP
       23 天前
    @vsitebon 谢谢分享,学习一下。
    hillerliao
        62
    hillerliao  
    OP
       23 天前
    @10RR 谢谢提醒,反思中。。。
    hillerliao
        63
    hillerliao  
    OP
       23 天前
    @10RR 反思中。。。
    hillerliao
        64
    hillerliao  
    OP
       23 天前
    https://search.bilibili.com/all?vt=11527116&keyword=123&from_source=webtop_search&spm_id_from=333.1007&search_source=5&tids=1&duration=1

    试了一下 B 站的站内搜索,市场的筛选项只有 10 分钟以下,没有 5 分钟以下的。
    10RR
        65
    10RR  
       23 天前 via iPhone
    @hillerliao
    嗯,确实很难,但是希望可以逐步找到更好的办法吧。
    我觉得基础应该建立在诚实、信任、沟通、约定上,而不是欺骗。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5442 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 101ms · UTC 06:41 · PVG 14:41 · LAX 23:41 · JFK 02:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.