博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux C代码获取天气情况
阅读量:4035 次
发布时间:2019-05-24

本文共 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/

你可能感兴趣的文章
pyQt不同窗体间的值传递(一)——对话框关闭时返回值给主窗口
查看>>
linux mint下使用外部SMTP(如网易yeah.net)发邮件
查看>>
北京联通华为光猫HG8346R破解改桥接
查看>>
python使用win32*模块模拟人工操作——城通网盘下载器(一)
查看>>
python append 与浅拷贝
查看>>
Matlab与CUDA C的混合编程配置出现的问题及解决方案
查看>>
python自动化工具之pywinauto(零)
查看>>
python一句话之利用文件对话框获取文件路径
查看>>
PaperDownloader——文献命名6起来
查看>>
PaperDownloader 1.5.1——更加人性化的文献下载命名解决方案
查看>>
如何将PaperDownloader下载的文献存放到任意位置
查看>>
C/C++中关于动态生成一维数组和二维数组的学习
查看>>
JVM最简生存指南
查看>>
漂亮的代码,糟糕的行为——解决Java运行时的内存问题
查看>>
Java的对象驻留
查看>>
logback高级特性使用(二) 自定义Pattern模板
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
可扩展、高可用服务网络设计方案
查看>>
如何构建高扩展性网站
查看>>
微服务架构的设计模式
查看>>