最近在做一个天气预报app,看见国家气象局有api接口提供,但是需要申请,网址 http://smart.weather.com.cn/wzfw/smart/weatherapi.shtml,
审核大概需要一周左右,审核通过后,你会收到一封邮件
您好: 欢迎使用SmartWeatherAPI测试接口 恭喜您的申请已通过审核,以下是为您分配的鉴权信息: appid:XXXXXXXXXXXXXXXX private_key:XXXXXXXXXXXXXXXX 接口使用说明请参考《SmartWeatherAPI_Lite_WebAPI 版产品使用说明书》,区域列表:请见附件areaid_list.xlsx。 该鉴权信息仅限您个人或本公司使用,如有泄露我们将撤销您的使用权限,必要时将追究相关责任。 最后,非常感谢您的参与。
现在你有appid和private_key了,可以开始获取天气了。
1. 接口说明
接口的完整URL: http://open.weather.com.cn/data/?areaid=""&type=""&date=""&appid=""&key=".urlencode($key)
输入参数:
areaid: 区域id,审核通过后邮件中有个附件,提供的就是现有的所有区域的id号。
type: 数据类型(实况: observe, 指数: index, 常规预报: forecast3d)。
date: 客户端日期,按照格式yyyyMMddHHmm获取客户端当前时间。
appid: 固定分配的型号标识,审核通过后邮件告知(传递参数时:截取 appid 的前 6 位; 生成公钥时:取完整的 appid)。
key: 令牌,有公钥(public_key)和私钥(private_key)通过固定算法加密生成。
2. 加密方式
private_key: 审核通过后,邮件中会提供。private_key仅负责与 public_key 共同合成 key 传参,私钥不可见,客户端与服务端各存储一份;
public_key: 不包含key在内的完整URL的其他部分(此处appid为完整appid);
key的算法: 说明书中提供的是php中的算法代码,如下
-
key = base64_encode(hash_hmac(‘sha1‘, $public_key, $private_key, TRUE));
key加密后,通过 urlencode 对其编码后传参。
这是官方的文件,加密方式是这个文章要探讨的重点,官方提供的是php中key的算法,关于IOS下HMAC_SHA1加密算法的网上找了很多也没找到,最后在stackoverflow里找到了,
这里共享一下。加密算法见这篇博文 IOS下HMAC_SHA1加密算法。
获取URL代码如下:
//获取当前时间 NSDate * senddate = [NSDate date]; NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init]; [dateformatter setDateFormat:@"YYYYMMddhhmm"]; NSString * timeStr = [dateformatter stringFromDate:senddate]; //你的appid NSString *appid = @"你的appid"; //你的appid前6位 NSString *shortappid = @"你的appid前6位"; //这里是获取常规预报 type=forecast3d NSString *base = @"http://open.weather.com.cn/data/?areaid=101010100&type=forecast3d&date="; //生成公钥时:取完整的 appid NSString *urlAppid = [NSString stringWithFormat:@"%@%@&appid=%@",base,timeStr,appid]; //传递参数时:截取 appid 的前 6 位 NSString *urlShortAppid = [NSString stringWithFormat:@"%@%@&appid=%@",base,timeStr,shortappid]; //你的private_key NSString *privateKey = @"你的private_key"; //得到了key NSString *key = [self hmacsha1:urlAppid key:privateKey ]; //IOS的URL中文以及符号转码 key = [Utility encodeToPercentEscapeString:key]; //接口的完整URL NSString *endUrl = [NSString stringWithFormat:@"%@&key=%@",urlShortAppid,key];
[self hmacsha1:urlAppid key:privateKey];
+ (NSString *)hmacsha1:(NSString *)text key:(NSString *)secret;
这方法见 : IOS下HMAC_SHA1加密算法。
[Utility encodeToPercentEscapeString:key];+ (NSString *)encodeToPercentEscapeString: (NSString *) input;
这方法见 : IOS的URL中文以及符号转码。 就这样的得到了完整URL http://open.weather.com.cn/data/?areaid=101010100&type=forecast3d&date=201409051055&appid=de76d3&key=S017pH00FeX%2FT658bf3DZPThKtg%3D
3. 返回数据
3.1 常规预报: forecast3d
完整URL http://open.weather.com.cn/data/?areaid=101010100&type=forecast3d&date=201409051055&appid=de76d3&key=S017pH00FeX%2FT658bf3DZPThKtg%3D
输出实例:
{"c":{"c1":"101010100","c2":"beijing","c3":"北京","c4":"beijing","c5":"北京","c6":"beijing","c7":"北京","c8":"china","c9":"中国","c10":"1","c11":"010","c12":"100000","c13":"116.407526","c14":"39.904030","c15":"33","c16":"AZ9010","c17":"+8"},"f":{"f1":[{"fa":"00","fb":"01","fc":"30","fd":"18","fe":"0","ff":"0","fg":"0","fh":"0","fi":"05:45|18:40"},{"fa":"01","fb":"02","fc":"29","fd":"19","fe":"0","ff":"0","fg":"0","fh":"0","fi":"05:46|18:38"},{"fa":"02","fb":"00","fc":"29","fd":"20","fe":"0","ff":"0","fg":"0","fh":"0","fi":"05:47|18:37"}],"f0":"201409050800"}}
3.2 实况: observe
完整URL http://open.weather.com.cn/data/?areaid=101010100&type=observe&date=201409051101&appid=de76d3&key=Z10wEjVXiTiZKEslx5WJGXV4B%2F4%3D
输出实例:
{"l":{"l1":"25","l2":"57","l3":"1","l4":"2","l7":"10:50"}}
3.3 指数: index
完整URL http://open.weather.com.cn/data/?areaid=101010100&type=observe&date=201409051101&appid=de76d3&key=Z10wEjVXiTiZKEslx5WJGXV4B%2F4%3D
输出实例:
{"i":[{"i1":"ct","i2":"穿衣指数","i3":"","i4":"热","i5":"天气热,建议着短裙、短裤、短薄外套、T恤等夏季服装。"},{"i1":"zs","i2":"中暑指数","i3":"","i4":"无","i5":"温度不高,其他各项气象条件适宜,中暑机率极低。","i6":"无","i7":"温度不高,其他各项气象条件适宜,中暑机率极低。","i8":"无","i9":"温度不高,其他各项气象条件适宜,中暑机率极低。","i10":""}]}
ps:除了国家气象局的天气api接口,还有百度的天气api挺好用的,假如嫌这个api接口麻烦的话,就用百度的吧,直接申请一个key就可以了,不要加密什么的,而且一申请就可以用了,气象局的要审核一周左右,废话少说,上链接。
百度ak申请地址:http://lbsyun.baidu.com/apiconsole/key接口说明:http://developer.baidu.com/map/carapi-7.htm