初出茅庐的小李博客之ESP8266获取自己B站粉丝数据

news2024/11/16 19:28:33

获取方式

ESP8266发起HTTP请求+解析json数据

获取粉丝API:
https://api.bilibili.com/x/relation/stat?vmid=349513188

API浏览器测试返回结果

{
    "code": 0,
    "message": "0",
    "ttl": 1,
    "data": {
        "mid": 349513188,   //用户的UID号
        "following": 1223,  //用户的关注数
        "whisper": 0,
        "black": 0,
        "follower": 7951    //用户的粉丝数
    }
}

实际结果

在这里插入图片描述

开发方式/硬件平台

Arduino IDE + ESP8266 NODEMCU板子

实现步骤

  1. 安装ArduinoIED 开发发环境
    这个非常简单,直接搜官网地址下载即可。https://www.arduino.cc/en/software
    在这里插入图片描述

  2. 添加开发板
    在这里插入图片描述
    链接地址:
    https://arduino.esp8266.com/stable/package_esp8266com_index.json

  3. 安装项目需要的库

#include <ESP8266WiFi.h>        // 本程序使用ESP8266WiFi库
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <ArduinoJson.h>

其中ArduinoJson 库需要单独安装,其他选好开发板就会自动安装

  1. CV大法
    这个过程比较漫长就不一一记录了,反正遇到了挺多坑,也学到了很多知识
    直接上最终版本代码
#include <ESP8266WiFi.h>        // 本程序使用ESP8266WiFi库
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#include <ArduinoJson.h>

const char* ssid     = "AQST";                // 连接WiFi名
const char* password = "123456789";           // 连接WiFi密码(此处使用123456789为示例)
const String host    = "https://api.bilibili.com";
const String path    = "/x/relation/stat?vmid=";
const String uid     = "349513188";   
const unsigned char fingerprint[] = {0x00,0xb3,0x57,0x0f,0xaa,0x95,0xc7,0x03,0xeb,0x78,0x30,0xd9,0xfc,0xd8,0x2b,
0x89,0xd8,0xce,0x06,0xa8,0x30,0x4e,0x7a,0x8d,0x3f,0x18,0x60,0xa5,0x90,0x74,0xf4,0xdc};
/*
  访问API说明:https://api.bilibili.com/x/relation/stat?vmid=349513188
  浏览器访问上面连接得到数据:
  {
    "code": 0,
    "message": "0",
    "ttl": 1,
    "data": {
        "mid": 349513188,
        "following": 1223,
        "whisper": 0,
        "black": 0,
        "follower": 7951
    }
}
  参数说明:
  host:api.bilibili.com
  path:/x/relation/stat?vmid=
  uid:349513188
*/
/*
  原文链接:https://blog.csdn.net/weixin_43794311/article/details/133140939
*/

void de_json(String input)
{
  //从这里开始是使用辅助工具生成的
  StaticJsonDocument<256> doc;
  DeserializationError error = deserializeJson(doc, input);
  if (error) 
  {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }

  int code             = doc["code"]; // 0
  const char* message  = doc["message"]; // "0"
  int ttl              = doc["ttl"]; // 1

  JsonObject data      = doc["data"];
  long data_mid        = data["mid"]; // 231216575
  int data_following   = data["following"]; // 154
  int data_whisper     = data["whisper"]; // 0
  int data_black       = data["black"]; // 0
  int data_follower    = data["follower"]; // 1  
  //辅助工具得到的代码到这里结束,下面是自己想要显示的内容

  Serial.println("=======================");
  //Serial.println(ttl); 
  Serial.print("初出茅庐的小李的USID是: ");              // 串口监视器输出用户ID
  Serial.println(data_mid);     
  Serial.print("初出茅庐的小李B站粉丝数: ");              // 串口监视器输出粉丝数量
  Serial.println(data_follower);
  Serial.print("初出茅庐的小李B站关注数: ");              // 串口监视器输出关注数量
  Serial.println(data_following);  
  Serial.print("=======================");
  Serial.println();
}


