<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大家好,我是 大帥 ,一個 老 程式 猿 。
這是我第一次寫Python喲,寫得不好請多多指教
前段時間在掘金社群寫文章,得了一臺 樹莓派3B ,加上之前在閒魚曾經淘到一塊 1280x400 的長條屏,就想著把一直想要的嗶哩嗶哩UP主助手給完成了。
先上效果
有彈幕的時候是這樣的
為什麼兩張截圖的顯示器不一樣呢?哎,說起來都是眼淚,那天晚上我直播寫這個程式碼寫到凌晨2點,程式碼寫完我準備把樹莓派和顯示屏都塞到一個紙盒子裡,這個過程中不知道損壞了哪裡,螢幕點不亮了...
不過好在樹莓派沒問題,閒話不多說,先來看看我對於框架選型的思考
為什麼最後會選用 Python 這個我並不會的語言呢?因為最終是希望這個程式執行在樹莓派上,所以首先調研了幾種在樹莓派上搭建 GUI介面 的方式。
雖然我對3、4更加熟悉,但畢竟樹莓派的效能有限,我只好棄用。1我不熟,但是在我的規劃裡,我並不需要一些標準化的UI元件。所以最終選擇了 pygame 的框架,並且樹莓派系統裡也預設安裝了 pygame 環境,雖從未寫過 python ,但對 python 的大名如雷貫耳,早就想學習一下,正好拿這個專案練練手
功能是不是還挺豐富的,從寫第一行程式碼到完成也就花了兩天不到的時間,這也證明了使用 python 開發的高效率,下面來說說這些功能開發中我遇到了哪些問題,我又是如何解決的。
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對於新程式設計師可能挺友好的,不會對程式碼的編寫有過多先入為主的觀念。但對於已經有其他語言開發經驗的我來說,也花了好一陣子才適應它的語法。
# 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)
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後就可以直接通過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站的各種API介面,這裡也有熱心網友整理好的一份野生API檔案,大家可以自行檢視使用自己需要的。
https://github.com/SocialSisterYi/bilibili-API-collect
這些B站的API中有一些是需要身份認證的,這就需要我們自己去chrome瀏覽器中提取,主要會用到兩個cookie欄位
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。
import pyttsx3 pyttsx3.speak("你好")
是的,這個pyttsx3用來做TTS很簡單,但它是利用系統自帶的服務來完成的。
優點就像前面的程式碼,使用非常簡單。缺點是在各個平臺不太統一,跨端也會遇到一些相容性問題。比如我在mac上開發,在linux上執行,效果是不一樣的。這個方法預設也是同步的,就是在播放語音時,是阻塞主執行緒的,等語音播放結束後,主執行緒才會繼續執行。這個體驗就太差了,我要等彈幕結束,彈幕才能在螢幕上跑起來。
解決方案:使用Thread開啟子執行緒執行
from threading import Thread Thread(target=pyttsx3.speak,args=('你好',)).start()
Python還挺好玩的,第一次寫雖有一些不適應,遇到問題google一下,也能很快找到解決方案。開發效率非常高,以後有機會還會拿Python多寫點東西。
本專案程式碼已全部開源,喜歡的朋友請給個Star以示鼓勵吧 https://github.com/ezshine/raspi-bilihelper
到此這篇關於Python實現B站UP主小助手詳解開發流程的文章就介紹到這了,更多相關Python B站助手內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45