对接天气的api很多都有次数限制,或者需要去申请一些appcode才能访问,有没有一些比较简单的方式来获取实时天气呢?基于此,本人整理了此篇博客。
一、天气对接。
中国天气网
1、 http://m.weather.com.cn/data/101110101.html 已失效
2、 http://www.weather.com.cn/data/sk/101010100.html 有数据,乱码,不全,没有生活指数,没有天气图标
{
"weatherinfo": {
"city": "北京",
"cityid": "101010100",
"temp": "22",
"WD": "北风",
"WS": "2级",
"SD": "19%",
"WSE": "2",
"time": "16:05",
"isRadar": "1",
"Radar": "JC_RADAR_AZ9010_JB"
}
}
3、 http://www.weather.com.cn/data/cityinfo/101010100.html 有数据,乱码,不全,没有生活指数,没有天气图标
{
"weatherinfo": {
"city": "北京",
"cityid": "101010100",
"temp1": "24℃",
"temp2": "11℃",
"weather": "雷阵雨转多云",
"img1": "d4.gif",
"img2": "n1.gif",
"ptime": "11:00"
}
}
4、 http://www.weather.com.cn/data/zs/101010100.html 有数据,乱码,信息比较全
中华万年历:
5、 http://wthrcdn.etouch.cn/weather_mini?city=北京 通过城市名字获得天气数据,json数据
6、 http://wthrcdn.etouch.cn/weather_mini?citykey=101010100 通过城市id获得天气数据,json数据
7、 http://wthrcdn.etouch.cn/WeatherApi?citykey=101010100 通过城市id获得天气数据,xml文件数据,当错误时会有<error>节点
8、 http://wthrcdn.etouch.cn/WeatherApi?city=北京 通过城市名字获得天气数据,xml文件数据
Github
9、 https://github.com/jokermonn/-Api/blob/master/CenterWeather.md 获取中国天气预报,但获取的不是实时的数据
10、 http://api.k780.com:88/?app=weather.history&weaid=hefei&date=2018-06-22&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json 获取实时天气
11、 http://api.k780.com:88/?app=weather.future&weaid=1&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json 获取未来几天
中央天气预报:
12、 http://weather.51wnl.com/weatherinfo/GetMoreWeather?cityCode=101040100&weatherType=0 已失效
13、 http://weather.51wnl.com/weatherinfo/GetMoreWeather?cityCode=101040100&weatherType=1 已失效
收费_聚合数据
14、 天气预报:https://www.juhe.cn/docs/api/id/73
15、 全国天气预报:https://www.juhe.cn/docs/api/id/39
其他:
16、小米:http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityId=101121301 有数据、乱码
17、新浪天气预报API:http://php.weather.sina.com.cn/xml.php?city=%B1%B1%BE%A9&password=DJOYnieT8234jlsK&day=0 已失效
友情链接:
1、天气API接口大全(nohacks.cn 收集整理):http://www.nohacks.cn/post-35.html
2、网上的天气 API 哪一个更加可靠?:https://www.zhihu.com/question/20575288
3、免费的天气接口(满足你的大部分需求):http://blog.csdn.net/wanghao940101/article/details/72123184
4、真正的中国天气api接口xml,json(求加精) ...:http://blog.csdn.net/fancylovejava/article/details/26102635
5、免费的天气接口(满足你的大部分需求):http://blog.csdn.net/wanghao940101/article/details/72123184
6、通过城市名(北京/北京市)获取当前城市当前温度及未来一周天气预报 (Json数据) :包含台湾的主要县市接口:
http://wthrcdn.etouch.cn/weather_mini?city=北京市;
https://www.sojson.com/open/api/weather/json.shtml?city=北京
https://www.sojson.com/open/api/weather/xml.shtml?city=北京
7、http://i.tianqi.com/index.php?c=code&id=12&icon=1&py=hefei&num=5
二、运用
我采用的是中华万年历的api,( http://wthrcdn.etouch.cn/WeatherApi?city=北京 通过城市名字获得天气数据,xml文件数据),此api调用的底层也是中国天气网的数据,跟百度上直接搜索的天气保持一致,此api的缺点是返回的xml数据没有天气的图标,需要自己做一些匹配,这个也比较简单。
demo:
$(document).ready(function () {
var city = getQueryString("city");
var params = new Object();
params.city=city;
sendData("http://wthrcdn.etouch.cn/WeatherApi", params, function(data){
var str=XML2String(data);
//创建文档对象
var parser=new DOMParser();
var xmlDoc=parser.parseFromString(str,"text/xml");
//城市
var city = xmlDoc.getElementsByTagName('city');
$("#city").html(city[0].textContent)
var fengli = xmlDoc.getElementsByTagName('fengli');
var shidu = xmlDoc.getElementsByTagName('shidu');
$("#fengli").html("风力"+fengli[1].textContent+" 湿度"+shidu[0].textContent);
//高温
var high = xmlDoc.getElementsByTagName('high');
//低温
var low = xmlDoc.getElementsByTagName('low');
//天气
var type = xmlDoc.getElementsByTagName('type');
$("#tianqi").html(type[0].textContent)
});
})
2、Java获取天气
思路:调用接口获取数据,简历实体类,将获取的xml数据转换成实体类,需要一些jar包的支持
package com.cn;
/**
* 天气实体类
* @author yunjuanyunshuxue
*
*/
public class WeatherInfo {
private String date;//时间
private String cityname;//城市名
private String weather;//天气
private String temperature;//气温
private String airquality;//pm2.5
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getCityname() {
return cityname;
}
public void setCityname(String cityname) {
this.cityname = cityname;
}
public String getWeather() {
return weather;
}
public void setWeather(String weather) {
this.weather = weather;
}
public String getTemperature() {
return temperature;
}
public void setTemperature(String temperature) {
this.temperature = temperature;
}
public String getAirquality() {
return airquality;
}
public void setAirquality(String airquality) {
this.airquality = airquality;
}
@Override
public String toString() {
return "WeatherInfo [date=" + date + ", cityname=" + cityname
+ ", weather=" + weather + ", temperature=" + temperature
+ ", airquality=" + airquality + "]";
}
}
package com.cn;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.zip.GZIPInputStream;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.junit.Test;
/**
* 通过get请求向网站http://wthrcdn.etouch.cn/weather_mini获取某个 城市的天气状况数据,数据格式是Json
*
* @author yunjuanyunshuxue
*
*/
public class WeatherUtils {
/**
* 通过城市名称获取该城市的天气信息
*
* @param cityName
* @return
*/
public static String GetWeatherData(String cityname) {
StringBuilder sb=new StringBuilder();
try {
String weather_url = "http://wthrcdn.etouch.cn/weather_mini?city="+cityname;
URL url = new URL(weather_url);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
GZIPInputStream gzin = new GZIPInputStream(is);
InputStreamReader isr = new InputStreamReader(gzin, "utf-8"); // 设置读取流的编码格式,自定义编码
BufferedReader reader = new BufferedReader(isr);
String line = null;
while((line=reader.readLine())!=null)
sb.append(line+" ");
reader.close();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println(sb.toString());
return sb.toString();
}
/**
* 将JSON格式数据进行解析 ,返回一个weather对象
* @param str
* @return
*/
public static WeatherInfo GetWeather(String weatherInfobyJson){
JSONObject dataOfJson = JSONObject.fromObject(weatherInfobyJson);
if(dataOfJson.getInt("status")!=1000)
return null;
//创建WeatherInfo对象,提取所需的天气信息
WeatherInfo weatherInfo = new WeatherInfo();
//从json数据中提取数据
String data = dataOfJson.getString("data");
dataOfJson = JSONObject.fromObject(data);
weatherInfo.setCityname(dataOfJson.getString("city"));;
weatherInfo.setAirquality(dataOfJson.getString("aqi"));
//获取预测的天气预报信息
JSONArray forecast = dataOfJson.getJSONArray("forecast");
//取得当天的
JSONObject result=forecast.getJSONObject(0);
weatherInfo.setDate(result.getString("date"));
String high = result.getString("high").substring(2);
String low = result.getString("low").substring(2);
weatherInfo.setTemperature(low+"~"+high);
weatherInfo.setWeather(result.getString("type"));
return weatherInfo;
}
}
package com.cn;
public class Test {
public static void main(String[] args){
String info = WeatherUtils.GetWeatherData("北京");
WeatherInfo weatherinfo = WeatherUtils.GetWeather(info);
System.out.println(weatherinfo.toString());
}
}
来源:oschina
链接:https://my.oschina.net/u/4339254/blog/3924666