void setup() {
  pinMode(2, OUTPUT);                          // 设置GPIO2为输出模式
  digitalWrite(2, HIGH);                       // turn the LED on (HIGH is the voltage level)
  Serial.begin(9600);                          // 启动串口通讯
  WiFi.begin(ssid, password);                  // 启动网络连接
  Serial.print("Connecting to ");              // 串口监视器输出网络连接信息
  Serial.print(ssid);
  Serial.println(" ...");                      // 告知用户NodeMCU正在尝试WiFi连接
  int i = 0;                                   // 这一段程序语句用于检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED)        // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
  {     
    delay(1000);                               // 如果WiFi连接成功则返回值为WL_CONNECTED                       
    Serial.print(i++); Serial.print(' ');      // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值                                              
                                               // 同时NodeMCU将通过串口监视器输出连接时长读秒。
  }                                            
  Serial.println("");                          // WiFi连接成功后
  Serial.println("连接成功!");                  // NodeMCU将通过串口监视器输出"连接成功"信息。
  Serial.print("IP地址是:    ");                // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
  Serial.println(WiFi.localIP());              // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
}


void loop() {
  digitalWrite(2, HIGH);                     
  delay(1000);                     
  digitalWrite(2, LOW);  
  delay(1000);       
  if(WiFi.status()==WL_CONNECTED)
  {
    std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
   // client->setFingerprint(fingerprint);
    client->setInsecure();  //也可以不使用指纹证书登录
    HTTPClient https;
    Serial.print("[HTTPS] begin...\n");
    if(https.begin(*client,host+path+uid)) 
    {  // HTTPS
      Serial.print("[HTTPS] GET...\n");
      // start connection and send HTTP header
      int httpCode = https.GET();  //访问url返回的状态码
      // httpCode will be negative on error
      if (httpCode > 0)
      {
        // HTTP header has been send and Server response header has been handled
        Serial.printf("[HTTPS] GET... code: %d\n", httpCode);
        // file found at server
        if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) 
        {
          String payload = https.getString();
          Serial.println(payload);
          de_json(payload);  //将请求到的json数据进行解析显示
        }
      } 
      else 
      {
        Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
      }
      https.end();
    } 
    else 
    {
      Serial.printf("[HTTPS] Unable to connect\n");
    }
  }
  Serial.println("代码正在运行...");     

  delay(5000); 
}

代码解释

  • GPIO2是开发板自带的一颗LED灯
  • AQST是我电脑开的热点名字
  • 123456789是电脑开的热点的密码
    连上后效果

在这里插入图片描述

编译代码

在这里插入图片描述

编译结果

