ESP32获取B站粉丝数
声明
个人学习笔记,仅做参考,能力有限,如有错误请不吝赐教
参考资料
- https://zhuanlan.zhihu.com/p/115986084
- 官方例程examples\protocols\http_request
环境
idf+vscode+wsl
硬件
WROOM-32D
原理
用户的粉丝数据在固定的链接加用户ID,如下所示
api.bilibili.com/x/web-interface/card?mid= + B站用户uid
我的UID是285794647,地址为
api.bilibili.com/x/web-interface/card?mid=285794647
直接在浏览器里面输入就可以得到数据
这个数据是JSON格式的,可以找一个在线JSON格式化的网站格式化一下,就看起来很清楚了
里面的fans就是粉丝数量
步骤
- 从B站获取数据,调用http api,或者用tcp模拟http请求
- 从数据中获取粉丝数,调用json解析库或者直接匹配字符串
实现
esp idf 有现成的http request示例examples\protocols\http_request
1.配置连接的wifi
2.修改请求地址
3.获取数据
unsigned char get_fans_from_rx_data(char data,unsigned int * p_fans)
{
unsigned char ret=false;
static unsigned char sta=0;
static unsigned int temp_fans=0;
switch (sta)
{
case 0:
if(data=='f')
{
sta++;
}
break;
case 1:
if(data=='a')
{
sta++;
}
else if(data!='f')
{
sta=0;
}
break;
case 2:
if(data=='n')
{
sta++;
}
else
{
sta=0;
}
break;
case 3:
if(data=='s')
{
sta++;
}
else
{
sta=0;
}
break;
case 4:
if(data=='\"')
{
sta++;
}
else
{
sta=0;
}
break;
case 5:
if(data==':')
{
sta++;
temp_fans=0;
}
else
{
sta=0;
}
break;
default:
if (data>='0'&&data<='9')
{
temp_fans*=10;
temp_fans+=data-'0';
}
else
{
sta=0;
ret=true;
*p_fans=temp_fans;
}
break;
}
return ret;
}
踩坑记录
一开始使用完例程后,处于假死状态,我在关键的地方加上日志,发现调用example_connect()后就没有反会
这个函数是在examples\common_components\protocol_examples_common\connect.c中
实际调试的时候发现,等了一个信号量后等不到了
这个值初始化的时候为1
但是我看默认是使能了IPV6,所以这个值是2
但是,路由器不知为什么获取不到ipv6,所以就一直在等待获取,造成假死
解决
1.用手机开热点,正常
2.关闭IPV6,连接路由器,正常