之前在B站看见很多人做B站粉丝数显示器,于是便在网上买了一块ESP8266的开发版回来尝试着折腾一个出来,便在网上搜索适合买回来的开发板和0.96 oled显示器的代码,显示部分的主要代码是在 果果小师弟的博客上找到的。然后自己又找了个可以自己配置wifi的代码,就不用把ssid和wifi密码固定在程序代码中。显示代码中获取粉丝api地址数据使用的ArduinoJson V5 但我下载的是 ArduinoJson V6 所以又在网上找了一下V5转V6的教程。终于折腾出一个自己的粉丝显示器来。
刚开始把这些代码根据自己的需求封装、修改后编译写入开发版后 显示都还好好的,过了一段时间 播放数 和 点赞数 就直接变为0了,粉丝数却好好的,刚开始我以为是api地址失效了,用浏览器打开,返回数据却是好好地。于是我试着用python爬虫原理试试,结果返回的数据还是没有播放数 和 点赞数 ,
突然想起最基本的反爬虫的原理就是看有没有headers 里的User-Agent 于是加上试试,结果data里面的数据还是为空。
既然这样还是没有那就把Cookie也写进headers里面试试,结果需要的数据用。
最终修改一下Arduino 获取点赞数与播放数的代码,粉丝显示器又恢复正常显示了。
/*****************************************************
* 函数名称:getViewAndLikes()
* 函数说明:获取B站播放数与获赞数
* 参数说明:String url
******************************************************/
void getViewAndLikes(String url)
{
HTTPClient http;
http.begin(url);
//此处为添加的headers头部信息
http.addHeader("Host","api.bilibili.com");
http.addHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
http.addHeader("Cookie","uuid=26AC9602-A5D1-F969-4400-624480BB578C63515infoc; LIVE_BUVID=AUTO1315855706237674; rpdid=|(um~RJRlRJR0J'ul)ll~|Ykm; sid=jrysbnoe; LIVE_PLAYER_TYPE=1; buvid3=34AC2B60-D8FA-40D5-B305-61F9620DE71B70391infoc; blackside_state=1; CURRENT_FNVAL=80; DedeUserID=323204204; DedeUserID__ckMd5=c800c208c54c0b34; SESSDATA=d43e072f%2C1619105780%2C08740*a1; bili_jct=3b8a090cd61bb676ab44453924ff1c43; CURRENT_QUALITY=64; PVID=1; bp_t_offset_323204204=481222962073341635; bp_video_offset_323204204=484975573783911908");
int httpCode = http.GET();
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
if (httpCode == 200)
{
Serial.println("Get OK");
String json = http.getString();
// ---------- ArduinoJson V5 ----------
// JsonObject &root = jsonBuffer.parseObject(resBuff);
// ---------- ArduinoJson V6 ----------
DeserializationError error=deserializeJson(doc,json);
if (error)
{
Serial.println("parseObject() failed");
return;
}
likes = doc["data"]["likes"];
view = doc["data"]["archive"]["view"];
Serial.println(json);
Serial.print("Likes: ");
Serial.println(likes);
Serial.print("View: ");
Serial.println(view);
}
else
{
Serial.printf("[HTTP] GET... failed, error: %d\n", httpCode);
}
http.end();
}