位置: IT常识 - 正文

关于B站(bilibili)对未登录用户视频观看进行暂停和弹窗的分析与简单解决方案(关于B站bilibili名字的由来)

编辑:rootadmin
关于B站(bilibili)对未登录用户视频观看进行暂停和弹窗的分析与简单解决方案 关于B站(bilibili)对未登录用户视频观看进行暂停和弹窗的分析与简单解决方案情况介绍简要分析初步的解决方案总结(太长不看点这里)情况介绍

推荐整理分享关于B站(bilibili)对未登录用户视频观看进行暂停和弹窗的分析与简单解决方案(关于B站bilibili名字的由来),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:关于b站的毕业论文,关于B站bilibili名字的由来,关于b站的问题,关于b站的问题,关于b站官网,关于b站官网,关于b站的调查问卷分析,关于b站下列说法正确的有,内容如对您有帮助,希望把文章链接给更多的朋友!

于近日的某次更新后,B站(bilibili)网页端出现了一个新功能:当用户没有登录时,将对每个视频间隔性地(目前的情况是视频开始播放后的1分钟)进行自动暂停并弹出登录窗口。不得不说,这个功能使得使用体验极差,每个视频都要经历暂停和弹窗实在是让人不爽。有些时候,仅仅只是在B站上看几个视频,或是挂着听听歌,再者也可能试着避开大数据推送和账号的绑定。总之,登录也许不是时时刻刻必须的,而通过恶心用户、严重降低用户体验来迫使用户进行某些操作从而为在线或推广等做出贡献,也许并不是一个好主意。通过一些简单的探索和尝试,这里给出一个非常初级的分析和解决方案,供没有意愿次次登录的用户们参考。

简要分析关于B站(bilibili)对未登录用户视频观看进行暂停和弹窗的分析与简单解决方案(关于B站bilibili名字的由来)

通过浏览器F12的网络模块,暂停弹窗事件发生的前后没有特殊的网络请求,可以初步判断出这个功能是在页面加载时引入的JS实现的,并不存在使用与远程服务器交互的内容,如使用心跳包报告用户情况并实时加载JS等,暂时没有发现。也就是说,不太能通过阻止网页向某个URL发送请求或是修改数据包内容来解决这一问题。 既然很可能是网页加载时引入的JS实现的,于是通过edge禁止部分JS加载的debug模式,排查出所属的文件。经验证,该功能存在于来自s1.hdslb.com的stardust-video.****的js文件。当禁止该js加载时,不再出现自动暂停和弹窗的情况。然而,虽然视频可以继续播放,弹幕也没有问题,但是评论区、头像、及右侧推送区的加载出现了异常。这也是可以预见的,很显然是一个压缩后的综合性JS文件,并不可能单独实现这一功能。也因此,禁止该文件的引入虽然能解决所述的问题,但仍然影响着用户的正常使用和体验。 于是想到换一下思路,如通过重写同名函数覆盖该功能。遗憾的是该文件是经过压缩混淆的生产环境文件,内容太多太杂,实现的功能较多,难以定位(例如,搜索setTimeoutset和setInterval可以得到成百上千的结果)。尝试过简单的反混淆工具,也未能得到易于解读的效果。 由于精力有限,上面几条不易走通的道路没有继续尝试了,想做一个简单的用户脚本自己凑合用吧。虽然B站使用了特殊的架构,与一般的video属性不太一致,但是模拟点击操作总是没问题的,能使得视频继续播放就是。唯一需要操心的是如何分别用户自行的暂停和被脚本进行的暂停,一个简单的方式就是判断弹窗,用户自行暂停一般不会出现弹窗,而网页进行的暂停和弹窗总是伴随出现的。

初步的解决方案

