一言地址:https://hitokoto.cn/
简单来说,一言指的就是一句话,可以是动漫中的台词,也可以是网络上的各种小段子。 或是感动,或是开心,有或是单纯的回忆。来到这里,留下你所喜欢的那一句句话,与大家分享,这就是一言存在的目的。
感觉通过esp32获取一言并没有什么意义,纯属是我个人兴趣。
效果如下:
一言提供了api,我们只需请求api地址就能获取到数据,一言可以返回返回格式化后的 JSON 文本,也可以返回纯洁文本,如果使用JSON 格式我们需要对其进行解析。具体格式看官网介绍。
WiFi配置部分这里不说明,以下是http和json部分程序。
首先我们需要添加两个头文件:
#include <HTTPClient.h>
#include <ArduinoJson.h>
定义两个数组存放一言的内容和出处:
//一言
typedef struct {
char hitokoto[1024];//一言正文。编码方式 unicode。使用 utf-8。
char from[60];//一言的出处
} HitokotoData_t;
HitokotoData_t Hitokoto;
访问一言api地址,解析获取返回的json内容,并复制到前面建的数组中:
void get_Hitokoto(void)
{
HTTPClient http;
http.begin("https://v1.hitokoto.cn/");//Specify the URL
int httpCode = http.GET(); //Make the request
if (httpCode > 0) { //Check for the returning code
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(payload);
if (!root.success()) {
Serial.println("JSON parsing failed!");
} else {
if (strlen(root["hitokoto"]) > sizeof(Hitokoto.hitokoto)) {
http.end();
return;
}
strcpy(Hitokoto.hitokoto, root["hitokoto"]);
strcpy(Hitokoto.from, root["from"]);
}
}
else {
Serial.println("Error on HTTP request");
}
http.end(); //Free the resources
Serial.println(Hitokoto.hitokoto);
Serial.printf("出处:");
Serial.println(Hitokoto.from);
}
这是获取到的json格式内容:
这是解析出来我们需要的内容:
使用strcpy
复制内容时需要注意防止内存溢出,由于一言的作者(from_who)
可能为空,如果获取这个内容,需要先判断内容是否为空,否则会导致因语法错误mcu复位。