網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
功能點(diǎn)
- 顯示日期時(shí)間
- 顯示樹(shù)莓派當(dāng)前局域網(wǎng)IP
- 顯示當(dāng)前UP主粉絲數(shù)
- 顯示B站未讀消息
- 顯示B站視頻總計(jì)播放數(shù)
- 顯示視頻總計(jì)獲贊數(shù)
- 顯示總計(jì)獲得充電次數(shù)
- 顯示直播間人氣值
- 顯示直播間彈幕
- 將直播間彈幕念出來(lái)(TTS)
大家好,我是?大帥?,一個(gè)?老?程序?猿?。
這是我第一次寫(xiě)Python喲,寫(xiě)得不好請(qǐng)多多指教
前言
前段時(shí)間在掘金社區(qū)寫(xiě)文章,得了一臺(tái)?樹(shù)莓派3B?,加上之前在閑魚(yú)曾經(jīng)淘到一塊?1280x400?的長(zhǎng)條屏,就想著把一直想要的嗶哩嗶哩UP主助手給完成了。
先上效果
有彈幕的時(shí)候是這樣的
為什么兩張截圖的顯示器不一樣呢?哎,說(shuō)起來(lái)都是眼淚,那天晚上我直播寫(xiě)這個(gè)代碼寫(xiě)到凌晨2點(diǎn),代碼寫(xiě)完我準(zhǔn)備把樹(shù)莓派和顯示屏都塞到一個(gè)紙盒子里,這個(gè)過(guò)程中不知道損壞了哪里,屏幕點(diǎn)不亮了...
不過(guò)好在樹(shù)莓派沒(méi)問(wèn)題,閑話不多說(shuō),先來(lái)看看我對(duì)于框架選型的思考
框架選型
為什么最后會(huì)選用?Python?這個(gè)我并不會(huì)的語(yǔ)言呢?因?yàn)樽罱K是希望這個(gè)程序運(yùn)行在樹(shù)莓派上,所以首先調(diào)研了幾種在樹(shù)莓派上搭建?GUI界面?的方式。
- PyQt(python)
- Pygame(python)
- Electron(javascript)
- Flutter(dart)
雖然我對(duì)3、4更加熟悉,但畢竟樹(shù)莓派的性能有限,我只好棄用。1我不熟,但是在我的規(guī)劃里,我并不需要一些標(biāo)準(zhǔn)化的UI組件。所以最終選擇了?pygame?的框架,并且樹(shù)莓派系統(tǒng)里也默認(rèn)安裝了?pygame?環(huán)境,雖從未寫(xiě)過(guò)?python?,但對(duì)?python?的大名如雷貫耳,早就想學(xué)習(xí)一下,正好拿這個(gè)項(xiàng)目練練手
功能點(diǎn)
- 顯示日期時(shí)間
- 顯示樹(shù)莓派當(dāng)前局域網(wǎng)IP
- 顯示當(dāng)前UP主粉絲數(shù)
- 顯示B站未讀消息
- 顯示B站視頻總計(jì)播放數(shù)
- 顯示視頻總計(jì)獲贊數(shù)
- 顯示總計(jì)獲得充電次數(shù)
- 顯示直播間人氣值
- 顯示直播間彈幕
- 將直播間彈幕念出來(lái)(TTS)
功能是不是還挺豐富的,從寫(xiě)第一行代碼到完成也就花了兩天不到的時(shí)間,這也證明了使用?python?開(kāi)發(fā)的高效率,下面來(lái)說(shuō)說(shuō)這些功能開(kāi)發(fā)中我遇到了哪些問(wèn)題,我又是如何解決的。
pygame框架
pygame官網(wǎng): https://www.pygame.org/
pygame?是python環(huán)境下最流行的游戲開(kāi)發(fā)框架,當(dāng)我不需要那些常見(jiàn)的UI組件時(shí),使用游戲框架來(lái)開(kāi)發(fā)反而更簡(jiǎn)單。
# 安裝pygame pip install pygame
框架基礎(chǔ)使用示例
# 引入pygame和sys import pygame,sys # 定義一個(gè)run_game函數(shù),把初始化的邏輯都放里面 def run_game(): # 初始化pygame引擎 pygame.init() # 設(shè)置pygame窗口大小,如果設(shè)置為0,0則自動(dòng)識(shí)別分辨率,相當(dāng)于窗口最大化 screen = pygame.display.set_mode((600,400)) # 無(wú)限循環(huán),游戲的主循環(huán) while True: # 監(jiān)聽(tīng)消息 for event in pygame.event.get(): # 當(dāng)監(jiān)聽(tīng)到pygame的退出時(shí),觸發(fā)sys.exit退出應(yīng)用 if event.type == pygame.QUIT: sys.exit() # 清空屏幕 screen.fill(BG_COLOR) # 游戲繪制的主邏輯放這里 # 刷新屏幕 pygame.display.update() # 執(zhí)行run_game函數(shù) run_game()
python對(duì)于新程序員可能挺友好的,不會(huì)對(duì)代碼的編寫(xiě)有過(guò)多先入為主的觀念。但對(duì)于已經(jīng)有其他語(yǔ)言開(kāi)發(fā)經(jīng)驗(yàn)的我來(lái)說(shuō),也花了好一陣子才適應(yīng)它的語(yǔ)法。
pygame加載字體顯示文字
# 220是字號(hào) my_font = pygame.font.Font("./路徑/字體.ttf", 220) # my_font.render(文字內(nèi)容,是否抗鋸齒,文字顏色,文字背景色) text_element = my_font.render("文字內(nèi)容", 1, (255,255,255)) # 計(jì)算文本渲染后的寬度高度 text_width, text_height = my_font.size("文字內(nèi)容") # 將文本元素繪制到屏幕指定坐標(biāo)(元素左上角為原點(diǎn)) screen.blit(text_element, (100,100)
python獲取日期時(shí)間
import time def getTime(): # 獲取系統(tǒng)本地時(shí)間 localtime = time.localtime() # 將本地時(shí)間格式化為年月日 date_str = time.strftime("%Y 年 %m 月 %d 日", localtime) # 將本地時(shí)間格式化為24小時(shí)制 hm_str = time.strftime("%H:%M", localtime) # 將本地時(shí)間格式化獲取秒 second_str = time.strftime("%S", localtime)
在pygame的主循環(huán)中調(diào)用getTime,并將時(shí)間文本繪制到屏幕上,一個(gè)小時(shí)鐘就做好了。
顯示樹(shù)莓派當(dāng)前局域網(wǎng)IP
為什么要顯示當(dāng)前IP呢,因?yàn)榇蟛糠謺r(shí)候我不會(huì)給樹(shù)莓派連接鼠標(biāo)鍵盤(pán),那顯示IP后就可以直接通過(guò)VNC或者SSH來(lái)連接樹(shù)莓派了。
網(wǎng)上有Python獲取局域網(wǎng)IP的方案。這個(gè)是我用下來(lái)的最佳方案: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站各類(lèi)數(shù)據(jù)
這里最主要就是去抓取B站的各種API接口,這里也有熱心網(wǎng)友整理好的一份野生API文檔,大家可以自行查看使用自己需要的。
https://github.com/SocialSisterYi/bilibili-API-collect
這些B站的API中有一些是需要身份認(rèn)證的,這就需要我們自己去chrome瀏覽器中提取,主要會(huì)用到兩個(gè)cookie字段
- SESSDATA
- CSRF Token(bili_jct)
import requests # 請(qǐng)求直播間彈幕列表 res = requests.get('https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid='+BILI_LIVEID) data = res.json()
但是requests是同步執(zhí)行的,會(huì)阻塞主線程的執(zhí)行。比如在本例中,如果我直接使用requests發(fā)起請(qǐng)求,那么在請(qǐng)求時(shí)pygame的主邏輯循環(huán)就被卡住,這肯定不是我所希望的。網(wǎng)上有很多改異步的教程,我就不贅述了,這里我改用了另一個(gè)支持異步的庫(kù)叫?httpx?,用法和普通requests無(wú)比接近
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()
然而在我設(shè)計(jì)里,要請(qǐng)求5個(gè)B站接口才能獲取到顯示的全部數(shù)據(jù)字段。這個(gè)顯然也是可以?xún)?yōu)化的,而我最終選擇使用?uniCloud?來(lái)開(kāi)發(fā)一個(gè)云函數(shù),然后將這個(gè)云函數(shù)URL化后給python使用,這也是我曾經(jīng)在視頻教程里提到過(guò)的,我們可以用uniCloud來(lái)開(kāi)發(fā)后端接口,然后前端用Flutter或者其他任意框架,并不需要局限在uniapp。
將直播間彈幕念出來(lái)(TTS)
import pyttsx3 pyttsx3.speak("你好")
是的,這個(gè)pyttsx3用來(lái)做TTS很簡(jiǎn)單,但它是利用系統(tǒng)自帶的服務(wù)來(lái)完成的。
- Windows系統(tǒng):SAPI5
- MacOS:NSSpeechSynthesizer
- Linux:eSpeak
優(yōu)點(diǎn)就像前面的代碼,使用非常簡(jiǎn)單。缺點(diǎn)是在各個(gè)平臺(tái)不太統(tǒng)一,跨端也會(huì)遇到一些兼容性問(wèn)題。比如我在mac上開(kāi)發(fā),在linux上運(yùn)行,效果是不一樣的。這個(gè)方法默認(rèn)也是同步的,就是在播放語(yǔ)音時(shí),是阻塞主線程的,等語(yǔ)音播放結(jié)束后,主線程才會(huì)繼續(xù)執(zhí)行。這個(gè)體驗(yàn)就太差了,我要等彈幕結(jié)束,彈幕才能在屏幕上跑起來(lái)。
解決方案:使用Thread開(kāi)啟子線程執(zhí)行
from threading import Thread Thread(target=pyttsx3.speak,args=('你好',)).start()
總結(jié)
Python還挺好玩的,第一次寫(xiě)雖有一些不適應(yīng),遇到問(wèn)題google一下,也能很快找到解決方案。開(kāi)發(fā)效率非常高,以后有機(jī)會(huì)還會(huì)拿Python多寫(xiě)點(diǎn)東西。
github倉(cāng)庫(kù)
本項(xiàng)目代碼已全部開(kāi)源,喜歡的朋友請(qǐng)給個(gè)Star以示鼓勵(lì)吧 https://github.com/ezshine/raspi-bilihelper
原文鏈接:https://blog.csdn.net/Python_shannian/article/details/122862646
相關(guān)推薦
- 2022-12-30 react中useState改變值不渲染的解決方式_React
- 2022-06-01 Snort中pcre和正則表達(dá)式的使用詳解_正則表達(dá)式
- 2022-04-29 DataTable的AcceptChanges()和RejectChanges()方法介紹并實(shí)現(xiàn)Da
- 2022-05-28 Entity?Framework?Core種子數(shù)據(jù)Data-Seeding_實(shí)用技巧
- 2022-08-23 python3.7安裝matplotlib失敗問(wèn)題的完美解決方法_python
- 2022-04-02 C語(yǔ)言對(duì)冒泡排序進(jìn)行升級(jí)介紹_C 語(yǔ)言
- 2022-08-02 c#?Task.Wait()與awaiat?Task異常處理的區(qū)別說(shuō)明_C#教程
- 2023-04-03 python中super().__init__()作用詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支