Home >  > 和风天气api

和风天气api

0

一、接口介绍:

1、API地址:

付费用户:https://api.heweather.com/v5/
免费用户:https://free-api.heweather.com/v5/

2、请求示例:
https://free-api.heweather.com/v5/weather?city=CN101010100&key=你的key
和风天气支持多语言,可以使用lang参数在调用数据时设定需要的语言。比如:
https://free-api.heweather.com/v5/weather?city=CN101010100&key=你的key&lang=en

默认国内城市采用简体中文,海外城市采用英文,默认状态不用添加lang参数。

3、数据返回实例:

{
"HeWeather5": [
    {
        "aqi": {
            "city": {
                "aqi": "150",
                "co": "2",
                "no2": "76",
                "o3": "50",
                "pm10": "143",
                "pm25": "115",
                "qlty": "轻度污染",
                "so2": "50"
            }
        },
        "basic": {
            "city": "北京",
            "cnty": "中国",
            "id": "CN101010100",
            "lat": "39.904000",
            "lon": "116.391000",
            "update": {
                "loc": "2016-03-12 17:50",
                "utc": "2016-03-12 09:50"
            }
        },
        "daily_forecast": [
            {
                "astro": {
                    "sr": "06:30",
                    "ss": "18:18"
                },
                "cond": {
                    "code_d": "101",
                    "code_n": "100",
                    "txt_d": "多云",
                    "txt_n": "晴"
                },
                "date": "2016-03-09",
                "hum": "9",
                "pcpn": "0.0",
                "pop": "0",
                "pres": "1034",
                "tmp": {
                    "max": "9",
                    "min": "2"
                },
                "vis": "10",
                "wind": {
                    "deg": "320",
                    "dir": "无持续风向",
                    "sc": "微风",
                    "spd": "4"
                }
            },
            {
                "astro": {
                    "sr": "06:28",
                    "ss": "18:19"
                },
                "cond": {
                    "code_d": "100",
                    "code_n": "100",
                    "txt_d": "晴",
                    "txt_n": "晴"
                },
                "date": "2016-03-10",
                "hum": "14",
                "pcpn": "0.0",
                "pop": "0",
                "pres": "1030",
                "tmp": {
                    "max": "12",
                    "min": "-2"
                },
                "vis": "10",
                "wind": {
                    "deg": "309",
                    "dir": "北风",
                    "sc": "3-4",
                    "spd": "10"
                }
            },
            {
                "astro": {
                    "sr": "06:26",
                    "ss": "18:20"
                },
                "cond": {
                    "code_d": "100",
                    "code_n": "101",
                    "txt_d": "晴",
                    "txt_n": "多云"
                },
                "date": "2016-03-11",
                "hum": "12",
                "pcpn": "0.0",
                "pop": "0",
                "pres": "1023",
                "tmp": {
                    "max": "15",
                    "min": "4"
                },
                "vis": "10",
                "wind": {
                    "deg": "201",
                    "dir": "无持续风向",
                    "sc": "微风",
                    "spd": "3"
                }
            },
            {
                "astro": {
                    "sr": "06:25",
                    "ss": "18:21"
                },
                "cond": {
                    "code_d": "101",
                    "code_n": "101",
                    "txt_d": "多云",
                    "txt_n": "多云"
                },
                "date": "2016-03-12",
                "hum": "20",
                "pcpn": "0.0",
                "pop": "0",
                "pres": "1015",
                "tmp": {
                    "max": "15",
                    "min": "4"
                },
                "vis": "10",
                "wind": {
                    "deg": "101",
                    "dir": "无持续风向",
                    "sc": "微风",
                    "spd": "6"
                }
            },
            {
                "astro": {
                    "sr": "06:23",
                    "ss": "18:22"
                },
                "cond": {
                    "code_d": "101",
                    "code_n": "101",
                    "txt_d": "多云",
                    "txt_n": "多云"
                },
                "date": "2016-03-13",
                "hum": "12",
                "pcpn": "0.0",
                "pop": "0",
                "pres": "1023",
                "tmp": {
                    "max": "17",
                    "min": "6"
                },
                "vis": "10",
                "wind": {
                    "deg": "338",
                    "dir": "无持续风向",
                    "sc": "微风",
                    "spd": "10"
                }
            },
            {
                "astro": {
                    "sr": "06:22",
                    "ss": "18:23"
                },
                "cond": {
                    "code_d": "101",
                    "code_n": "104",
                    "txt_d": "多云",
                    "txt_n": "阴"
                },
                "date": "2016-03-14",
                "hum": "11",
                "pcpn": "0.0",
                "pop": "0",
                "pres": "1018",
                "tmp": {
                    "max": "18",
                    "min": "6"
                },
                "vis": "10",
                "wind": {
                    "deg": "197",
                    "dir": "无持续风向",
                    "sc": "微风",
                    "spd": "3"
                }
            },
            {
                "astro": {
                    "sr": "06:20",
                    "ss": "18:24"
                },
                "cond": {
                    "code_d": "104",
                    "code_n": "100",
                    "txt_d": "阴",
                    "txt_n": "晴"
                },
                "date": "2016-03-15",
                "hum": "12",
                "pcpn": "0.0",
                "pop": "0",
                "pres": "1016",
                "tmp": {
                    "max": "18",
                    "min": "6"
                },
                "vis": "10",
                "wind": {
                    "deg": "125",
                    "dir": "无持续风向",
                    "sc": "微风",
                    "spd": "2"
                }
            }
        ],
        "hourly_forecast": [
            {
                "date": "2016-03-12 01:00",
                "hum": "24",
                "pop": "0",
                "pres": "1021",
                "tmp": "1",
                "wind": {
                    "deg": "170",
                    "dir": "南风",
                    "sc": "微风",
                    "spd": "8"
                }
            },
            {
                "date": "2016-03-12 04:00",
                "hum": "32",
                "pop": "0",
                "pres": "1020",
                "tmp": "1",
                "wind": {
                    "deg": "119",
                    "dir": "东南风",
                    "sc": "微风",
                    "spd": "6"
                }
            },
            {
                "date": "2016-03-12 07:00",
                "hum": "37",
                "pop": "0",
                "pres": "1019",
                "tmp": "1",
                "wind": {
                    "deg": "67",
                    "dir": "东北风",
                    "sc": "微风",
                    "spd": "7"
                }
            },
            {
                "date": "2016-03-12 10:00",
                "hum": "30",
                "pop": "0",
                "pres": "1018",
                "tmp": "4",
                "wind": {
                    "deg": "66",
                    "dir": "东北风",
                    "sc": "微风",
                    "spd": "8"
                }
            },
            {
                "date": "2016-03-12 13:00",
                "hum": "22",
                "pop": "0",
                "pres": "1016",
                "tmp": "9",
                "wind": {
                    "deg": "91",
                    "dir": "东风",
                    "sc": "微风",
                    "spd": "6"
                }
            },
            {
                "date": "2016-03-12 16:00",
                "hum": "19",
                "pop": "0",
                "pres": "1015",
                "tmp": "11",
                "wind": {
                    "deg": "118",
                    "dir": "东南风",
                    "sc": "微风",
                    "spd": "6"
                }
            },
            {
                "date": "2016-03-12 19:00",
                "hum": "24",
                "pop": "0",
                "pres": "1016",
                "tmp": "9",
                "wind": {
                    "deg": "214",
                    "dir": "西南风",
                    "sc": "微风",
                    "spd": "4"
                }
            },
            {
                "date": "2016-03-12 22:00",
                "hum": "22",
                "pop": "0",
                "pres": "1018",
                "tmp": "6",
                "wind": {
                    "deg": "303",
                    "dir": "西北风",
                    "sc": "微风",
                    "spd": "12"
                }
            }
        ],
        "now": {
            "cond": {
                "code": "101",
                "txt": "多云"
            },
            "fl": "-8",
            "hum": "32",
            "pcpn": "0",
            "pres": "1035",
            "tmp": "9",
            "vis": "10",
            "wind": {
                "deg": "340",
                "dir": "西南风",
                "sc": "3-4",
                "spd": "10"
            }
        },
        "status": "ok",
        "suggestion": {
            "comf": {
                "brf": "较舒适",
                "txt": "白天天气晴好,早晚会感觉偏凉,午后舒适、宜人。"
            },
            "cw": {
                "brf": "较适宜",
                "txt": "较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。"
            },
            "drsg": {
                "brf": "较冷",
                "txt": "建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。"
            },
            "flu": {
                "brf": "较易发",
                "txt": "天气较凉,较易发生感冒,请适当增加衣服。体质较弱的朋友尤其应该注意防护。"
            },
            "sport": {
                "brf": "较不宜",
                "txt": "天气较好,但考虑天气寒冷,推荐您进行室内运动,户外运动时请注意保暖并做好准备活动。"
            },
            "trav": {
                "brf": "适宜",
                "txt": "天气较好,同时又有微风伴您一路同行。虽会让人感觉有点凉,但仍适宜旅游,可不要错过机会呦!"
            },
            "uv": {
                "brf": "最弱",
                "txt": "属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。"
            }
        }
    }
]
}