根据以上的分析,一个简单的思路就是判断视频暂停的同时是否出现了B站的登录弹窗。通过审查元素可以发现,当视频暂停时,一些模块的class会出现变化,可以利用这一点,监听该元素的属性变化。经过检查,最后发现比较适合的是一个class为bpx-player-row-dm-wrap的元素,其在暂停和播放状态切换只涉及到一个class的增加和减少(即bili-paused),比较适合监听。其他元素,如bpx-player-container,状态变化较多,有时监听会出现一些意外情况。而弹窗的元素较为好判断,会伴随着覆盖网页的mask出现。关闭弹窗和续播视频的功能直接调用click来完成,应该可以初步实现正常续播的功能。

这里使用MutationObserver来监听元素属性变化完成相关功能:

var target = document.getElementsByClassName("bpx-player-row-dm-wrap")[0];var config = {attributes: true, attributeFilter: ["class"]};var observer = new MutationObserver(function(motationList, observer) {// console.log("captured!");setTimeout(function(){if (document.getElementsByClassName("bili-mini-mask").length > 0) {document.getElementsByClassName("bili-mini-close-icon")[0].click();document.getElementsByClassName("bpx-player-ctrl-btn bpx-player-ctrl-play")[0].click();// observer.takeRecorders(); } }, 1000);});observer.observe(target, config);

需要解释的是,MutationObserver回调函数使用setTimeout是为了等待属性加载,调试发现视频会先暂停然后网页弹窗,第一时间检测元素有时并不能检测到。好吧这个策略并不优雅,但是实际用起来还行。

总结(太长不看点这里)

目前来看,阻止网络请求/禁用部分JS/复写相关函数的难度还是比较大的,简单的方法就是文中所提到的检测暂停并自动续播。这里把自用的脚本分享一下(我自己只是开个页面挂着听歌,偶尔看个视频,用起来没什么问题,总比歌放了一分钟就要暂停然后回去点两下好多了,不过离完全解决肯定还是差挺多的,凑合用吧):

去安装浏览器脚本

本文链接地址:https://www.jiuchutong.com/zhishi/294602.html 转载请保留说明!

上一篇:使用videojs播放m3u8视频(video.js教程)

下一篇:Notion AI是什么?和chatgpt比哪个好?(notion all in one)

  • 手机上办临时身份证在哪里弄(手机上办临时身份证流程)

  • 小米10系列是采用的挖孔屏吗(小米10系列是采埃孚吗)

  • 华为mate40pro电池容量是多少(华为mate40pro电池健康度怎么查)

  • 苹果11手机是双卡吗(苹果手机最新款)

  • 蓝光和原画哪个画质高(蓝光和原画哪个更清楚)

  • 怎么拍出高清的照片(怎么拍出高清的自拍照片)

  • app的hd版什么意思啊(app版本hd什么不同)

  • 微信账单明细怎么下载(微信账单明细怎么打印流水)

  • 华为翻页模式设置方法(华为手机的翻页模式在哪里)

  • vivo网易云音乐通知栏不显示(vivo网易云音乐状态栏不显示)

  • ipad充上电后开不开机(ipad充完电就会屏幕打不开)

  • 苹果黑解机和卡贴机的区别(苹果黑解机和卡贴机价格能写出多少)

  • 土豆视频大王卡免流吗(大王卡优酷视频免流量吗)

  • 小米cc9pro是双扬声器吗(小米cc9pro是2k屏吗)

  • 淘宝怎么取消开抢提醒(淘宝怎么取消开团提醒2022)

  • 爱剪辑怎么加结束字幕(爱剪辑怎么加结尾字幕)

  • 物联卡不注销会怎么样(物联卡不注销会影响征信吗)

  • 华为mate30与30pro的区别(华为mate30与30pro参数对比)

  • ai四摄是什么意思(手机ai四摄是什么意思)

  • word文档表格调整增加一行(word文档表格调整行高后,文字不见了)

  • QQ音乐Qplay功能如何使用(qq音乐 qplay)

  • 苹果x能当遥控器吗(苹果x能当遥控器)

  • 话费不支持开腾讯会员(为什么用话费开不了腾讯会员)

  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设 电脑维修 湖南楚通运网络