小破站今年的跨年晚会很是不错,在跨年夜总算给本阿宅一点点精神慰藉。在用手机看直播的时候,大家刷的礼物特效不停出现,我比较钟爱其中的“打call”,想着加到聊天软件里做个表情,以后兄弟们分享文章的时候可以商业互吹一番。搜了一圈没有发现现成的,今天空下来,随即手撸了一下找到表情文件,简单记录一下过程。
准备
老套路,越狱iPhone,AppStore里下载B站客户端,打开FLEXible
开关,搬出FLEX
看看这个特效表情是个啥子东西。设置好后,进入客户端,在首页找到直播
入口,然后里面选个人气高的直播间进去,耗费巨资手刷一个打call表情,待显示时候,查看FLEX的Views结构如下:
可疑的类为 BBLiveBaseSVGAAnimationView
和 SVGAPlayer
, 我们知道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了…
(完)
(原创文章,转载请注明出处)