[转载][python]bilibili弹幕发送者查询器软件 开发背景/思路/心得

时间:2024-02-01 08:52:07

本文转载自https://sharewh.chaoxing.com/share/589f5a73-54dc-42ae-8ebe-83a9d6cacd33?t=3

 

----------------------------------------------------------------------------

            ​    ​    ​    ​    ​    ​ (吾爱破解发布账号:ArcmentNC,欢迎大神指点)

​(感谢大家支持。不开源原因主要是不想放出来hash处理过的uid如何反查出真实uid的代码。本人也是b站老用户,对b站一些机制比较了解。biliplus也是著名的b站小工具,却反复受到b站官方限制;api.bilibili里面有解析视频的接口,有人做出软件分享出来最后也被b站整治了;bilibili.com/read/cv6728925里面分享的查询弹幕发送者网站也失效了好几个。希望这类工具大家且用且珍惜。)

    ​    ​弹幕视频系统,最初源自日本弹幕视频分享网站(niconico动画),国内首先引进为AcFun以及后来的bilibili。弹幕给予观众一种实时互动的感觉,特定弹幕出现在一个时间点,在欣赏视频时,弹幕的出现,可能让我们为之一动,可能让我们发现亮点,更有可能在不同观众之间实现一种心灵的共鸣,弹幕的优点非常显著。然而,弹幕发展至今,一直都是以简单的文字语言为主,少数情况如bilibili高级弹幕可以实现简单的特效,而绝大多数时候弹幕省略了发送时间、发送者、状态等等信息,而被简化成一条在特定视频的特定时间下出现的一行字,如此设计简洁美观,适当调整弹幕密度,即可正常观赏视频,不会因为弹幕影响视频的观看。

        然而,随着时间的流逝,弹幕也出现了很多问题。一些人借着弹幕难以查询发送者这个机会,在弹幕中宣泄自己的不良情绪,同时剧透、恶意遮挡字幕等等不良行为也频频出现,严重影响了视频的观感。或许在弹幕视频网站上,这种情况都难以得到根本解决。在这种情况下,我产生了制作一款弹幕发送者查询软件的想法。希望无论是积极、有用的弹幕还是消极的弹幕,都可以有一款软件对发送者进行查询,找到相应发送弹幕的b站用户。

    ​    ​    ​      ​    ​  ​(建议翻到最后看注意事项,萌新可以翻到最后看萌新栏目)

 

 

 


        细心的用户可能注意到过,在bilibili提供了屏蔽某弹幕发送用户发送的所有弹幕这一功能,言外之意,必然存在某项信息,与弹幕发送者相关联。

        查询资料,b站提供了一些开放api接口:https://www.bilibili.com/read/cv7914570/

 

 

 

 

        POST形式的必选字段传递!这里足以证实发送弹幕时候,必然有发送者信息的传输。这样存在几种情况:

        ①服务器存储了弹幕发送者信息,同时可以进行查询。而可能查询到的是加密的信息,也可能查询的是到未加密信息。

        ②服务器存储了弹幕发送者的信息,无法进行查询,数据只被存储于服务器。

    ​    ​③服务器只验证,稍后删除了相关信息。

 

        存在“屏蔽用户”这个选项,可以排除③了。然而,当我们回到b站视频点击“屏蔽用户”选项时,可以有一个明显的发现!屏蔽这个过程非常迅速,而并没有新信息和b站服务器交互,这已经证明了②错误。同时,浏览器后台接收到的有关弹幕的数据,必然有某些内容和发送者相关联,从另一个方面证明①正确。至此第一大难点攻克了

        这时候大家可以回到这里看看:https://www.bilibili.com/read/cv7914570/ ,查询关于b站接口的资料,调取接口查看某个视频所有关于弹幕信息。

 

 

 

 

        新的问题又出现了,调取这个接口需要视频oid,但咱们更常用av号bv号,没关系,直接从后台re查询下就好。也可以用网上现成的。

 

 

 

        调取接口获得了如下信息:(注意encoing用utf-8)

 

 

 

        挺乱的~但是通过分析测试可以知道,并没有哪一条信息可以直接看出和uid有关联,到这里软件开发陷入了低谷,我又经历了蛮久的思考....

        (简单科普下,每个b站用户都对应一个uid码,直接去b站搜索uid+数字皆可以拿到该用户的信息,经常做bilibili小工具的可能了解。不知道这个项目无法继续进行==)

        差点忘了。。前面说过,b站应该不会直接放出来用户的uid信息,必然有加密。而b站有些视频弹幕很多,之前说过的屏蔽用户功能,能如此迅速的进行匹配查找,可以猜想为是对uid的Hash加密,同时加密后结果应该不能太长。

 

 

 

         可以看出这是一条弹幕的完整信息,其中\'bdd28225\'最像对uid加密后的结果。

       不久,找到了大神和相关资料,对之前分析的内容进行了核实,对拿到的算法进行改写,便可以通过加密的uid信息得到未加密的内容,即反查hash加密内容。(不公开具体算法)

        注意一点,严格意义上讲,hash法无法解密,是典型的加密快而解密几乎不可能的方法,不排除冲突的hash加密是可能出现错误的,而在本例中,加密前、加密后的内容都很简单,原uid是数字,而加密后只是几位字母数字的混合体,几乎不可能出现冲突,在极少数情况下也可能出现两个不同的uid加密出现相同结果。本解密算法含暴力法,原uid值越小解密越快,同时可能出现错误。本段内容新人较难理解,可以百度hash。严格意义上说,hash甚至不能被称为加密算法,无法解密,这样不满足加密算法的定义。这里大家理解我说的这个意思即可,本算法利用了暴破思想,也进行了优化,确实较耗时间,但无法找到好的方法,同时不保证100%正确,极个别情况下可能出现错误。

        到这里第二大难点攻破,剩下的就是代码实现了。

       这里提供我的思路,由于弹幕的信息和内容是挨着的,拿到爬取后的信息分别用正则表达式findall筛选内容,每个弹幕信息用\',\'分割,分割后的第六个即为加密后的内容,然后套入算法进行计算,最后循环输出即可。也可以考虑用xlwt库将内容导入excel。

 

    ​    ​你以为这就完了?。。

    ​    ​咱们捋一捋:输入视频号-->转换oid-->爬取内容-->内容搜索-->处理hash-->输出结果

    ​    ​相当复杂的一个项目...需要分步分析,每一步都是可能出现问题的。

 

 

 

    ​    ​问题是较为复杂的,例如获取oid和调用接口需要联网,而url链接不同,进行的操作不同,可能出现的问题也不同。需要进行分析和异常处理。

    ​    ​按照流程图写代码即可,流程图内容不详细解释。

    ​    ​以获取oid为例:

 

 

 

    ​    ​利用try、except方法即可,同时输出程序运行状态、错误报告,异常出现,后面的工作没必要继续进行,利用sys.exit(0)终止即可。
    ​    ​到此所有重难点处理完成。

 

    ​    ​[2021.2.1]到这里项目接近尾声了,我们可以分析目前存在一些问题:

       ​ ​①将hash加密过的内容反算成真实的uid,这个过程耗费时间较长、内存较多,有很小的概率还会出现错误,毕竟这是hash,没有好办法解决。

    ​    ​②爬取到信息后运用正则表达式进行搜索,弹幕中一些特殊符号可能造成干扰...这个比较恶心,但一般不会出现这样的弹幕。

    ​    ​③注意程序跑出来只有弹幕池的弹幕。一些视频弹幕量很大,一些弹幕被挤出弹幕池,不会被搜查到,弹幕多的视频弹幕池一般有几千。尽管这样程序运行时间依旧会很长,考虑用os.system(\'pause\'),每匹配一段时间暂停一次,用户按任意键可以继续。

    ​    ​④遇到特殊的指令、高级、GAS弹幕可能出现乱码,这个不好搞...

 

    ​    ​[2021.2.5]补充说明:

    ​    ​①支持分p查询,输入格式 BV....?p=x 即可,注意视频必须存在x这一p,如果不存在,按x=1处理。

    ​    ​②爬取弹幕池内容,新发的排在前面,如图,弹幕池指的是右边的弹幕列表。数量和弹幕池弹幕数量一致而不是总弹幕量。

 

 

 

 

 

 

注意:

        ①通过前面分析,b站对弹幕发送者的信息进行了hash加密,这样除了方便查找,b站官方必然不希望看到这种查询软件的存在。本软件仅供研究学习,不公开源码,只作为一次尝试、学习,不再进行优化、更新。

        ②软件需要联网使用。

    ​    ​③有可能存在一项问题是,随着时间推移,api可能会失效或发生调整,从而导致该工具也会随之失效。其余请阅读前面项目问题的分析。

 

封装成exe后功能测试:(分别测试异常处理情况和正常情况)

 

 

 

 

 

 

 

成品下载:

 https://wws.lanzous.com/iQPCklzg5fc
密码:4ijs

 

-----------------------------------

萌新专栏:

    ​    ​①为什么使用python进行开发制作?python优点在哪里?如何评价python爬虫?

    ​    ​在整个开发过程中,只使用了python内的一些包requests/sys/os/re,正常安装包配置好环境即可运行代码,不需要提供其他插件支持。同时python语言非常简洁,代码不长,语法简单,制作小工具十分得手。然而制作复杂项目时python比不过C++。

    ​    ​爬虫应用也是开发这个项目时候一大重点。爬虫即是运用代码模拟我们访问网络的过程,省去一些繁琐的东西,快速得到所需要的信息,是一种重要的工具。而python对于爬虫的支持也是远远强于其他一些语言。同时python提供了一些特殊的方法,使得处理字符串、长数据等十分方便。

    ​    ​网络常存在一种说法:爬虫即是违法。这一说法并不正确,其实百度搜索技术的一大核心内容就是爬虫。我们应当利用爬虫进行合法操作,不访问非法内容或者用于作弊。同时应当在使用时养成良好的习惯,爬取信息注意调整频率,不过分频繁使用,减轻服务器负担。

    ​    ​②为什么调取api不手动抓取信息?

    ​    ​api通常指应用程序编程接口,这里指网络上一些应用提供的接口。api完美和爬虫内容适配,可以让我们更快得到我们想要的信息,很多时候连格式也是为我们准备好的(即提供了易于python处理的格式),同时支持status_code(状态码)可供查询,通常200为正常。如果可以找到现成的接口,直接使用接口是非常舒服的。不过存在以下缺点:接口可能会变动或被封禁,之前自己写好的代码会因为接口的变动导致执行失败;接口通常存在调取频率限制,频繁调用导致自己访问接口受限制或者被临时封禁;接口很多时候需要我们在python中提供相应信息,如登录环境。

    ​    ​③正则表达式是什么?怎么样?

    ​    ​正则表达式是一种强大的工具,支持搜索、查找、替换、审查等等很多功能。例如在我们浏览网页时候,填写邮箱地址,在还没填写完便可以自动判断出地址是否合法,这是利用正则表达式对输入内容进行的一个审查。python中re模块提供的正则表达式非常优秀,这也将是学习python必不可少的一部分。入门正则表达式:https://www.runoob.com/python/python-reg-expressions.html

看似内容不复杂,其实用这些有限的函数、匹配符进行组合,正则表达式拥有非常广的使用范围和极其强大的功能。