4、json数据格式整理

o-JSON
a-HeWeather data service 3.0
o-[0]
o-aqi
o-basic
a-daily_forecast
a-hourly_forecast
o-now
v-status : "ok"
o-suggestion
(注:a代表JsonArray,o代表JsonObject)

源码:

# -*- coding: UTF-8 -*-

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

import urllib2
import json

req = urllib2.Request('https://free-api.heweather.com/v5/weather?city=CN101010100&key=你的key&lang=en')
response = urllib2.urlopen(req)
f = json.loads(response.read())
print 'today weather天气:'
print 'SO2:'+f['HeWeather5'][0]['aqi']['city']['so2']
print '穿衣指数:'+f['HeWeather5'][0]['suggestion']['drsg']['txt']
print '感冒指数:'+f['HeWeather5'][0]['suggestion']['flu']['txt']

备注:开始运行的时候,出现如下的错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 3: ordinal not in range(128)

然后加上了下面三行代码,成功解决问题:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

运行的结果如下:
Snap18209

二、代码二

程序运行结果:

Snap1802

# -*- coding: utf-8 -*-
__author__ = 'yvonne'

import urllib2, json
from datetime import date
from os import path


def get_city_id(cityname, search_type=1):
    ids = ''
    if search_type == 1:  # 查询城市ID
        search = 'allchina'
        fn0 = 'cityID'
    elif search_type == 0:  # 查询景点ID
        fn0 = 'viewID'
        search = 'allattractions'
    else:
        # 代表type值出错
        return -1
    fn = fn0 + str(date.today()) + '.txt'
    try:
        ''''' 
        查询是否存在当天的城市ID列表文件 
        若存在则直接读取文件里的信息 
        不存在则从接口再获取,景点也这么来 
        '''
        if path.exists(fn):
            fp = open(fn, 'r')
            context = fp.read()
            fp.close()
        else:
            fp = open(fn, 'w')
            url_city = 'https://api.heweather.com/x3/citylist?search=' + search + '&key=请输入你的Key'
            req = urllib2.Request(url_city)
            resp = urllib2.urlopen(req)
            context = resp.read()
            # print True
            fp.write(context)
            fp.close()

        city_json = json.loads(context, encoding='utf-8')
        city_info = city_json["city_info"]
        city_name = unicode(cityname, 'utf-8')
        # print city_name
        for index, cities in enumerate(city_info):
            if city_name in cities['city']:
                # 暂时不考虑有多个的情况(因为数据是从前端传入而不是用户手动输入的)
                print cities['city']
                ids = cities['id']
                break
        else:
            # 之后将会返回-1
            print '您输入的城市或景点不存在,请反馈给管理员'
    except IOError, e:
        print e
    else:
        pass
    return ids


