本文共 2603 字,大约阅读时间需要 8 分钟。
现在项目中有需要显示所在位置天气状况的需求,网上查了下,很多都是首先借助某些网站,获取自身ip所在的城市,然后再借助天气网站提供的api接口,提供城市编码然后获取天气状况。但是这种方法,ip网站往往不可靠,ip网站崩掉或者更换网址之后就没法用了。
后来查到一种方法, 那就是使用curl wttr.in方法获取天气。该方法原理和上面应该是类似的,不过不用自己操心ip和天气接口的事,只要去请求就行,网站会返回你想要的结果(具体使用什么网站获得天气信息不很清楚)。当然了,这个网站崩掉也会有问题…(😓),还有就是天气精度也不确定。
curl wttr.in方法支持的功能很多,他支持自动获取地址所在地天气状况,也支持请求特定城市所在地天气状况;获得天气信息方面,可以获得温度,湿度,天气整体状况(阴晴等),所在位置等等,还支持可视化显示,支持json格式,支持命令行,总之,功能很强大。
某位博主写的介绍:
项目github地址:回到正题,在C中要使用该方法的话,需要借助libcurl库,然后去发送请求,通过请求的回调函数,获得天气结果,然后根据需要,自己去解析结果即可。
直接上代码:
// 解析天气数据 这里解析函数写的比较low就不贴了,最好用正则表达式匹配,这块技能暂时不掌握void ParseWeatherInnfo(char* wInfo){ printf("weather info %s,strlen is %d.\n",wInfo,strlen(wInfo));}// 接收数据回调函数static size_t receive_data(void *data, size_t size, size_t nmemb, void *writer){ char* test = (char* )writer; // printf("test is %s.\n",test); printf("data is %s.\n",(char *)data); memset(weatherInfo,0x0,sizeof(128)); strncpy(weatherInfo,(char *)data,strlen((char *)data)); ParseWeatherInnfo(weatherInfo); return size*nmemb; }// 获取天气数据void getWeatherInfo(){ char tt[64] = "12345"; int ret; CURL *curlhandle = NULL; curlhandle = curl_easy_init(); if (NULL == curlhandle) { printf("[curl test]: curl_easy_init failed.\n"); goto ERROR_RESULT; } // 这里用*号分隔,是为了方便后面解析数据 // ret = curl_easy_setopt(curlhandle, CURLOPT_URL, "http://wttr.in?format=%C*%l*%t"); // 这三个参数分别是天气整体描述(晴雨阴天等) 地理位置和温度,并且是自动根据IP地址获取天气情况。还可以设置显示语言 ret = curl_easy_setopt(curlhandle, CURLOPT_URL, "http://wttr.in/Beijing?format=%C*%l*%t"); //这里是获取固定城市的天气 if (ret != CURLE_OK) { printf("[curl test]: set curl url failed.\n"); goto ERROR_RESULT; } curl_easy_setopt(curlhandle, CURLOPT_SSL_VERIFYPEER, false); // 不验证数字证书 ret = curl_easy_setopt(curlhandle, CURLOPT_WRITEDATA, tt); // 这里是CURLOPT_WRITEFUNCTION的第四个参数 ret = curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, receive_data); // 回调函数 if (ret != CURLE_OK) { printf("[curl test]: write curl data failed.\n"); goto ERROR_RESULT; } ret = curl_easy_perform(curlhandle); if (ret != CURLE_OK) { printf("curl_easy_perform error---ret is %d.\n",ret); goto ERROR_RESULT; } curl_easy_cleanup(curlhandle); curl_global_cleanup(); return; ERROR_RESULT: curl_easy_cleanup(curlhandle); curl_global_cleanup(); return; }
上面代码receive_data()函数中请求的返回结果是 data is Sunny*Beijing*+27°C.
,然后用自己写的解析函数解出其中的Sunny Beijing 27°C 就可以自行使用了。
后来又发现一个通过心知天气网站获取天气的方法,可以看博主文章,这里也可以获取固定城市,也可以自动获取ip所在城市天气。
经过测试,用libcurl也可以获取(就是把上面链接更换成api接口的链接)。转载地址:http://xmddi.baihongyu.com/