Linux C代码获取天气情况
現在項目中有需要顯示所在位置天氣狀況的需求,網上查了下,很多都是首先借助某些網站,獲取自身ip所在的城市,然后再借助天氣網站提供的api接口,提供城市編碼然后獲取天氣狀況。但是這種方法,ip網站往往不可靠,ip網站崩掉或者更換網址之后就沒法用了。
后來查到一種方法, 那就是使用curl wttr.in方法獲取天氣。該方法原理和上面應該是類似的,不過不用自己操心ip和天氣接口的事,只要去請求就行,網站會返回你想要的結果(具體使用什么網站獲得天氣信息不很清楚)。當然了,這個網站崩掉也會有問題…(😓),還有就是天氣精度也不確定。
curl wttr.in方法支持的功能很多,他支持自動獲取地址所在地天氣狀況,也支持請求特定城市所在地天氣狀況;獲得天氣信息方面,可以獲得溫度,濕度,天氣整體狀況(陰晴等),所在位置等等,還支持可視化顯示,支持json格式,支持命令行,總之,功能很強大。
某位博主寫的介紹:linux命令行獲取天氣
項目github地址: wttr.in
回到正題,在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接口的鏈接)。
心知天氣獲取天氣
總結
以上是生活随笔為你收集整理的Linux C代码获取天气情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaWeb的框架介绍
- 下一篇: 如何解决Mac使用向日葵(sunlogi