Python如何实现B站UP主小助手(B站,python,开发技术)

时间:2024-04-29 00:49:24 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

前言

先上效果

Python如何实现B站UP主小助手

有弹幕的时候是这样的

Python如何实现B站UP主小助手

为什么两张截图的显示器不一样呢?哎,说起来都是眼泪,那天晚上我直播写这个代码写到凌晨2点,代码写完我准备把树莓派和显示屏都塞到一个纸盒子里,这个过程中不知道损坏了哪里,屏幕点不亮了...

不过好在树莓派没问题,闲话不多说,先来看看我对于框架选型的思考

框架选型

为什么最后会选用Python这个我并不会的语言呢?因为最终是希望这个程序运行在树莓派上,所以首先调研了几种在树莓派上搭建GUI界面的方式。

  • PyQt(python)

  • Pygame(python)

  • Electron(javascript)

  • Flutter(dart)

虽然我对3、4更加熟悉,但毕竟树莓派的性能有限,我只好弃用。1我不熟,但是在我的规划里,我并不需要一些标准化的UI组件。所以最终选择了pygame的框架,并且树莓派系统里也默认安装了pygame环境,虽从未写过python,但对python的大名如雷贯耳,早就想学习一下,正好拿这个项目练练手

功能点

  • 显示日期时间

  • 显示树莓派当前局域网IP

  • 显示当前UP主粉丝数

  • 显示B站未读消息

  • 显示B站视频总计播放数

  • 显示视频总计获赞数

  • 显示总计获得充电次数

  • 显示直播间人气值

  • 显示直播间弹幕

  • 将直播间弹幕念出来(TTS)

功能是不是还挺丰富的,从写第一行代码到完成也就花了两天不到的时间,这也证明了使用python开发的高效率,下面来说说这些功能开发中我遇到了哪些问题,我又是如何解决的。

pygame框架

Python如何实现B站UP主小助手

pygame官网: https://www.pygame.org/

pygame是python环境下最流行的游戏开发框架,当我不需要那些常见的UI组件时,使用游戏框架来开发反而更简单。

#安装pygamepipinstallpygame

框架基础使用示例

#引入pygame和sysimportpygame,sys#定义一个run_game函数,把初始化的逻辑都放里面defrun_game():#初始化pygame引擎pygame.init()#设置pygame窗口大小,如果设置为0,0则自动识别分辨率,相当于窗口最大化screen=pygame.display.set_mode((600,400))#无限循环,游戏的主循环whileTrue:#监听消息foreventinpygame.event.get():#当监听到pygame的退出时,触发sys.exit退出应用ifevent.type==pygame.QUIT:sys.exit()#清空屏幕screen.fill(BG_COLOR)#游戏绘制的主逻辑放这里#刷新屏幕pygame.display.update()#执行run_game函数run_game()

python对于新程序员可能挺友好的,不会对代码的编写有过多先入为主的观念。但对于已经有其他语言开发经验的我来说,也花了好一阵子才适应它的语法。

pygame加载字体显示文字

Python如何实现B站UP主小助手

#220是字号my_font=pygame.font.Font("./路径/字体.ttf",220)#my_font.render(文字内容,是否抗锯齿,文字颜色,文字背景色)text_element=my_font.render("文字内容",1,(255,255,255))#计算文本渲染后的宽度高度text_width,text_height=my_font.size("文字内容")#将文本元素绘制到屏幕指定坐标(元素左上角为原点)screen.blit(text_element,(100,100)

python获取日期时间

Python如何实现B站UP主小助手

importtimedefgetTime():#获取系统本地时间localtime=time.localtime()#将本地时间格式化为年月日date_str=time.strftime("%Y年%m月%d日",localtime)#将本地时间格式化为24小时制hm_str=time.strftime("%H:%M",localtime)#将本地时间格式化获取秒second_str=time.strftime("%S",localtime)

在pygame的主循环中调用getTime,并将时间文本绘制到屏幕上,一个小时钟就做好了。

显示树莓派当前局域网IP

为什么要显示当前IP呢,因为大部分时候我不会给树莓派连接鼠标键盘,那显示IP后就可以直接通过VNC或者SSH来连接树莓派了。

网上有Python获取局域网IP的方案。这个是我用下来的最佳方案:p

importsocketdefget_host_ip():try:s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.connect(('8.8.8.8',80))ip=s.getsockname()[0]finally:s.close()returnip

显示B站各类数据

这里最主要就是去抓取B站的各种API接口,这里也有热心网友整理好的一份野生API文档,大家可以自行查看使用自己需要的。

https://github.com/SocialSisterYi/bilibili-API-collect

这些B站的API中有一些是需要身份认证的,这就需要我们自己去chrome浏览器中提取,主要会用到两个cookie字段

  • SESSDATA

  • CSRF Token(bili_jct)

importrequests#请求直播间弹幕列表res=requests.get('https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid='+BILI_LIVEID)data=res.json()

但是requests是同步执行的,会阻塞主线程的执行。比如在本例中,如果我直接使用requests发起请求,那么在请求时pygame的主逻辑循环就被卡住,这肯定不是我所希望的。网上有很多改异步的教程,我就不赘述了,这里我改用了另一个支持异步的库叫httpx,用法和普通requests无比接近

importhttpxasyncwithhttpx.AsyncClient()asclient:res=awaitclient.get('https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid='+BILI_LIVEID)data=res.json()

然而在我设计里,要请求5个B站接口才能获取到显示的全部数据字段。这个显然也是可以优化的,而我最终选择使用uniCloud来开发一个云函数,然后将这个云函数URL化后给python使用,这也是我曾经在视频教程里提到过的,我们可以用uniCloud来开发后端接口,然后前端用Flutter或者其他任意框架,并不需要局限在uniapp。

将直播间弹幕念出来(TTS)

importpyttsx3pyttsx3.speak("你好")

是的,这个pyttsx3用来做TTS很简单,但它是利用系统自带的服务来完成的。

  • Windows系统:SAPI5

  • MacOS:NSSpeechSynthesizer

  • Linux:eSpeak

优点就像前面的代码,使用非常简单。缺点是在各个平台不太统一,跨端也会遇到一些兼容性问题。比如我在mac上开发,在linux上运行,效果是不一样的。这个方法默认也是同步的,就是在播放语音时,是阻塞主线程的,等语音播放结束后,主线程才会继续执行。这个体验就太差了,我要等弹幕结束,弹幕才能在屏幕上跑起来。

解决方案:使用Thread开启子线程执行

fromthreadingimportThreadThread(target=pyttsx3.speak,args=('你好',)).start()
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Python如何实现B站UP主小助手的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:awk命令中的字段、记录和变量怎么用下一篇:

4 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18