空气质量
其他 官方文档
通过空气质量数据接口,可获取空气质量相关数据,包括空气质量实况数据
基本说明:
接口地址:https://devapi.qweather.com/v7/air/now
返回格式:json
请求方式:get
请求示例:https://devapi.qweather.com/v7/air/now?key=key
请求参数说明:
名称 类型 必填 说明
location string 必填 需要查询的城市或地区,可输入以下值:1. 城市ID:城市列表2. 经纬度格式:经度,纬度(经度在前纬度在后,英文,分隔,十进制格式,北纬东经为正,南纬西经为负3. 城市名称,支持中英文和汉语拼音4. 城市名称,上级城市 或 省 或 国家,英文,分隔,此方式可以在重名的情况下只获取想要的地区的天气数据5. IP6. 根据请求自动判断,根据用户的请求获取IP,通过 IP 定位并获取城市数据
key string 必填 用户认证key 扫码关注公众号
lang string 选填 多语言,可以不使用该参数,默认为简体中文,海外城市默认为英文
unit string 选填 单位选择,公制(m)或英制(i),默认为公制单位
返回参数说明:
名称 类型 说明
- - -
JSON返回示例:
{
	"HeWeather6": [{
		"basic": {
			"cid": "CN101010100",
			"location": "北京",
			"parent_city": "北京",
			"admin_area": "北京",
			"cnty": "中国",
			"lat": "39.90498734",
			"lon": "116.4052887",
			"tz": "+8.00"
		},
		"update": {
			"loc": "2020-01-08 17:15",
			"utc": "2020-01-08 09:15"
		},
		"status": "ok",
		"air_now_city": {
			"aqi": "21",
			"qlty": "优",
			"main": "-",
			"pm25": "13",
			"pm10": "17",
			"no2": "18",
			"so2": "3",
			"co": "0.4",
			"o3": "65",
			"pub_time": "2020-01-08 16:00"
		},
		"air_now_station": [{
			"air_sta": "万寿西宫",
			"aqi": "30",
			"asid": "CNA1001",
			"co": "0.4",
			"lat": "39.8673",
			"lon": "116.366",
			"main": "-",
			"no2": "32",
			"o3": "48",
			"pm10": "30",
			"pm25": "18",
			"pub_time": "2020-01-08 16:00",
			"qlty": "优",
			"so2": "1"
		}]
	}]
}
服务级错误码参照
错误码 说明
invalid key 无效的key,请检查你的key是否输入以及是否输入有误
invalid key type 你输入的key不适用于当前获取数据的方式,即SDK的KEY不能用于Web API或通过接口直接访问,反之亦然。
invalid param 无效的参数,请检查你传递的参数是否正确、完整
bad bind 错误的绑定,例如绑定的package name、bundle id或IP地址不一致的时候
no data for this location 该城市/地区没有你所请求的数据
no more requests 超过访问次数,需要等到当月最后一天24点(免费用户为当天24点)后进行访问次数的重置或升级你的访问量
no balance 没有余额,你的按量计费产品由于余额不足或欠费而不能访问,请尽快充值
too fast 超过限定的QPM,请参考QPM说明
dead 无响应或超时
unknown location 没有你查询的这个地区,或者地区名称错误
permission denied 无访问权限,你没有购买你所访问的这部分服务
sign error 签名错误,请参考签名算法
完整教学代码示例
<?php

/**
 * Created by PhpStorm.
 * User: FZS
 * Time: 2020/01/06 22:16
 */
//----------------------------------
// 空气质量 调用类
//----------------------------------
class freeApi{
    private $apiUrl;
    private $appKey;

    public function __construct($appKey){
        $this->appKey = $appKey;
        $this->apiUrl = 'https://free-api.heweather.net/s6/air/now';
    }
    /**
     * 获取结果
     * @return array
     */
    public function getResult(){
        $paras = [
            'key' => $this->appKey,
            'location' => 'beijing',
        ];
        return $this->freeApiCurl($this->apiUrl,$paras);
    }
    /**
     * 请求接口返回内容
     * @param  string $url [请求的URL地址]
     * @param  string $params [请求的参数]
     * @param  int $ipost [是否采用POST形式]
     * @return  string
     */
    public function freeApiCurl($url,$params=false){
        $headers = array('Content-Type: application/x-www-form-urlencoded');
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
        curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params)); // Post提交的数据包
        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
        curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        $result = curl_exec($curl); // 执行操作
        if (curl_errno($curl)) {
            echo 'Errno'.curl_error($curl);//捕抓异常
        }
        curl_close($curl); // 关闭CURL会话
        return $result;
    }
}
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

const (
	APIURL   = "https://free-api.heweather.net/s6/air/now"
	APIKEY = "your key"
)

func main() {
	queryUrl := fmt.Sprintf("%s?key=%s&location=beijing",APIURL,APIKEY)
	resp, err := http.Get(queryUrl)
	if err != nil {
		log.Println(err)
		return
	}

	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)

	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(string(body))
}