b站教编程的up主,B站up主小助手
功能是不是挺丰富的?从写第一行代码到完成只用了不到两天的时间,这也证明了python开发的高效率。下面是我在开发这些功能的过程中遇到了哪些问题,以及我是如何解决的。
功能点
显示日期和时间,显示树莓派当前LAN IP,显示当前UP主粉丝数,显示哔哩哔哩未读消息,显示哔哩哔哩播放视频总数,显示点赞视频总数,显示收费总次数,显示直播间人气,显示直播间弹幕(TTS)。大家好,我是王子,老程。
这是我第一次写Python。写得不好请指教。
前言
前段时间,我在掘金社区写了一篇文章,我得到了一个3B覆盆子馅饼。另外我之前在闲鱼淘过一个1280x400的长屏,所以想完成我渴望已久的UP助手。
第一效应
有弹幕的时候就是这样
为什么两张截图的显示器不一样?嘿,都是眼泪。那天晚上,我写这段代码一直写到凌晨2点。代码写好之后,我准备把草莓派和显示屏放进一个纸箱子里。过程中不知道哪里损坏了,屏幕圆点没亮。
好在覆盆子馅饼没有问题,就不多说了。先来看看我对选框的想法。
框架选型
为什么最后选择了Python这种我不懂的语言?最后,我想让这个程序在Raspberry Pi上运行,所以我首先研究了几种在Raspberry Pi上构建GUI界面的方法。
PyQt(Python)PyGame(Python)Electron(JavaScript)Flutter(Dart)虽然我对3和4比较熟悉,但毕竟树莓派的性能有限,不得不弃用。我不熟悉,但是在我的计划中,我不需要一些标准化的UI组件。于是我最终选择了pygame的框架,pygame环境默认安装在树莓Pi系统中。虽然我没写过python,但是对python比较了解,想学很久了,所以就拿这个项目来练习。
功能点
显示日期时间,显示树莓派当前LAN IP,显示当前UP主粉丝数,显示哔哩哔哩未读新闻,显示哔哩哔哩播放视频总数,显示点赞视频总数,显示收费总次数,显示直播间人气,显示直播间弹幕(TTS)功能相当丰富,从写第一行代码到完成不到两天,也证明了python开发的高效率。下面是我在开发这些功能时遇到的一些问题,以及我是如何解决的。
pygame框架
Pygame官网:https://www.pygame.org/
Pygame是python环境下最流行的游戏开发框架。当我不需要那些常用的UI组件的时候,用游戏框架开发更容易。
#安装pygame
pip安装游戏
基本使用示例
#介绍pygame和sys
导入pygame系统
#定义一个run_game函数,将所有初始化逻辑放入其中
def run_game():
#初始化pygame引擎
pygame.init()
#设置pygame窗口大小。如果设置为0,0会自动识别分辨率,相当于最大化窗口。
screen=py game . display . set _ mode((600,400))
#无限循环,游戏的主循环
而True:
#收听留言
用于pygame.event.get():中的事件
#当监控到pygame退出时,触发sys.exit退出应用。
if event.type==pygame。QUIT:
sys.exit()
#清空屏幕
屏幕填充(背景颜色)
#游戏画图的主要逻辑在这里
#刷新屏幕
pygame.display.update(
)
# 执行run_game函数
run_game()
python对于新程序员可能挺友好的,不会对代码的编写有过多先入为主的观念。但对于已经有其他语言开发经验的我来说,也花了好一阵子才适应它的语法。
pygame加载字体显示文字
# 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获取日期时间
import time def getTime(): # 获取系统本地时间 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
import socket def get_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() return ip
显示B站各类数据
这里最主要就是去抓取B站的各种API接口,这里也有热心网友整理好的一份野生API文档,大家可以自行查看使用自己需要的。
https://github.com/SocialSisterYi/bilibili-API-collect
这些B站的API中有一些是需要身份认证的,这就需要我们自己去chrome浏览器中提取,主要会用到两个cookie字段
SESSDATA
CSRF Token(bili_jct)
import requests # 请求直播间弹幕列表 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无比接近
import httpx async with httpx.AsyncClient() as client: res = await client.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)
import pyttsx3 pyttsx3.speak("你好")
是的,这个pyttsx3用来做TTS很简单,但它是利用系统自带的服务来完成的。
Windows系统:SAPI5
MacOS:NSSpeechSynthesizer
Linux:eSpeak
优点就像前面的代码,使用非常简单。缺点是在各个平台不太统一,跨端也会遇到一些兼容性问题。比如我在mac上开发,在linux上运行,效果是不一样的。这个方法默认也是同步的,就是在播放语音时,是阻塞主线程的,等语音播放结束后,主线程才会继续执行。这个体验就太差了,我要等弹幕结束,弹幕才能在屏幕上跑起来。
解决方案:使用Thread开启子线程执行
from threading import Thread Thread(target=pyttsx3.speak,args=(你好,)).start()
总结
Python还挺好玩的,第一次写虽有一些不适应,遇到问题google一下,也能很快找到解决方案。开发效率非常高,以后有机会还会拿Python多写点东西。
github仓库
本项目代码已全部开源,喜欢的朋友请给个Star以示鼓励吧 https://github.com/ezshine/raspi-bilihelper
到此这篇关于Python实现B站UP主小助手详解开发流程的文章就介绍到这了,更多相关Python B站助手内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。