草庐IT

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

西界丶 2023-08-06 原文

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

情况介绍

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

简要分析

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

去安装浏览器脚本

有关关于B站(bilibili)对未登录用户视频观看进行暂停和弹窗的分析与简单解决方案的更多相关文章

  1. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  2. ruby-on-rails - Rails 3 - 过滤器链暂停为 :authentication rendered or redirected - 2

    我仍然收到标题中的“错误”消息,但不知道如何解决。在ApplicationController中,classApplicationController在routes.rb#match'set_activity_account/:id/:value'=>'users#account_activity',:as=>:set_activity_account--thisdoesn'tworkaswell..resources:usersdomemberdoget:action_a,:action_bendcollectiondoget'account_activity'endend和User

  3. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  4. Ruby 守护进程和 JRuby - 备选方案 - 2

    我有一个应用程序正在从Ruby迁移到JRuby(由于需要通过Java提供更好的Web服务安全支持)。我使用的gem之一是daemons创建后台作业。问题在于它使用fork+exec来创建后台进程,但这对JRuby来说是禁忌。那么-是否有用于创建后台作业的替代gem/wrapper?我目前的想法是只从shell脚本调用rake并让rake任务永远运行......提前致谢,克里斯。更新我们目前正在使用几个与Java线程相关的包装器,即https://github.com/jmettraux/rufus-scheduler和https://github.com/philostler/acts

  5. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  6. ruby - 使用 Ruby 和 Mechanize 登录网站 - 2

    我需要从站点抓取数据,但它需要我先登录。我一直在使用hpricot成功地抓取其他网站,但我是使用mechanize的新手,我真的对如何使用它感到困惑。我看到这个例子经常被引用:require'rubygems'require'mechanize'a=Mechanize.newa.get('http://rubyforge.org/')do|page|#Clicktheloginlinklogin_page=a.click(page.link_with(:text=>/LogIn/))#Submittheloginformmy_page=login_page.form_with(:act

  7. ruby - 关于 Ruby 中 Dir[] 和 File.join() 的混淆 - 2

    我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案

  8. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  9. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

  10. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

随机推荐