def get_city_weather(index, search_type=1):
    if search_type == 1:
        search = 'weather'
    elif search_type == 0:
        search = 'attractions'
    else:
        return -1
    url_weather = 'https://api.heweather.com/x3/' + search + '?cityid=' + index + '&key=请输入你的Key'
    req = urllib2.Request(url_weather)
    resp = urllib2.urlopen(req)
    context = resp.read()
    weather_json = json.loads(context, encoding='utf-8')
    fp = open("test.txt", 'w')
    fp.write(context)
    fp.close()
    if search_type == 1:
        weather = weather_json["HeWeather data service 3.0"][0]['daily_forecast'][0]
    else:
        weather = weather_json
    return weather


if __name__:
    # 测试代码
    city = raw_input('请输入要查询的城市或景点:')
    city_id = get_city_id(city)
    print city_id
    city_weather = get_city_weather(city_id)
    print "最高温度", city_weather['tmp']['max']
    print "最低温度", city_weather['tmp']['min']
    print "日间天气", city_weather['cond']['txt_d']
    print "夜间天气", city_weather['cond']['txt_n']

参考资料:Python天气预报

三、曲线图插件

https://www.highcharts.com/demo/

四、php代码

<?php //此程序为HeWeatherAPI演示使用,仅实现基本的JSON数据读取功能,供入门者PHP接口使用 //演示网站:三九天气在线 http://www.39ol.com/ //演示网站已实现CACHE缓存到本地,根据用户请求进行更新,一次请求格式整理供多个接口使用等功能 //QQ:19472686 header('Content-type:text/html;charset=utf-8'); //区域编号,演示程序默认使用北京 $areaid="CN101010100"; //HeWeatherAPI接口信息,请修改为自己申请的key $key="***"; //[函数]抓取远程网页内容 function curl_file_get_contents($url){ $ch=curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_TIMEOUT,5); curl_setopt($ch,CURLOPT_USERAGENT,_USERAGENT_); curl_setopt($ch,CURLOPT_REFERER,_REFERER_); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //支持HTTPS类型网页 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); $r=curl_exec($ch); curl_close($ch); return $r; } //[函数]将JSON数据转换为数组 function json_to_array($str){ if (is_string($str)) $str=json_decode($str); $arr=array(); foreach($str as $k=>$v){
if (is_object($v) || is_array($v))
$arr[$k]=json_to_array($v);
else
$arr[$k]=$v;
}
return $arr;
}

