跳到主要内容

B站粉丝显示器

normal video.mp4

项目介绍


本项目利用未来板彩屏以及WIFI优势,通过MicroPython内置库 urequests ujson 获取B站粉丝数的网络API结果并加以解析,最终显示在彩屏上

项目将包含以下3个功能:

  • 自动获取任意B站UP主的昵称
  • 自动获取任意B站UP主的粉丝数
  • 检测粉丝数变化并加以提醒

项目要点:

  • 掌握urequests和ujson的使用
  • 了解网络API的调用过程

  项目清单

材料
未来板
Type-C 数据线
网络热点(手机/路由器)

  项目原理

urequests和ujson 是MicroPython中标准的库,如果你之前接触过Python中的requests和json库,就大概了解它们的用法,为了以视区别,在MicroPython库中特地在其前面增加了u

API (Application Programming Interface),中文名为 应用程序接口,是一些预先定义的接口,目的是实现与其它组件的交互。

以获取B站粉丝API流程为例:
urequests和ujson操作原理.png

人能听懂的流程:

信息

以下我们先用电脑把这流程跑一遍

  1. 通过网络资料查询,我们得到了B站粉丝API,后面的一串数字是对应不同UP主的ID号,通过改变ID号,即可获得不同UP主的情况信息。如下方就是喵家的B站信息API:

https://api.bilibili.com/x/web-interface/card?mid=25299911

  1. 将此API复制粘贴到浏览器中,得到一堆很乱的信息,这个就是JSON文本,如果你细心看下,其实粉丝数follower:2730 已经含在这堆信息了,但这个结果肯定不是我们想要的

image.png

  1. 把JSON文本解析为比较舒服的格式,我们使用在线网页的JSON解析:

在线网址JSON解析网站https://c.runoob.com/front-end/53
image.png

  1. 得到所需要的信息

    • object—>data—>card—>name:可获取UP主昵称Kittenbot小喵科技
    • object—>data—>follower:可获得粉丝数目2734
  2. 同时,我们还获得了face的链接(UP主的头像),通过此链接可以下载UP主的头像,我们先把照片下载 下来,转换为png,并且把图片缩放到80x80,这里推荐一个FSCapture的图片处理工具,容易上手操作简单。以下为处理好的图片
    bili80.png

  3. 只需要把这一过程翻译为MicroPython代码,交给未来板自己操作,则可实现获取任意UP主的相关信息

实操步骤


步骤概况

  • 第一步:KittenCode安装与未来板连接
  • 第二步:编写API获取信息的
  • 第三步:增加UP头像显示
  • 第四步:增加粉丝数目触发不同音效
  • 第五步:增加时间显示

第一步:KittenCode安装与未来板连接

推荐使用KittenBot研发推出的适合中小学的Python编辑器——KittenCode
下载地址:https://www.kittenbot.cn/kittencode_download

安装过程非常简单,安装完毕将未来板连接上数据线,根据如图操作接口连接未来板
image.png

危险

