Python实现B站UP主小助手详解开发流程

功能点

  • 显示日期时间
  • 显示树莓派当前局域网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

到此这篇关于Python实现B站UP主小助手详解开发流程的文章就介绍到这了,更多相关Python B站助手内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python b站视频下载的五种版本

    项目地址: https://github.com/Henryhaohao/Bilibili_video_download 介绍 对于单P视频:直接传入B站av号或者视频链接地址(eg: 49842011或者https://www.bilibili.com/video/av49842011) 对于多P视频: 1.下载全集:直接传入B站av号或者视频链接地址(eg: 49842011或者https://www.bilibili.com/video/av49842011) 2.下载其中一集:传入那一集

  • 教你如何使用Python下载B站视频的详细教程

    前言 众所周知,网页版的B站无法下载视频,然本人喜欢经常在B站学习,奈何没有网时,无法观看视频资源,手机下载后屏幕太小又不想看,遂写此程序以解决此问题 步骤 话不多说,进入正题 1.在电脑上下载python的开发环境,点一下,观看具体步骤 2.下载pycharm开发工具,点一下观看具体步骤 3.同时按键盘上的win键与r键,在弹出的对话框中输入cmd 点击确定进入cmd命令行,在里面输入pip install you-get,之后按键盘enter键,进行you-get的下载,下载完后退出cmd

  • Python编程实现下载器自动爬取采集B站弹幕示例

    目录 实现效果 UI界面 数据采集 小结 大家好,我是小张! 在<Python编程实现小姐姐跳舞并生成词云视频示例>文章中简单介绍了B站弹幕的爬取方法,只需找到视频中的参数 cid,就能采集到该视频下的所有弹幕:思路虽然很简单,但个人感觉还是比较麻烦,例如之后的某一天,我想采集B站上的某个视频弹幕,还需要从头开始:找cid参数.写代码,重复单调: 因此我在想有没有可能一步到位,以后采集某个视频弹幕时只需一步操作,比如输入想爬取的视频链接,程序能自动识别下载 实现效果 基于此,借助 PyQt5

  • 基于Python制作B站视频下载小工具

    目录 1. 原理简介 2. 网页分析 3. 视频爬取 4. 存入本地 5. GUI工具制作 1. 原理简介 原理很简单,就是获取视频资源的源地址,然后爬取视频的二进制内容,再写入到本地即可. 2. 网页分析 打开该网页,然后F12进入开发者模式,接着点开网络—>全部,因为视频资源一般比较大,我这里根据大小进行了从大到小的排序,找到了第一条这些可能和视频源地址有关. 然后,我们复制找到的这条里的url部分不变的部分,回到元素中ctrl+F搜索,找到了可能和视频源地址有关的节点. 果然,我们复制这部

  • Python基于Tkinter开发一个爬取B站直播弹幕的工具

    简介 使用Python Tkinter开发一个爬取B站直播弹幕的工具,启动后在弹窗中输入房间号即可,弹幕内容会保存在脚本文件同级目录下的.log扩展名的文件中 开发工具 python 3.7.9 pycharm 2019.3.5 实现代码 import threading import time import tkinter.simpledialog # 使用Tkinter前需要先导入 from tkinter import END, messagebox import requests # 全

  • Python获取B站粉丝数的示例代码

    要使用代码,需要安装Python 3.x,并且要安装库,在cmd输入pip install requests json time 复制代码,修改最上方变量改成你自己的UID,保存为xxx.py,运行就可以了 用于学习了解的核心代码: import requests import json bilibili_api = requests.get("http://api.bilibili.com/x/relation/stat?vmid=1") # 访问网址,数据存到变量,1是用户UID

  • 如何用python抓取B站数据

    概述 可以获取的数据包括: video-视频模块 user-用户模块 dynamic-动态模块 这次用"Running Man"十周年特辑的视频,来做个获取弹幕的Demo. 我是对比 没有对比,就没有伤害,就像最近的"哈工大"某学生和"浙大"某学生一样. 这是之前获取弹幕的过程: 1.弹幕数据接口 https://comment.bilibili.com/123072475.xml (一个固定的url地址 + 视频的cid + .xml) 2.利

  • 如何使用python爬取B站排行榜Top100的视频数据

    记得收藏呀!!! 1.第三方库导入 from bs4 import BeautifulSoup # 解析网页 import re # 正则表达式,进行文字匹配 import urllib.request,urllib.error # 通过浏览器请求数据 import sqlite3 # 轻型数据库 import time # 获取当前时间 2.程序运行主函数 爬取过程主要包括声明爬取网页 -> 爬取网页数据并解析 -> 保存数据 def main(): #声明爬取网站 baseurl = &q

  • 基于python对B站收藏夹按照视频发布时间进行排序的问题

    前言 在最一开始,我的B站收藏一直是存放在默认收藏夹中,但是随着视频收藏的越来越多,没有分类的视频放在一起,想在众多视频中找到想要的视频非常困难,因此就对收藏夹里面的视频进行了分类.但是分类之后紧接着又出现了一个新的问题:原来存放在默认收藏夹里面视频的相对顺序被打乱了--明明前几天刚收藏的视频却要翻很多很多页才能找到,因此有了这个程序. 程序的作用 因为我们看到的视频大部分都是通过推荐得到的,而推荐的视频大部分都是刚发布不久,因此大部分收藏的视频的顺序也基本是按照视频发布的顺序来的.那么通过程序

  • Python实现B站UP主小助手详解开发流程

    功能点 显示日期时间 显示树莓派当前局域网IP 显示当前UP主粉丝数 显示B站未读消息 显示B站视频总计播放数 显示视频总计获赞数 显示总计获得充电次数 显示直播间人气值 显示直播间弹幕 将直播间弹幕念出来(TTS) 大家好,我是 大帅 ,一个 老 程序 猿 . 这是我第一次写Python哟,写得不好请多多指教 前言 前段时间在掘金社区写文章,得了一台 树莓派3B ,加上之前在闲鱼曾经淘到一块 1280x400 的长条屏,就想着把一直想要的哔哩哔哩UP主助手给完成了. 先上效果 有弹幕的时候是这

  • Python实现B站UP主自动监控功能详解

    目录 开发工具 环境搭建 原理简介 1.确定小目标 2.模拟登录 3.自动关注 4.实时监控 效果展示 众所周知,B站有很多有趣的UP主,可以教大家一些"实用"的知识: 但是他们一般都没有固定的更新时间,那么如何才能第一时间知道自己又有新的饭点可以看的下饭素材呢?当然是用python来写个脚本自动监控UP是否更新了视频,并自动下载啦~ 废话不多说,让我们愉快地开始吧~ 开发工具 Python版本:3.7.8 相关模块: DecryptLogin模块: videofetch模块: 以及一

  • Python实现的可可爱爱的小粽子详解

    目录 粽子和制作 建立两个精灵并搭建背景元素 粽子和爱心 背景搭建 碰撞模块 贪吃模块 计数机制 完整代码 粽子和制作 PS截取小爱心和我最爱的咸粽子 建立两个精灵并搭建背景元素 粽子和爱心 先是建立一个粽子对象,也就是一个精灵,类里面需要继承pygame.sprite.Sprite类,这是碰撞模块的重要部分.update函数是控制粽子方向,并防止粽子跑出边界,当粽子触碰到边界时出发触底反弹功能,使粽子向边界另一方向反弹移动. class Player(pygame.sprite.Sprite)

  • 用Python做一个久坐提醒小助手的示例代码

    不论是日常的工作还是学习,现代年轻人在电脑屏幕时长数据能让人惊掉下巴,继而引发一系列身体不适的现象.小李也是久坐族中的一员,为了时刻提醒自己起来活动活动,我开发了一款基于PythonGUI编程的久坐提醒小助手. 整体设计 整体的构思类似于一个番茄时钟,提供一个倒计时功能并且在完成计时时发出警告.主要分为如下几个模块,一是时间选择模块,二是按钮模块,控制计时开始.暂停以及恢复,三是倒计时显示模块,并在倒计时完成之后发出警告. 模块一 这一块主要是组合框的设计,并传递所选择时间的具体数值,非常简单.

  • 用python基于appium模块开发一个自动收取能量的小助手

    导语 ​ 昨天楼下买东西,超市老板居然让我加他支付宝好友???? 嗯哼!对啦,我也很疑惑来着!! 当时以为是方便下次买东西,哦吼也没多想,早上起来睁着我睡眼惺忪的熊猫眼,完了,我的能量都被偷完了! 对!今天木木子教大家种"树"!大家还记得蚂蚁森林叭,轻轻松松手机上就可以种树了! ​ 正文 本文是基于appium模块开发的自动收取能量的小助手! 参数配置如下: desired_caps = { "platformName": "Android",

  • Python恋爱小助手之必拿下

    目录 导语 ​​​​​​​Ps--小故事 正文 一.Part 1 表白篇-界面化表白小程序 1)环境安装 2)素材自备 3)正式敲代码 4)效果图 二.Part 2 表白篇-字符画表白小程序 1)环境安装 2)素材自备 3)  正式敲代码 4)效果图 总结 导语 害!现在是10月份了,国庆过完也降温了--还有几个月就过年了,哦吼~ 这一年就快过去了,不知道小编带给大家这么多的表白代码都用了没?用了没吖?如果没用的话小编会继续助攻! 不知道各位单身人士,有没有人从单身dog进化为秀恩爱dog撒~

  • 基于Python的自媒体小助手---登录页面的实现代码

    核心技术:Python3.7 GUI技术:Tkinter (Python已经内置) 好多文章写Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 我看了N遍也没够好多东西都没有就基本的介绍...还不够.我搞这个也是为了项目服务先给大家来个截图吧,其实知识点还是蛮多的. 在window上有点瑕疵了,在mac上海可以吧.使用到的技术我罗列一下完了在分享给大家代码. 1.窗体设置标题和设置图标,图标格式是ICO的,一般我们事宜Png转一下.https://www.easyicon.

  • Python天气语音播报小助手

    导语​ 马上就要迎来国庆小长假了~激不激动,兴不兴奋!​ ​ 那今年国庆:天气怎么样?能不能出门逛街?能不能出去旅游? -- 来来来,木木子为你整理好啦!​​这个假期,你那里的天气如何? ​ 正文 旅游出门就要挑个好的天气!下雨天哪儿哪儿都不舒服. 今天小编带大家写一款Python天气语音播报小助手! 环境安装:Python3.6.pycharm2021.及自带的模块等. pip install -i https://pypi.douban.com/simple/ requests pip in

  • 基于Python实现西西成语接龙小助手

    目录 介绍 爬虫模块 前缀树搜索提示 成语接龙 介绍 代码地址:https://github.com/taishan1994/chinese_chengyujielong 读完该文,你可以收获: python爬虫的简单使用. 构建前缀树以进行搜索提示. 构建一个简单的成语接龙小程序. 爬虫模块 首先展示下我们最终获得的成语的数据: ,成语,拼音,成语解释,典故出处,近义词,反义词,常用程度,感情色彩,语法用法,成语结构,产生年代,英文翻译,成语谜面 0,阿匼取容,ē ǎn qǔ róng,阿匼:

随机推荐