B站直播间特效表情文件的获取

小破站今年的跨年晚会很是不错,在跨年夜总算给本阿宅一点点精神慰藉。在用手机看直播的时候,大家刷的礼物特效不停出现,我比较钟爱其中的“打call”,想着加到聊天软件里做个表情,以后兄弟们分享文章的时候可以商业互吹一番。搜了一圈没有发现现成的,今天空下来,随即手撸了一下找到表情文件,简单记录一下过程。

准备

老套路,越狱iPhone,AppStore里下载B站客户端,打开 FLEXible 开关,搬出 FLEX 看看这个特效表情是个啥子东西。设置好后,进入客户端,在首页找到 直播 入口,然后里面选个人气高的直播间进去,耗费巨资手刷一个打call表情,待显示时候,查看FLEX的Views结构如下:

可疑的类为 BBLiveBaseSVGAAnimationViewSVGAPlayer , 我们知道SVG是可以作为矢量图像的,点进去看一下,发现里面有个 SVGAVideoEntity ,进一步查看,确认这个就是表情文件了,里面的images字典就是是图片帧各个部分的元素的碎图。

到此,我们定位到了特效文件的显示对象。

获取

按惯例,先广撒网一下,Google一下 SVGAPlayer ,居然有意外收获: SVGAPlayer 是YY的UED团队出品的一个特效方案,类似于airbnb的Lottie,可以将AE或Flash动画导出到客户端所用。网站http://svga.io/中有详细介绍,并且含有一个svga文件的在线预览页面

根据其iOS端使用手册,验证 SVGAParser 类 确实也在B站客户端中有引用,hook一下它的几个parseWith函数,运行后顺利拿到初始化特效文件的日志:

SVGAParser parseWithData, <789c4cba 05505c5b d3358cbb bbbb0577 ... b6d054d7 e309d1ff 01424fd4 86>, cacheKey 14EAD217D8A29CA4B7320F1CCF549584

789c4cba开头的应该为动画的Data数据,数据有点大,这里截断显示了。

根据cacheKey在app的存储目录下搜索一番, find . -name "*14EAD217D8A29CA4B7320F1CCF549584*" 无结果,说明没这个文件,不用灰心,换grep再撸一遍, grep -rn "14EAD217D8A29CA4B7320F1CCF549584" ./ ,这次有意外收获:
(多余的目录前缀已删掉)

Binary file ./Library/Caches/live/animation/manifest.sqlite-wal matches

匹配了两个sqlite的wal文件。顺带说一嘴这个是什么?WAL是 Write-Ahead Logging 的意思,是实现原子提交和回滚的一种机制。How WAL Works

检查一下 animation 文件夹下还有什么? data manifest.sqlite manifest.sqlite-shm manifest.sqlite-wal trash ,在data文件夹下找到一堆类似md5命名的文件,大小为几百K,拷贝到Mac上 file一下:

file ./Library/Caches/live/animation/data/b84008c716944e598887d43b3ff89514
./Library/Caches/live/animation/data/b84008c716944e598887d43b3ff89514: Apple binary property list

很显然了,是plist文件。改后缀名为plist后打开查看:

将数据部分提取出来保存为文件:
/usr/libexec/PlistBuddy -c 'Print :"$objects:1"' b84008c716944e598887d43b3ff89514.plist > 1.svga

用svga文件在线预览工具 打开刚才保存的 1.svga,播放成功。

吼,剩下的就是跑shell脚本从这些plist文件中提取一下svga的过程了,最后,终于找到了心爱的打call表情,最后的最后,无奈录屏转为GIF了…

提取的一些svga文件记录

56

4 个赞

这个建议挪到干货区啊

好滴,挪过去了

Bilibili出来挨打

厉害,向大佬学习

@tbag 大神 我是安卓的手机 试图去下抖音的直播礼物 结果下不了 好难啊 希望大神能教下我 我能加下您的私人微信吗。。。