如果出现串口无法连接的情况,查看** [FAQ**](https://www.yuque.com/kittenbot/hardwares/future-faq#Ive8s)

[

](https://www.yuque.com/kittenbot/hardwares/future-faq#Ive8s)

第二步:编写API获取信息

程序工作流程:

  1. 导入必要库
  2. 连接网络
  3. 通过urequests和ujson库获取数据
  4. 屏幕信息显示
信息

以下代码需要更改为你的wifi名称与密码!

from future import *        # 未来板必要库
import urequests # 网络API请求
import ujson # 用于处理网络返回的数据

router = 'yourwifi' # 此处需要更改为你的wifi名称!!!!
pwd = '12345678' # 此处需要更改为你的wifi密码!!!!
#只有当前未连接网络才进行网络连接,避免反复连接
if not(wifi.sta.isconnected()):
wifi.connect(router,pwd)

mid="25299911" #B站主页ID号,可以进行更换
API_URL = "https://api.bilibili.com/x/web-interface/card?mid="+mid

r = urequests.get(API_URL)
bweb = ujson.loads(r.content)
fans = bweb['data']['follower']
name = bweb['data']['card']['name']

screen.sync = 0
screen.clear()
screen.refresh()

screen.textCh(name, x= 0, y=100,ext=1,color=(0,0,255))
screen.textCh('粉丝数:', x= 20, y=116,ext=1,color=255)
screen.text(fans, x= 65, y=114,ext=2,color=(255,0,0))
screen.refresh()

将代码上传到未来板上
![image.png](1621265838154-cb36255a-5c7d-488b-84a3-9a62415029c7.png)

结果如下
image.png

第三步:增加UP头像显示

从上图结果看出,如果不增加图片,总感觉缺少了点什么,下载该图片并添加到项目文件列表中
bili80.png
image.png image.png

成功导入图片后,可见硬件文件管理列表中出现目标文件

危险

仅支持png或bmp格式图片

image.png

将下面代码复制并覆盖掉原来的代码后上传到硬件

from future import *        # 未来板必要库
import urequests # 网络API请求
import ujson # 用于处理网络返回的数据

router = 'yourwifi' # 此处需要更改为你的wifi名称!!!!
pwd = '12345678' # 此处需要更改为你的wifi密码!!!!
#只有当前未连接网络才进行网络连接,避免反复连接
if not(wifi.sta.isconnected()):
wifi.connect(router,pwd)

mid="25299911" #B站主页ID号,可以进行更换
API_URL = "https://api.bilibili.com/x/web-interface/card?mid="+mid

r = urequests.get(API_URL)
bweb = ujson.loads(r.content)
fans = bweb['data']['follower']
name = bweb['data']['card']['name']

screen.sync = 0
screen.clear()
screen.refresh()

screen.loadPng('bili80.png',x=40,y=17) #显示头像——新增
screen.textCh(name, x= 0, y=100,ext=1,color=(0,0,255))
screen.textCh('粉丝数:', x= 20, y=116,ext=1,color=255)
screen.text(fans, x= 65, y=114,ext=2,color=(255,0,0))
screen.refresh()

结果如下
![image.png](1623066054778-9c1e0f8c-1b98-4ad1-91f1-2247f24b3155.png)

第四步:粉丝数目增减后触发不同音效

果大家细心查看代码,可以发现我们的粉丝数目并没有循环获取,因此我们需要把API获取放入到循环中。并且增加当粉丝有变化时,对应发出音效和及改变粉丝数颜色。

将下面代码复制并覆盖掉原来的代码后上传到硬件

from future import *        # 未来板必要库
import urequests # 网络API请求
import ujson # 用于处理网络返回的数据

router = 'yourwifi' # 此处需要更改为你的wifi名称!!!!
pwd = '12345678' # 此处需要更改为你的wifi密码!!!!
#只有当前未连接网络才进行网络连接,避免反复连接
if not(wifi.sta.isconnected()):
wifi.connect(router,pwd)

mid="25299911" #B站主页ID号,可以进行更换
API_URL = "https://api.bilibili.com/x/web-interface/card?mid="+mid

r = urequests.get(API_URL)
bweb = ujson.loads(r.content)
fans = bweb['data']['follower']
name = bweb['data']['card']['name']

num=fans
oldnum=num
fancolor=(255,255,255)

screen.sync = 0
screen.clear()
screen.refresh()

while 1:

screen.fill(0)

r = urequests.get(API_URL)
bweb = ujson.loads(r.content)
fans = bweb['data']['follower']
name = bweb['data']['card']['name']

num=fans
if(oldnum!=num):
if(oldnum>num):
buzzer.melody(WAWA)
fancolor=(255,0,0)
else:
buzzer.melody(CORRECT)
fancolor=(0,255,0)
oldnum=num

screen.loadPng('bili80.png',x=40,y=17) #显示头像
screen.textCh(name, x= 0, y=100,ext=1,color=(0,0,255))
screen.textCh('粉丝数:', x= 20, y=116,ext=1,color=255)
screen.text(fans, x= 65, y=114,ext=2,color=fancolor)
screen.refresh()

第五步:增加时间显示

如果未来板只是显示粉丝数目确实有点浪费,那就增加时间显示吧

将下面代码复制并覆盖掉原来的代码后上传到硬件

from future import *        # 未来板必要库
import urequests # 网络API请求
import ujson # 用于处理网络返回的数据

from machine import RTC # 未来板时钟
import ntptime # 同步网络时间


router = 'yourwifi' # 此处需要更改为你的wifi名称!!!!
pwd = '12345678' # 此处需要更改为你的wifi密码!!!!
#只有当前未连接网络才进行网络连接,避免反复连接
if not(wifi.sta.isconnected()):
wifi.connect(router,pwd)

rtc = RTC() # 实例化一个时钟对象来计算时间,连上wifi后操作
ntptime.settime() # 自动同步网络时间到主控板时钟

mid="25299911" #B站主页ID号,可以进行更换
API_URL = "https://api.bilibili.com/x/web-interface/card?mid="+mid

r = urequests.get(API_URL)
bweb = ujson.loads(r.content)
fans = bweb['data']['follower']
name = bweb['data']['card']['name']

num=fans
oldnum=num
fancolor=(255,255,255)

screen.sync = 0
screen.clear()
screen.refresh()

while 1:

screen.fill(0)

time = rtc.datetime() # 获取时间,格式为(年,月,日,星期,小时,分钟,秒,微妙)
hourMin = str(time[4])+':'+ str(time[5])+':'
sec = str(time[6])
screen.textCh("时间:", x= 0, y=0,color=(0,255,255))
screen.text(hourMin, x= 50, y=3,color=(0,255,0))
screen.text(sec, x= 100, y=3,color=(0,255,0))


r = urequests.get(API_URL)
bweb = ujson.loads(r.content)
fans = bweb['data']['follower']
name = bweb['data']['card']['name']

num=fans
if(oldnum!=num):
if(oldnum>num):
buzzer.melody(BA_DING)
fancolor=(255,0,0)
else:
buzzer.melody(CORRECT)
fancolor=(0,255,0)
oldnum=num

screen.loadPng('bili80.png',x=40,y=17) #显示头像
screen.textCh(name, x= 0, y=100,ext=1,color=(0,0,255))
screen.textCh('粉丝数:', x= 20, y=116,ext=1,color=255)
screen.text(fans, x= 65, y=114,ext=2,color=fancolor)
screen.refresh()

结果如下
image.png