TypeScript初战Chrome插件:Bilibili弹幕热度

比特幽篁引
• 阅读 3895

TL;DR

这是一个用来在B站视频进度条上方创建显示弹幕热度的Chrome插件,以弹幕数量-时间的直方图显示,在高能处(定义为短时间内有大量弹幕出现的时间点)有明显的峰值,可以用来直观地看视频中的热点,也可以拿来作为空降(跳跃快进)的指示。

已经上架Chrome插件市场,在这里或者搜【Danmaku】就能找到。

源代码在GitHub,欢迎Star。

TypeScript初战Chrome插件:Bilibili弹幕热度

背景

其实做一个这样的插件的想法已经在脑海里盘桓好一阵了(创意来源于某Hub),直到最近才有空(摸鱼)写了出来,正好拿来作为TypeScript跟Chrome Extension的练手项目。

实现

插件的实现主要分为如下几个部分:

  • 代码注入
  • 获取av号及分P
  • 获取弹幕
  • 可视化
  • 监控网页重载

基于chrome-extension-typescript-starter的脚手架。

比较核心的库

  • TypeScript

    • 类型系统用来静态检查/代码提示的效率提升还是十分显著的,也减少了一些很蠢的bug的发生
  • echarts

    • 百度家的图表库,用来生成直方图
  • rxjs

    • 观察者 + 迭代器模式的实现
  • jquery

    • 简易的DOM操作

代码注入

依靠Chrome Extension的manifest.json文件可以指定在bilibili的页面中执行指定的代码文件。

获取av号、分P

av号跟分P信息一般可从url中直接获得(形如https://www.bilibili.com/video/avXXXXX/?p=XXXX),但事实上B站的视频格式分很多种,目前光我见到的就有下面几种:

  • 普通视频/video/avXXXXX/?p=XXXX
  • 稍后再看/watchlater/#/avXXXXXX/pXXXX
  • 从历史观看中进入/video/avXXXXXX/index_XXXXX.html
  • 番剧

    • 具体的某一集/bangumi/play/epYYYYY/
    • 从【番剧】分区中直接点进/bangumi/play/ssZZZZZ

因此需要有不同的处理,特别是番剧,url中没有av号信息,需要从DOM中获取。

获取弹幕

B站每个视频都有一个av号,但由于每个视频有可能有多个分P,因此B站还有一个隐含的cid用以索引一个具体的视频(以及弹幕),通过分析找到了这个API:

https://api.bilibili.com/x/player/pagelist?aid=AV_ID&jsonp=jsonp

其实cid可以有多种方法获得,包括网页DOM、原网页HTML等等,但由于B站视频分类众多(普通视频、番剧、稍后再看、历史观看)且网页DOM都有不同,因此还是用这个API比较优雅

可以通过av号拿到该视频每个分P的cid以及视频长度,然后通过API

https://comment.bilibili.com/CID.xml

能够获取xml格式的弹幕数据,告一段落

弹幕数据的解析参考自这篇博客

生成直方图

这个倒简单,处理一下弹幕数据调用echarts的API即可。

监控网页重载

在用户点击切换分P或者其他操作的时候,B站前端用的是HTML5的History API(也有的是hashchange),因此不能光用window.onhashchange事件来监控。而对于H5 History的监控,标准上又只有onpopstate事件,没有onpushstate(这一点是我比较困惑的,望有人解惑)。

因此只能使用折中的方案:利用插件的background script以及webNavigation权限监控所有B站选项卡的history更新(通过chrome提供的onHistoryStateUpdated事件),并且建立content_script与background_script的连接进行单点通知,触发页面中的url更新事件。

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Stella981 Stella981
3年前
HackBar破解(谷歌、火狐)
1.谷歌打开Chrome插件列表,查看Hackbar的插件ID:djmoeo……,在文件搜索里搜这段字符,我这里用的是Everything。!(https://img2018.cnblogs.com/blog/1392192/201907/139219220190701125726213948998123.png)Everyth
Stella981 Stella981
3年前
Google Chrome 插件开发—调试篇
起因最近,整合了Chrome的两个小插件,由于小工具,缺乏维护,里面很多bug,只能自己一点点来解决了。下面说说在处理问题时候的插件Debugger。内容首先需要做的是,在Chrome的扩展程序中打开:开发者模式选择:加载正在开发的扩展程序将我们的插件加载进来。可以看到类似内容:fastForm0.1
Wesley13 Wesley13
3年前
Android弹幕实现:基于B站弹幕开源系统(7)QQ、微信聊天气泡样式的弹幕
Android弹幕实现:基于B站弹幕开源系统(7)QQ、微信聊天气泡样式的弹幕在附录文章得基础上,改进普通文本弹幕,实现一种特殊效果的文本弹幕,像QQ、微信一样的带有气泡背景的弹幕。实现的重点是在SpannedCacheStuffer。同时要准备若干需要衬在文本弹幕背景部分的.9.png图片。上层Java代码:
Wesley13 Wesley13
3年前
3行!仅3行代码就能抓取B站(弹幕、评论、用户)数据
今天介绍一个获取B站数据的Python扩展库bilibili\_api可以获取的数据包括:video视频模块user用户模块dynamic动态模块这次用“RunningMan”十周年特辑的视频,来做个获取弹幕的Demo。我是对比没有对比,就没有伤害,就像最近的“哈工大”某学生和“浙大”某
Wesley13 Wesley13
3年前
B站运维团队成长的血泪史
胡凯,bilibili运维负责人,曾经就职于金山软件、金山网络、猎豹移动,负责运维相关工作。Bilibili是国内最大的年轻人潮流文化娱乐社区,银河系知名弹幕视频分享UGC平台。95后二次元新人类的追捧,让以视频弹幕、UP主闻名于世的bilibili(以下简称B站)愈发火爆,无数年轻人通过电脑、手机、电视等终端设备在B站上追番、看
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Chrome超好用的Json视图工具
效果图!在这里插入图片描述(https://oscimg.oschina.net/oscnet/up8f5456d4087d42c39121d14af1155a82.png)Jsonview插件下载安装①下载:你可以从chrome应用商店里找到Jsonview插件,如果你的chrome应用商店无法打开,
Stella981 Stella981
3年前
Egret实战开发笔记,飞行射击游戏(五)
今天是开发飞行射击游戏第五天,爆炸特效体系与NPC子弹弹幕。简介实现爆炸特效体系与NPC子弹弹幕。飞机爆炸也是一个类,爆炸也是个数可变的,也需要特效管理者类。实现效果本来想路视频转GIF的,但是gif文件过大,超过5M又上传不了,而且压缩后失帧严重,仅截取了一部