網站首頁 編程語言 正文
功能點
- 顯示日期時間
- 顯示樹莓派當前局域網IP
- 顯示當前UP主粉絲數
- 顯示B站未讀消息
- 顯示B站視頻總計播放數
- 顯示視頻總計獲贊數
- 顯示總計獲得充電次數
- 顯示直播間人氣值
- 顯示直播間彈幕
- 將直播間彈幕念出來(TTS)
大家好,我是?大帥?,一個?老?程序?猿?。
這是我第一次寫Python喲,寫得不好請多多指教
前言
前段時間在掘金社區寫文章,得了一臺?樹莓派3B?,加上之前在閑魚曾經淘到一塊?1280x400?的長條屏,就想著把一直想要的嗶哩嗶哩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框架
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 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
原文鏈接:https://blog.csdn.net/Python_shannian/article/details/122862646
相關推薦
- 2022-06-26 Android?app啟動節點與上報啟動實例詳解_Android
- 2023-02-15 Python實現PING命令的示例代碼_python
- 2023-01-03 Python使用asyncio包處理并發的實現代碼_python
- 2022-06-06 Python字符串常規操作小結_python
- 2022-10-20 Python中使用Frozenset對象的案例詳解_python
- 2022-04-16 python案例練習合集_python
- 2022-02-09 Linux驅動之platform總線詳解_Linux
- 2022-07-16 feign調用傳遞請求頭
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支