zoukankan      html  css  js  c++  java
  • [转载][python]bilibili弹幕发送者查询器软件 开发背景/思路/心得

    本文转载自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

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

     

    天涯犹在,不诉薄凉。
  • 相关阅读:
    关于32位操作系统和64位操作系统对InstallShield打包的影响
    NEWS: Symantec宣布Wise Package Studio将终止
    InstallShield 2012新功能试用(2) 调用MsiGetProperty等MSI API发生变化
    Basic INFO 在命令行Build InstallShield安装包工程获得压缩安装包
    NEWS InstallShield 2012 Service Pack 1发布
    Basic INFO InstallShield Basic MSI工程中如何在SetupCompleteSuccess界面中启动Readme
    Basic INFO InstallShield的脚本编辑器中如何显示代码行号
    Basic INFO 关于在InstallShield制作的安装包界面中删除InstallShield文字的厂商回复
    Basic INFO InstallShield工程中如何让产品的快捷方式名称始终与产品名保持一致
    Basic INFO: 创建隐藏文件夹
  • 原文地址:https://www.cnblogs.com/Knight02/p/14429695.html
Copyright © 2011-2022 走看看