功能点

  • 显示日期时间
  • 显示树莓派当前局域网IP
  • 显示当前UP主粉丝数
  • 显示B站未读消息
  • 显示B站视频总计播放数
  • 显示视频总计获赞数
  • 显示总计获得充电次数
  • 显示直播间人气值
  • 显示直播间弹幕
  • 将直播间弹幕念出来(TTS)

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

大家好,我是 大帅 ,一个 老 程序 猿 。

这是我第一次写Python哟,写得不好请多多指教:P

前言

前段时间在掘金社区写文章,得了一台 树莓派3B ,加上之前在闲鱼曾经淘到一块 1280x400 的长条屏,就想着把一直想要的哔哩哔哩UP主助手给完成了。

先上效果

有弹幕的时候是这样的

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

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

框架选型

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

  1. PyQt(python)
  2. Pygame(python)
  3. Electron(javascript)
  4. Flutter(dart)

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

功能点

  • 显示日期时间
  • 显示树莓派当前局域网IP
  • 显示当前UP主粉丝数
  • 显示B站未读消息
  • 显示B站视频总计播放数
  • 显示视频总计获赞数
  • 显示总计获得充电次数
  • 显示直播间人气值
  • 显示直播间弹幕
  • 将直播间弹幕念出来(TTS)

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

pygame框架

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

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

# 安装pygame
pip install pygame

框架基础使用示例

# 引入pygame和sys
import pygame,sys # 定义一个run_game函数,把初始化的逻辑都放里面
def run_game():# 初始化pygame引擎pygame.init()# 设置pygame窗口大小,如果设置为0,0则自动识别分辨率,相当于窗口最大化screen = pygame.display.set_mode((600,400))# 无限循环,游戏的主循环while True:# 监听消息for event in pygame.event.get(): # 当监听到pygame的退出时,触发sys.exit退出应用if event.type == pygame.QUIT:sys.exit()# 清空屏幕screen.fill(BG_COLOR)# 游戏绘制的主逻辑放这里# 刷新屏幕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 timedef 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 socketdef 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/SocialSister Yi/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 httpxasync 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 pyttsx3pyttsx3.speak("你好")

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

  • Windows系统:SAPI5
  • MacOS:NSSpeechSynthesizer
  • Linux:eSpeak

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

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

from threading import ThreadThread(target=pyttsx3.speak,args=('你好',)).start()

总结

Python还挺好玩的,第一次写虽有一些不适应,遇到问题google一下,也能很快找到解决方案。开发效率非常高,以后有机会还会拿Python多写点东西。

github仓库

本项目代码已全部开源,喜欢的朋友请给个Star以示鼓励吧 https:// github.com/ezshine/rasp i-bilihelper

200行Python代码实现B站UP主小助手(显示视频播放数、粉丝数等)相关推荐

  1. Python实战2 - 200行Python代码实现2048(控制台)

    Python实战系列用于记录实战项目中的思路,代码实现,出现的问题与解决方案以及可行的改进方向 本文为第2篇–200行Python代码实现2048 一.分析与函数设计 1.1 游戏玩法 2048这款游 ...

  2. 详解200行Python代码实现控制台版2048【总有一款坑适合你】【超详细】

    跟着实验楼学习了2048的Python实现,先丢个地址 200行Python代码实现2048 我接触Python时间不长,只了解一些基本的语法和容器,在学习的过程中遇到不少问题,这里做一个记录. cu ...

  3. 用 200 行 Python 代码掌握基本音乐理论

    本文作者是一位多年自学成才的吉他手,但对西方乐理一无所知,因此决定编写一些代码来搞懂它. 本文用了大约200行Python代码来帮助我们理解西方音乐理论的基础知识. 我们将首先查看西方音乐理论中的音符 ...

  4. python换脸教程_教你如何用200行Python代码“换脸”教程

    原标题:教你如何用200行Python代码"换脸"教程 本文将介绍如何编写一个只有200行的Python脚本,为两张肖像照上人物的"换脸". 这个过程可分为四步 ...

  5. python换脸完整程序_小 200 行 Python 代码做了一个换脸程序

    原标题:小 200 行 Python 代码做了一个换脸程序 简介 在这篇文章中我将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的脸替换为另一幅图片的脸. 这个过程分四步: ...

  6. 炫酷!200 行 Python 代码实现马赛克拼图!

    在一图胜千言的时代,没有什么比一张图片更有冲击力的了,那如果一千张图片拼接起来是什么效果呢? 别问,问就是两字 -- 炫酷! 你有没有想过上面的图片是怎么实现的,难道这是用 ps 一张张拼起来的?当然 ...

  7. 50行python游戏代码_使用50行Python代码从零开始实现一个AI平衡小游戏

    使用50行Python代码从零开始实现一个AI平衡小游戏 发布时间:2020-10-23 09:26:14 来源:脚本之家 阅读:74 集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何 ...

  8. python写一个游戏多少代码-使用50行Python代码从零开始实现一个AI平衡小游戏

    集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym, ...

  9. python50行小游戏_使用50行Python代码从零开始实现一个AI平衡小游戏

    集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym, ...

  10. 20行python代码的入门级小游戏-200行Python代码实现的2048小游戏

    2048这个小游戏大家都不陌生,应该都玩过,之前已经在网上见过各个版本的2048实现了,有JAVA.HTML5等,今天我就给大家来一个我自己在 实验楼 学到的python版2048.所有代码加起来才2 ...

最新文章

  1. boost::interprocess::anonymous_shared_memory用法的测试程序
  2. java canvas画圆圈_java – 在视图上绘制一个圆圈(android)
  3. 【转】tftp命令详解
  4. 不插网线终端缓慢的问题解决办法
  5. Redis面试 - Redis 主从架构
  6. 交叉熵的本质是极大似然估计
  7. jquery ui放大缩小_jQuery拖拽放大缩小插件idrag
  8. 困扰的问题终于解决了-docker时区不正确的问题修改记
  9. hive 安装centos7
  10. 安全绳使用方法图解_儿童安全锁使用方法
  11. 关于nubia z9 NX508J notification 不显示的问题
  12. 第9章第18节:制作商业计划书的商业模式幻灯片 [PowerPoint精美幻灯片实战教程]
  13. java 生成 rtf_如何从Java生成RTF?
  14. Python数据有效性DataValidation模块
  15. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学研究生计算机科学排名关键消息重点总结...
  16. 专访北京航空航天大学黎健成:我和编程比赛
  17. java微信获取openId和sessionKey
  18. 第三十六章 数词、日期和度量衡
  19. 戴尔灵越怎么样?带你看看12代酷睿笔记本灵越13 Pro
  20. 【渝粤题库】陕西师范大学151106中级财务管理 作业(高起专)

热门文章

  1. STM32/GD32 IAP/Bootloader升级APP研究以及编程实现、hex文件格式
  2. MOSS入门教程:一步一步Sharepoint 2007系列
  3. 陶哲轩实分析(上)8.2及习题-Analysis I 8.2
  4. OpenCV 基础(二) 显示图片
  5. python数据类型包括实数_01~Python数据类型
  6. 二元最佳前缀码_贪心-最优前缀码
  7. Oracle VM VirtualBox固定ip
  8. jsp实现文件下载,out = pageContext.pushBody();out.close();不用写到jsp中
  9. axio使用get方法之传递对象数组问题及解决方法
  10. mysql 预处理stmt操作(写入数据库和从数据库中取出)