//使用函数抓取远程网页内容开始
$source=curl_file_get_contents('https://free-api.heweather.com/v5/weather?city='.$areaid.'&key='.$key.'');
//将读取到的网页内容转换为JSON数据
$source_obj=json_decode($source);
//以下三行程序语句在使用中可以依据json.cn等在线解析工具对JSON数据进行具体分析、具体对待
//获取HeWeather5对象
$public_source=$source_obj->HeWeather5;
//使用函数将JSON数据转换为数组
$public_source=json_to_array($public_source);
//取获取的数组第1个值
$public_source=$public_source[0];

//获取返回的数据状态
echo "数据状态:" . $public_source['status'] . "
";

//获取发布时间
echo "更新时间:" . $public_source['basic']['update']['loc'] . "
";

//获取天气预报
//第1天
echo $public_source['daily_forecast'][0]['date'] . ":" . $public_source['daily_forecast'][0]['cond']['code_d'] . "/" . $public_source['daily_forecast'][0]['cond']['txt_d'] . "/" . $public_source['daily_forecast'][0]['cond']['code_n'] . "/" . $public_source['daily_forecast'][0]['cond']['txt_n'] . "/" . $public_source['daily_forecast'][0]['tmp']['min'] . "℃~" . $public_source['daily_forecast'][0]['tmp']['max'] . "℃/" . $public_source['daily_forecast'][0]['wind']['dir'] . "/" . $public_source['daily_forecast'][0]['wind']['sc'] . "
";
//第2天
echo $public_source['daily_forecast'][1]['date'] . ":" . $public_source['daily_forecast'][1]['cond']['code_d'] . "/" . $public_source['daily_forecast'][1]['cond']['txt_d'] . "/" . $public_source['daily_forecast'][1]['cond']['code_n'] . "/" . $public_source['daily_forecast'][1]['cond']['txt_n'] . "/" . $public_source['daily_forecast'][1]['tmp']['min'] . "℃~" . $public_source['daily_forecast'][1]['tmp']['max'] . "℃/" . $public_source['daily_forecast'][1]['wind']['dir'] . "/" . $public_source['daily_forecast'][1]['wind']['sc'] . "
";
//第3天
echo $public_source['daily_forecast'][2]['date'] . ":" . $public_source['daily_forecast'][2]['cond']['code_d'] . "/" . $public_source['daily_forecast'][2]['cond']['txt_d'] . "/" . $public_source['daily_forecast'][2]['cond']['code_n'] . "/" . $public_source['daily_forecast'][2]['cond']['txt_n'] . "/" . $public_source['daily_forecast'][2]['tmp']['min'] . "℃~" . $public_source['daily_forecast'][2]['tmp']['max'] . "℃/" . $public_source['daily_forecast'][2]['wind']['dir'] . "/" . $public_source['daily_forecast'][2]['wind']['sc'] . "
";
?>

演示效果:
Snap18195

暧昧帖

本文暂无标签

发表评论

*

*