. Variables and constants in RAM (global, static), used 29316 / 80192 bytes (36%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ DATA     1504     initialized variables
╠══ RODATA   1948     constants       
╚══ BSS      25864    zeroed variables
. Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 60603 / 65536 bytes (92%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ ICACHE   32768    reserved space for flash instruction cache
╚══ IRAM     27835    code in IRAM    
. Code in flash (default, ICACHE_FLASH_ATTR), used 361136 / 1048576 bytes (34%)
║   SEGMENT  BYTES    DESCRIPTION
╚══ IROM     361136   code in flash   

上传代码

在这里插入图片描述

上传日志

esptool.py v3.0
Serial port COM16
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: e8:db:84:e1:5a:a8
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 396576 bytes to 293196...
Writing at 0x00000000... (5 %)
Writing at 0x00004000... (11 %)
Writing at 0x00008000... (16 %)
Writing at 0x0000c000... (22 %)
Writing at 0x00010000... (27 %)
Writing at 0x00014000... (33 %)
Writing at 0x00018000... (38 %)
Writing at 0x0001c000... (44 %)
Writing at 0x00020000... (50 %)
Writing at 0x00024000... (55 %)
Writing at 0x00028000... (61 %)
Writing at 0x0002c000... (66 %)
Writing at 0x00030000... (72 %)
Writing at 0x00034000... (77 %)
Writing at 0x00038000... (83 %)
Writing at 0x0003c000... (88 %)
Writing at 0x00040000... (94 %)
Writing at 0x00044000... (100 %)
Wrote 396576 bytes (293196 compressed) at 0x00000000 in 26.0 seconds (effective 122.2 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

运行效果

在这里插入图片描述

[HTTPS] GET...
[HTTPS] GET... code: 200
{"code":0,"message":"0","ttl":1,"data":{"mid":349513188,"following":1223,"whisper":0,"black":0,"follower":7951}}
=======================
初出茅庐的小李的USID是: 349513188
初出茅庐的小李B站粉丝数: 7951
初出茅庐的小李B站关注数: 1223
=======================
代码正在运行...
[HTTPS] begin...
[HTTPS] GET...
[HTTPS] GET... code: 200
{"code":0,"message":"0","ttl":1,"data":{"mid":349513188,"following":1223,"whisper":0,"black":0,"follower":7951}}
=======================
初出茅庐的小李的USID是: 349513188
初出茅庐的小李B站粉丝数: 7951
初出茅庐的小李B站关注数: 1223
=======================
代码正在运行...
[HTTPS] begin...
[HTTPS] GET...
[HTTPS] GET... code: 200
{"code":0,"message":"0","ttl":1,"data":{"mid":349513188,"following":1223,"whisper":0,"black":0,"follower":7951}}
=======================
初出茅庐的小李的USID是: 349513188
初出茅庐的小李B站粉丝数: 7951
初出茅庐的小李B站关注数: 1223
=======================
代码正在运行...

参考资料

https://blog.csdn.net/weixin_43794311/article/details/133140939
https://blog.csdn.net/qq_55493007/article/details/128421685

注意:本博客仅作为自己学习记录分享、欢迎大家留言讨论~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python+Appium实现自动化测试

一、环境准备 1.脚本语言&#xff1a;Python3.x IDE&#xff1a;安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境&#xff0c;path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows&#xff0c;官网地址 Redirecting 点击下载按钮会到GitHub的…

【safetensor】介绍和基础代码

Hugging Face, EleutherAI, StabilityAI 用的多 介绍 文件形式 header&#xff0c;体现其特性。如果强行将pickle或者空软连接 打开&#xff0c;会出现报错。解决详见&#xff1a;debug 连接到其他教程结构和参数 安装 with pip:Copied pip install safetensors with con…

阶段六-Day05-MyBatis3

一、多表查询&#xff08;面试题&#xff09; 1. 介绍 多表查询是在企业中必不可少的&#xff0c;无论多么简单的项目里通常会出现多表查询的操作。因为只要是关系型数据库&#xff0c;在设计表时都需要按照范式进行设计&#xff0c;为了减少数据冗余&#xff0c;都会拆成多个…

String、StringBuffer、StringBuilder 适合的应用场景

文章目录 String适用场景示例代码 StringBuffer适用场景示例代码 StringBuilder适用场景示例代码 性能比较总结 &#x1f389;欢迎来到Java学习路线专栏~String、StringBuffer、StringBuilder 适合的应用场景 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff…

《视觉SLAM十四讲》公式推导(二)

CH3-5 四元数表示旋转 三维空间中任意点均可用一个纯虚四元数表示即 p [ 0 , v ] T \boldsymbol{p}[0,\boldsymbol{v}]^T p[0,v]T&#xff0c;经一个单位四元数 q \boldsymbol{q} q的旋转后&#xff0c;得到 p ′ \boldsymbol{p} p′&#xff0c;则 p ′ q p q − 1 (3-5-1)…

STM32F4_中英文显示

目录 1. 液晶显示逻辑 2. 汉字显示原理 3. 实验程序 3.1 main.c 3.2 text.c 3.3 text.h 3.4 fontupd.c 3.5 fontupd.h 1. 液晶显示逻辑 字符编码&#xff1a; 由于计算机只能识别 0 和 1&#xff0c;文字也只能以 0 和 1 的形式在计算机里存储&#xff0c;所以我们需要…

算法通过村第十六关-滑动窗口|青铜笔记|滑动很简单

文章目录 前言滑动窗口的基本思想入门题目练习子数组最大平均数最长连续递增序列 总结 前言 提示&#xff1a;我宁愿做自己&#xff0c;做卑微的自己&#xff0c;也不愿做别人&#xff0c;无论那会多么快乐。 --《美丽新世界》 我们在数组和链表的部分就已经接触到了双指针的思…

IMX6ULL开发——第一个驱动程序

实现第一个应用程序&#xff1a;在IMX6ULL开发板上运行驱动程序hello_drv_test hello_drv_test #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <string.h>/** ./hel…

生产者消费者模式(c++实现)

生产者消费者模式思路就是&#xff1a;一批专门生产资源的线程 和一批专门处理资源的线程以及一个线程安全的任务队列组成的 。并且当任务队列满的时候阻塞生产线程&#xff0c;任务队列为空的时候阻塞消费线程。 要实现一个生产者消费者队列 1。需要实现线程同步&#xff0c;…

react的setState做了什么

1、为什么需要setState setState的作用是帮助我们更改数据的同时并且通知视图进行渲染。因为React并不会绑定视图和state&#xff0c;需要我们手动去更新视图。 2、setState什么时候是同步的&#xff0c;什么时候是异步的 setState这个方法在调用的时候是同步的&#xff0c;…

如果面试问到你redis的常用数据类型,你怎么和面试官聊上十分钟?

最近组长把一些简历推到我这边让我帮他面试几份&#xff0c;问到这种基础题目时收到的回答总是不太理想 1、最简单的回答&#xff1a; Redis存储的是key-value结构的数据&#xff0c;其中key是字符串类型&#xff0c;value有5种常用的数据类型&#xff1a; 字符串 string哈希 …

为什么spring默认采用单例bean

概 述 熟悉 Spring开发的朋友都知道 Spring 提供了 5种 scope&#xff0c;分别是&#xff1a; singleton: 单例模式&#xff0c;当spring创建applicationContext容器的时候&#xff0c;spring会欲初始化所有的该作用域实例&#xff0c;加上lazy-init就可以避免预处理&#xf…

磁盘分区如何分? 电脑磁盘分区免费软件指南!

列出并比较顶级免费磁盘分区管理器软件&#xff0c;以选择适用于 Windows 的最佳分区软件&#xff1a; 系统分区在现代计算机设备中起着非常重要的作用。它们可以存储数据&#xff0c;使系统文件远离用户数据&#xff0c;并在同一台设备上安装多个操作系统。但是&#xff0c;这…

MyBatis-Plus 实战教程一

这里写目录标题 简介快速上手数据库建立创建实体类修改参数引入依赖测试常见注解介绍TableNameTableIdTableField 常见配置仓库地址 简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;…

qt-C++笔记之信号与槽

qt-C笔记之信号与槽 code review! 本文抄自公众号&#xff1a;嵌入式小生 文章目录 qt-C笔记之信号与槽一.信号2.1.信号的发出2.2.信号的处理 二.槽函数2.1.带有默认参数的信号和槽函数2.2.使用QObject::connect()将信号连接到槽函数的三种方法2.2.1.第一种方法&#xff1a;使…

整理MongoDB文档:身份验证

整理MongoDB文档:身份验证 个人博客&#xff0c;求关注。 文章概叙 本文主要讲MongoDB在单机状态下的账户配置。理解了MongoDB的语法&#xff0c;对于如何配置用户权限会知道怎么配置&#xff0c;但是请注意给谁配置什么权限才是最重要的。 最小权限原则 系统的每个程序或者…

【C++编程语言】STL常用算法 算术生成和集合算法

1.算术生成算法概念 算法简介&#xff1a; accumlate 计算容器元素累计总和fill 向容器中添加元素 注意&#xff1a;算术生成算法属于小型算法 使用时包含头文件为#include<numeric> 2.accumulate /*函数原型&#xff1a;int accumulate(iterator beg ,iterator end…

热点不热!如何修复笔记本电脑未连接到移动热点的问题

当你远离常规Wi-Fi时,移动热点是让你的笔记本电脑上网的关键,但当它没有按计划运行时,你会怎么办?以下是Windows笔记本电脑无法连接到移动热点时的几种修复方法。 为什么我的笔记本电脑没有连接到我的热点 由于你的笔记本电脑正试图连接到另一个有限制和可能存在问题的设…

前端学成在线项目详细解析二

12-banner区域-课程表布局 HTML布局 <div class"right"><h3>我的课程表</h3><div class"content">1</div> </div> CSS样式 /* 课程表 */ .banner .right {margin-top: 60px;width: 218px;height: 305px;background-…

STM32F4_照相机

目录 前言 1. BMP编码 2. JPEG编码 前言 我们所要实现的照相机&#xff0c;支持BMP图片格式的照片和JPEG图片格式的照片。 1. BMP编码 BMP文件是由文件头、位图信息头、颜色信息和图形数据四部分构成。 1. BMP文件头&#xff08;14个字节&#xff09;&#xff1a;BMP文件…